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 # saveenv

------------------------

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 # saveenv

------------------------

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架构以及应用有了一个初步的了解, 其非常适合用于同时有人机交互和实时控制的工业应用场景, 同时非常低的功耗也使得整个嵌入式系统的稳定可靠性有了很好的保证.

参考文档

http://developer.toradex.com/knowledge-base/freertos-on-the-cortex-m4-of-a-colibri-imx7

基于NXP iMX7 ARM处理器部署FreeRTOS实时操作系统相关推荐

  1. 基于NXP i.MX8M处理器的MYC-JX8MX核心板-米尔电子

    高性能嵌入式核心板新标杆!米尔推出基于NXP i.MX8M处理器的MYC-JX8MX核心板 随着嵌入式及物联网技术的飞速发展,高性能计算的嵌入式板卡已经成为智能产品的基础硬件平台.为响应行业应用和满足 ...

  2. FreeRTOS实时操作系统(七)时间片调度及RTOS的滴答定时器

    系列文章目录 FreeRTOS实时操作系统(一)RTOS的基本概念 FreeRTOS实时操作系统(二)任务创建与任务删除(HAL库) FreeRTOS实时操作系统(三)任务挂起与恢复 FreeRTOS ...

  3. STM32CubeMX学习笔记(28)——FreeRTOS实时操作系统使用(任务管理)

    一.FreeRTOS简介 FreeRTOS 是一个可裁剪.可剥夺型的多任务内核,而且没有任务数限制.FreeRTOS 提供了实时操作系统所需的所有功能,包括资源管理.同步.任务通信等. FreeRTO ...

  4. NXP iMX7 异构双核心开发调试

    By Toradex秦海 1). 简介 在工业领域,很多时候会遇到实时任务和主控界面同时需要的场景,比如工业自动化的控制器等,通常情况下传统做法是分别使用两个独立的处理器,比如一个Cortex-M4 ...

  5. NXP iMX7 M4 核心 SPI Slave 测试

    By Toradex秦海 1). 简介 在之前的两篇文章中已经介绍过基于NXP iMX7 异构多核架构进行开发调试,以及iMX7 M4核心PWM驱动开发.本文就继续演示基于iMX7 M4 SPI Sl ...

  6. 多核处理器_基于NXP i.MX8MM多核应用处理器设计的智能加油机

    随着近几年信息技术的不断发展,智能化的概念逐渐渗透到各行各业以及我们的生活里,智能化.自助设备随处可见.在人来人往.车来车往的城市建设中,节省时间.免去排队百脸茫然.一脸懵圈的痛苦过程成为智能设备发展 ...

  7. 使用 DS-MDK 开发 NXP iMX7

    1). 简介 NXP  i.MX7 处理器是一款具有 Cortex-A7 和 M4 的异构多核处理器.A7能够运行 Linux 等操作系统,完成GUI.网络.文件管理和算法运算等复杂任务,而 M4 则 ...

  8. 在x86和arm混合部署架构下排查TiKV节点内存占用极高的问题

    作者:何傲 原文来源: https://tidb.net/blog/91cb51aa [是否原创]是 [首发渠道]TiDB 社区 前言 前不久我们在混合部署架构下测试了TiDB 5.0的性能,测试过程 ...

  9. 基于正点原子探索者使用STM32CubeMX+FreeRTOS+LWIP

    开发板是使用正点原子的探索者为例,PHY芯片可以是LAN8720A和IP101GR,因为有两份代码参考,一份是LAN8720A,一份是IP101GR. 首先第一步:我们使用移植好的功能,请参使用STM ...

最新文章

  1. 【 Verilog HDL 】清晰的时序逻辑描述方法之计数器的描述范例
  2. LiveBos---扩展按钮调用方法
  3. pandas 提取某几列_【科学计算工具二】初识Pandas
  4. Codeforces 374A - Inna and Pink Pony
  5. 玩家可以输入辅助指令_最后生还者 第二部辅助功能详解 盲人玩家也能玩
  6. B站2021品牌营销手册
  7. 用Markdown写表格
  8. Keil(MDK-ARM-STM32)系列教程(八)在线调试(Ⅰ)
  9. 合格PHP工程师的知识结构
  10. SLAM学习笔记-------------(五)相机与图像
  11. Echarts 柱状图使用
  12. java基于springboot+vue校园电动自行车管理系统
  13. 2020,好看视频的创作生态棋局
  14. 猿创征文|我命由我,不由天
  15. ArcGIS基础:要素转点、要素折点转点与面转线
  16. Pro/E产品设计之绘制齿轮的步骤
  17. VMware vSphere理论
  18. python安装教程(搬运工)
  19. 学java被“劝退”的第六天
  20. 1个人,100天业余时间,用Flutter开发完一个商业APP,手握5家大厂offer

热门文章

  1. 1115: [POI2009]石子游戏Kam
  2. 飞蛾火焰优化(MFO)算法——原理分析
  3. 手气红包c语言算法,YY一个拼手气的红包算法
  4. 计算机管理里没有guest,w10共享时没有guest怎么设置_w10共享时看不到guest如何恢复...
  5. Python实现80后童年经典游戏:坦克大战
  6. Unity实战之模拟飞碟
  7. matlab 全1矩阵,matlab全为1的矩阵
  8. DM365的H264编码中IDR
  9. 生活随记-四十年流水线
  10. UI设计素材干货,动效的优秀模板