基于NXP Vybrid ARM處理器部署MQX實時操作系統(tǒng)
1). 簡介
MQX是由NXP提供的實時操作系統(tǒng),結(jié)構(gòu)框圖如下圖所示, 包含內(nèi)核,文件系統(tǒng)以及協(xié)議棧, 同時對于NXP的ARM處理器也可以很好的支持,可以很方便的開發(fā)和部署.

本文就基于ToradexColibri VF61 (基于NXP VF61 SoC) ARM計算機模塊搭配ColibriEva Board開發(fā)板來演示編譯和部署MQX應(yīng)用. VF61為異構(gòu)雙核架構(gòu)ARM處理器,包含一個Cortex-A5和一個Cortex-M4,通常應(yīng)用場景為A5核心運行Linux或者WinCE系統(tǒng)作為控制和界面顯示,M4核心運行一個實時操作系統(tǒng)來處理實時任務(wù). 本文所演示的即是在M4核心上面部署運行MQX應(yīng)用.
2). 準備
a). 硬件準備
./ Colibri VF61計算機模塊和ColibriEva Board開發(fā)板
./ Ubuntu Linux開發(fā)主機
b). 軟件準備
./ VF61模塊A5核心運行ToradexEmbedded Linux release V2.5 Beta3
./ Ubuntu Linux開發(fā)主機
./ MQX RTOS 4.1.2 Vybrid - 從這里下載
./ Linaro bare-metal toolchain forCortex-R/M, 4.8 2014-Q1 update - 從這里下載
3). 配置
a). 解壓縮到”/home/username”目錄下
------------------------
$ tar xzf “~/MQX RTOS 4.1.2 for VybridLinux Base.gz.gz”
$ tar xjf ~/gcc-arm-none-eabi-4_8-2014q1-20140314-linux.tar.bz2
------------------------
b). 配置MQX
./ 文件 ”FSLMQXOS_4_1_2_Vybrid/build/common/make/global.mak”
設(shè)置交叉編譯toolchain
------------------------
+ TOOLCHAIN_ROOTDIR =/home/yourname/gcc-arm-none-eabi-4_8-2014q3/
------------------------
./ 文件 “FSLMQXOS_4_1_2_Vybrid/config/twrvf65gs10_m4/user_config.h”
由于VF61 A5和M4共享外設(shè)資源,因此在使用M4外設(shè)時候要通過修改A5 Device Tree來確保此外設(shè)沒有被A5已經(jīng)占用.本文后續(xù)只測試M4調(diào)用GPIO,因此將其他和A5沖突的外設(shè)資源都去掉,實際應(yīng)用中可以根據(jù)具體情況做配置.
------------------------
...
#define BSPCFG_ENABLE_I2C0 0
#define BSPCFG_ENABLE_II2C0 0
...
#define BSPCFG_ENABLE_SPI0 0
...
#define BSPCFG_ENABLE_RTCDEV 0
...
#define BSPCFG_ENABLE_ESDHC 0
#define BSPCFG_ENABLE_SAI 0
...
#define BSPCFG_ENABLE_TTYB 0
#define BSPCFG_ENABLE_ITTYB 0
#define BSPCFG_ENABLE_TTYC 1
#define BSPCFG_ENABLE_ITTYC 0
...
------------------------
./ 文件 ”FSLMQXOS_4_1_2_Vybrid/mqx/source/bsp/twrvf65gs10_m4/twrvf65gs10_m4.h”
修改時鐘
------------------------
...
#define BSP_CORE_CLOCK (166700000)
#define BSP_BUS_CLOCK (166700000)
#define BSP_SYSTEM_CLOCK (83300000)
#define BSP_IPG_CLOCK (83300000)
...
------------------------
4). 編譯MQX
a). 替換 “mqx/examples/hello/build/make/hello_twrvf65gs10_m4/build_gcc_arm.sh”文件
從這里下載文件
b). 編譯Helloworld Firmware
------------------------
$ cdmqx/examples/hello/build/make/hello_twrvf65gs10_m4/
$ ./build_gcc_arm.sh
...
Build done
Press any key to continue...
------------------------
c). 創(chuàng)建binary Firmware文件
------------------------
$ cd~/FSLMQXOS_4_1_2_Vybrid/mqx/examples/hello/build/make/hello_twrvf65gs10_m4/gcc_arm/ram_release
$ exportPATH=~/gcc-arm-none-eabi-4_9-2014q1/bin/:$PATH
$ arm-none-eabi-objcopy -O binaryhello_twrvf65gs10_m4.elf hello_twrvf65gs10_m4.bin
------------------------
d). 查看應(yīng)用入口地址
由于二進制程序沒有可以指明加載地址或入口地址的頭部信息,因此需要在加載的時候手動添加
------------------------
$ arm-none-eabi-objdump -fhello_twrvf65gs10_m4.elf
hello_twrvf65gs10_m4.elf: file format elf32-littlearm
architecture: arm, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x3f0007b1
------------------------
e). 運行MQX
將bin文件復(fù)制到Colibri VF61 A5核心的Linux系統(tǒng)上面,運行下面命令啟動mcc然后下載并運行MQX在M4核心
------------------------
# modprobe mcc
# mqxboot hello_twrvf65gs10_m4.bin0x3f000000 0x3f0007b1
------------------------
f). 查看M4串口輸出
將Colibri開發(fā)板UARTB接口連接到開發(fā)主機
------------------------
$ sudo minicom -D /dev/ttyUSB1 -d 115200
Welcome to minicom 2.7
OPTIONS: I18n
Compiled on Jan 1 2014, 17:13:19.
Port /dev/ttyUSB1, 14:58:22
Press CTRL-A Z for help on special keys
Hello World
------------------------
5). GPIO demo
在M4運行MQX GPIO demo, 通過BSP_BUTTON1來控制打開和關(guān)閉BSP_LED1
a). 查看M4對應(yīng)管腳定義
確定BSP_BUTTON1對應(yīng)GPIO管腳為PTB16,BSP_LED1對應(yīng)GPIO管腳為PTB0
------------------------
$ viFSLMQXOS_4_1_2_Vybrid/mqx/source/bsp/twrvf65gs10_m4/twrvf65gs10_m4.h
...
#define BSP_LED1 (LWGPIO_PIN_PTB0)
...
#define BSP_SW1 (LWGPIO_PIN_PTB16)
...
#define BSP_BUTTON1 BSP_SW1
...
------------------------
b). 確認M4 GPIO管腳資源
通過查詢Colibri VF61手冊和A5 Linux DeviceTree文件, 發(fā)現(xiàn)PTB0被A5 Linux pwm0占用,而PTB16雖然被flexcan1占用但默認并為啟用,因此首先需要根據(jù)這里的說明先重新編譯A5 Linux Device Tree文件將pwm0 disable以免管腳資源沖突;然后在Colibri載板上面將PTB0 (SODIMM 59)連接到X21 LED1 (Pin 2), PTB16 (SODIMM 63)連接到X21 SW6 (Pin 11)

c). 同樣方法編譯MQX GPIOFirmware
------------------------
$ cd~/FSLMQXOS_4_1_2_Vybrid/mqx/examples/gpio/build/make/gpio_twrvf65gs10_m4
$ ./build_gcc_arm.sh
$ cd gcc_arm/ram_release/
$ exportPATH=~/gcc-arm-none-eabi-4_9-2014q1/bin/:$PATH
$ arm-none-eabi-objcopy -O binarygpio_twrvf65gs10_m4.elf gpio_twrvf65gs10_m4.bin
$ arm-none-eabi-objdump -fgpio_twrvf65gs10_m4.elf
gpio_twrvf65gs10_m4.elf: file format elf32-littlearm
architecture: arm, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x3f000e51
------------------------
d). 部署并測試demo
./ 在VF61 A5 Linux上面部署并運行MQXGPIO到M4
------------------------
# mqxboot gpio_twrvf65gs10_m4.bin0x3f000000 0x3f000e51
------------------------
./ 在M4 串口輸出打印按鍵3次
------------------------
====================== GPIO Example ======================
The (SW1) button is configured to triggerGPIO interrupt.
Press the (SW1) button 3x to continue.
------------------------
./ 按Colibri 開發(fā)板SW6 3次后,即可通過SW6控制LED1
------------------------
Button pressed 3x
The (SW1) button state is now polled.
Press the (SW1) button to switch LED on oroff
Button pressed
------------------------
6). MCC Pingpong demo
下面通過MCC Pinpong demo來測試A5和M4之間的信息傳遞
a). 配置MCC版本
MQX 4.1.2版本默認采用MCC V2版本,但也同時提供了V1版本源代碼;由于目前VF61Linux只支持MCC V1版本,因此首先要用V1版本源代碼替換V2版本
------------------------
$ cd ~/FSLMQXOS_4_1_2_Vybrid/mcc/source
$ unzip mcc_version_1_2.zip -d ../. //按提示選擇全部替換
$ vi mcc_vf600.c
//如下面紅色部分修改
static const unsigned intmcc_cpu_to_cpu_vectors[] = { GIC_CPU_to_CPU_int0, NVIC_CPU_to_CPU_int0 };
------------------------
b). 編譯MCC
------------------------
$ cd~/FSLMQXOS_4_1_2_Vybrid/mcc//build/make/mcc_twrvf65gs10_m4
$ ./build_gcc_arm.sh
------------------------
c). 編譯Pingpong demo
------------------------
$ cd~/FSLMQXOS_4_1_2_Vybrid/mcc/examples/pingpong/build/make/pingpong_example_twrvf65gs10_m4
$ ./build_gcc_arm.sh
------------------------
d). 部署運行測試Pingpong demo
和之前同樣方法獲得bin和入口地址,并通過A5 Linux運行到M4上面
./ A5 Linux部署執(zhí)行Pingpong demo
------------------------
$ mqxbootpingpong_example_twrvf65gs10_m4.bin 0x3f000000 0x3f001095
------------------------
./ 運行后, M4串口輸出
------------------------
Responder task started, MCC version is001.002
------------------------
./ 然后在A5 Linux運行自帶的Pingpong應(yīng)用
------------------------
mcc-pingpong
------------------------
./ 然后M4串口輸出
------------------------
Responder task received a msg
Message: Size=4, DATA = 1
Responder task received a msg
Message: Size=4, DATA = 3
...
------------------------
./ 同樣A5串口輸出
------------------------
version: 001.002
Message: Size=4, DATA = 2 after 0.004325seconds.
Message: Size=4, DATA = 4 after 0.004340seconds.
Message: Size=4, DATA = 6 after 0.004669seconds.
...
------------------------
7). 總結(jié)
本文簡單展示了在VF61 M4核心上面運行MQX以及A5和M4核心通信例程,可見MQX可以非常方便的部署在NXP處理器上面,詳細的MQX應(yīng)用開發(fā)可以參考下面文檔.
FSLMQXOS_4_1_2_Vybrid/doc
http://developer.toradex.com/knowledge-base/mqx-on-the-cortex-m4-of-a-colibri-vf61
提交
通過 Docker 部署測試 CODESYS PLC示例
Yocto layer 使用 TI AM62 安全啟動功能
定制 Linux Kernel Driver 編譯示例
在 NXP i.MX 95 上運行 Zephyr 實現(xiàn)非對稱多核處理
HDMI 顯示器熱插拔對應(yīng)顯示應(yīng)用啟停測試

投訴建議