1). 简介
FreeRTOS是广泛运用的开源实时操作体系, 被许多芯片厂商包含NXP所支撑, 本文就展现在NXP iMX7 ARM处理器上面的M4中心上面布置FreeRTOS.
NXP iMX7 ARM处理器是NXP最新推出的异构双核处理器, 主中心为单核或许双核Cortex-A7,一般运转Linux/WinCE操作体系来作为嵌入式运用主程序界面环境; 副中心为Cortex-M4, 一般运转实时操作体系来为嵌入式运用供给高效牢靠的实时运用处理. 一个简略的iMX7芯片框图如下所示.
由上图可见, 多种类型的内存可供运用, 包含M4专属的内存空间 (Tightly Coupled Memory, TCM), 尽管很小可是CPU能够无推迟拜访; 多个OCRAM区域 (On-Chip RAM, 一般是SRAM), 相同拜访十分快并且供给相对大的容量; 最终便是DRR3主内存空间. 出于功能考虑, 请尽可能优先运用片内内存资源.
别的, M4有两个总线衔接到AXI/AHB interconnect, 一个担任数据传输,另一个担任指令传输, 因而为了最好的功能优化, 咱们需求将数据放置与衔接数据总线的区域,而指令代码放置与衔接指令总线的区域. 例如, 关于TCM,则放置代码于TCML空间, 而放置数据于TCMU空间.
然后关于Resource Domain Controller (RDC), 关于iMX7,因为Cortex-A7和Cortex-M4中心内存和外设的拜访都是同享且相等的,为了确保不发生资源抵触,经过这个操控器来从硬件层面临指定内存和外设的拜访权限进行维护. RDC 答应界说最多4个resource domains, 并将不同的内存和外设资源指定到这些resource domain中. 默许情况下, A7中心和相关外设被指定于domain 0, 当FreeRTOS firmware运转后, M4中心以及相关外设开始也是domain 0, 但立刻被从头指定到domain 1. 因而假如一个外设需求被M4运用, 但一起A7 Linux kernel也运用了, 就需求修正A7 Linux Device Tree来制止这个外设 (具体操作办法请见这儿).
本文就根据Toradex Colibri iMX7 (根据NXP iMX7 SoC) ARM计算机模块调配Colibri Eva Board开发板来演示编译和布置FreeRTOS运用. 差异与传统的MCU处理器, firmware一般从内置的NOR Flash加载, Colibri iMX7则并没有这样的装备, 而是将firmware存放于外部存储设备中如SD卡或许模块上的Nand Flash, 一起这些存储并不是“memory mapped”, 因而CPU无法直接履行存储在这儿的firmware, 而是要先被加载到内存区域后才干被履行.
关于Colibri iMX7, 体系总是由Cortex-A7中心来发动, 先履行内部boot ROM后发动如U-boot这样的boot loader,然后由boot loader从上述的存储设备加载firmware到内存,最终在触发Cortex-M4中心去履行这个firmware. 而假如需求更新或许替换firmware,只需求更改存储设备上面的firmware镜像即可.
2). 预备
a). 硬件预备
./ Colibri iMX7计算机模块和Colibri Eva Board开发板
./ Ubuntu Linux开发主机
b). 软件预备
./ iMX7模块Cortex-A7中心运转Toradex Embedded Linux release V2.6 Beta2
./ Ubuntu Linux开发主机
FreeRTOS source code
穿插编译ToolChain – Linaro ARM Embedded, 4.9 2015-Q3 update – 从这儿下载
3). 装备
a). 下载FreeRTOS for Colibri iMX7
————————
$ git clone -b master-1.0.1 git://git.toradex.com/freertos-toradex.git freertos-colibri-imx7/
$ cd freertos-colibri-imx7/
————————
b). 解压缩穿插编译东西
————————
$ tar xjf gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2
//假如开发主机是Ubuntu 64bit 操作体系,则需求装置下面32bit支撑包
$ sudo dpkg –add-architecture i386
$ sudo apt-get update
$ sudo apt-get install libc6:i386 libncurses5:i386
//测验gcc运转
$ cd …/gcc-arm-none-eabi-4_9-2015q3/bin/
$./arm-none-eabi-gcc –version
//装置 make 和 Cmake 东西
$ sudo apt-get install make cmake
————————
4). 编译FreeRTOS
FreeRTOS 的 examples 目录下供给了许多例程,在编译前需求先设置叉编译东西途径的环境变量ARMGCC_DIR,然后运转armgcc子目录下预备好的编译脚本即可进行编译.
————————
$ export ARMGCC_DIR=…/gcc-arm-none-eabi-4_9-2015q3/
$ cd …/freertos-colibri-imx7/examples/imx7_colibri_m4/demo_apps/hello_world/armgcc
$ ./build_all.sh
————————
编译好的可履行文件坐落armgcc下的release和debug子目录下, 能够加载到M4中心上面运转了.
5). 在M4中心上面运转Firmware
a). M4的固件程序在Colibri iMX7 A7中心Linux体系U-Boot中进行加载, 将编译好的 hello_world.bin程序放到SD卡根目录 (FAT32格局) ,并衔接到开发板上.
————————
Colibri iMX7 # fatload mmc 0:1 0x7F8000 hello_world.bin
…
Colibri iMX7 # dcache flush
Colibri iMX7 # bootaux 0x7F8000
## Starting auxiliary core at 0x007F8000 …
————————
b). FreeRTOS 默许运用 UARTB 作为其调试输出串口, 波特率设置115200 8N1。A7 Linux 默许device tree设置也会拜访UARTB, 为了避免呈现抵触, 推荐在device tree 中禁用 UARTB(设置status参数)。也能够在 U-Boot 中增加下面参数,暂时禁用 UARTB。
————————
Colibri iMX7 # setenv fdt_fixup ‘fdt addr ${fdt_addr_r} && fdt rm /soc/aips-bus@30800000/spba-bus@30800000/serial@30890000’
Colibri iMX7 # s**eenv
————————
c). Linux会主动封闭不运用设备的时钟,但A7中心Linux无法知道哪些时钟在M4中心上面被运用,因而需求增加下面内核参数来确保M4相关时钟正常。
————————
Colibri iMX7 # setenv defargs clk_ignore_unused
————————
d). 经过别的一个窗口衔接UARTB, 能够收到hello world程序运转后的打印输出
————————
$ sudo minicom -D /dev/ttyUSB1 -b 115200
Welcome to minicom 2.7
……
Port /dev/ttyUSB1, 11:52:46
Press CTRL-A Z for help on special keys
Hello World!
————————
e). 主动发动加载 M4 上运转的程序
// 运转下面指令将SD卡上面的程序文件复制到体系为M4程序独自供给的ubi分区空间
————————
Colibri iMX7 # ubi part ubi
…
Colibri iMX7 # fatload mmc 0:1 ${loadaddr} hello_world.bin
…
Colibri iMX7 # ubi write ${loadaddr} m4firmware ${filesize}
————————
// 设置发动变量,之后U-Boot会在开机发动Linux前先发动M4程序
————————
Colibri iMX7 # setenv m4boot ‘ubi read 0x7F8000 m4firmware && dcache flush && bootaux 0x7F8000’
Colibri iMX7 # s**eenv
————————
6). M4 程序示例
除了上面测验的hello world, 在examples目录中还有许多示例程序.
a). GPIO示例
// 例程方位: …/examples/imx7_colibri_m4/driver_examples/gpio_imx/
// 同上述办法编译后生成运用: gpio_imx_example.bin
// 例程中运用EXT_IO1作为按键输入, EXT_IO0作为输出操控LED; 在Colibri 评价板上面, 使用X21将对应Pin脚和组件相连:
————————
EXT_IO0 => X21-LED1
EXT_IO1 => X21-SW6
————————
// 在Uboot运转程序, 因为A7 Linux Device Tree也界说了这几个GPIO, 因而测验只在U-Boot环境下进行.
————————
====================== GPIO Example ========================
=================== GPIO Interrupt =====================
The (EXT_IO1) button is configured to trigger GPIO interrupt
Press the (EXT_IO1) button 3 times to continue.
Button pressed 1 time.
Button pressed 2 time.
Button pressed 3 time.
================= GPIO Functionality==================
The button state is now polled.
Press the button to switch LED on or off
Button pressed 1 times
Button pressed 2 times
…
————————
b). RPMsg示例 – M4和A7通讯
// 例程方位: …/examples/imx7_colibri_m4/demo_apps/rpmsg/str_echo_freertos/
// 同上述办法编译后生成运用: rpmsg_str_echo_freertos_example.bin
// A7 Linux kernel对应module 源文件: drivers/rpmsg/imx_rpmsg_tty.c
// U-Boot履行如下指令
————————
fatload mmc 0:1 0x7F8000 rpmsg_str_echo_freertos_example.bin
reading rpmsg_str_echo_freertos_example.bin
20860 bytes read in 21 ms (969.7 KiB/s)
Colibri iMX7 # dcache flush
Colibri iMX7 # bootaux 0x7F8000
## Starting auxiliary core at 0x007F8000 …
Colibri iMX7 # run ubiboot
————————
// M4 串口输出
————————
RPMSG String Echo FreeRTOS RTOS API Demo…
RPMSG Init as Remote
————————
// A7 Linux下履行下面指令
————————
$ modprobe imx_rpmsg_tty
[ 184.656763] imx_rpmsg_tty rpmsg0: new channel: 0x400 -> 0x0!
[ 184.663331] Install rpmsg tty driver!
$ stty -F /dev/ttyRPMSG -echo
$ exec 3<> /dev/ttyRPMSG
$ echo Test >&3
$ cat <&3
Test
^C
$ exec 3>&-
————————
// M4串口对应输出
————————
RPMSG String Echo FreeRTOS RTOS API Demo…
RPMSG Init as Remote
Name service handshake is done, M4 has setup a rpmsg channel [0 —> 1024]
Get Message From Master Side : "Test" [len : 4]
Get New Line From Master Side
————————
// 如需将Linux kernel module 设置为开机主动加载
————————
$ echo imx_rpmsg_tty > /etc/modules-load.d/rpmsg_tty.conf
————————
// 别的关于RPMsg还有其他如pingpong demo, 能够自行测验.
7). 总结
本文对iMX7 异构双核架构进行了阐明, 并根据Toradex Colibri iMX7 模块演示了在M4中心上面运转FreeRTOS例程以及A7和M4中心经过RPMsg通讯例程, 信任对NXP iMX7架构以及运用有了一个开始的了解, 其十分合适用于一起有人机交互和实时操控的工业运用场景, 一起十分低的功耗也使得整个嵌入式体系的安稳牢靠性有了很好的确保.