工控網(wǎng)首頁
>

應(yīng)用設(shè)計

>

基于NXP Vybrid ARM處理器部署MQX實時操作系統(tǒng)

基于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)用啟停測試