<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于NXP iMX7 ARM處理器部署FreeRTOS實(shí)時(shí)操作系統

基于NXP iMX7 ARM處理器部署FreeRTOS實(shí)時(shí)操作系統

作者: 時(shí)間:2016-08-15 來(lái)源:網(wǎng)絡(luò ) 收藏

  1). 簡(jiǎn)介

本文引用地址:http://dyxdggzs.com/article/201608/295503.htm

  是廣泛使用的開(kāi)源實(shí)時(shí)操作系統, 被眾多芯片廠(chǎng)商包括所支持, 本文就展示在 iMX7 ARM處理器上面的M4核心上面部署.

   iMX7 ARM處理器是NXP最新推出的異構雙核處理器, 主核心為單核或者雙核Cortex-A7,通常運行Linux/WinCE操作系統來(lái)作為嵌入式應用主程序界面環(huán)境; 副核心為Cortex-M4, 通常運行實(shí)時(shí)操作系統來(lái)為嵌入式應用提供高效可靠的實(shí)時(shí)應用處理. 一個(gè)簡(jiǎn)略的iMX7芯片框圖如下所示.

  

 

  由上圖可見(jiàn), 多種類(lèi)型的內存可供使用, 包括M4專(zhuān)屬的內存空間 (Tightly Coupled Memory, TCM), 雖然很小但是CPU可以無(wú)延遲訪(fǎng)問(wèn); 多個(gè)OCRAM區域 (On-Chip RAM, 通常是SRAM), 同樣訪(fǎng)問(wèn)非??於姨峁┫鄬Υ蟮娜萘? 最后就是DRR3主內存空間. 出于性能考慮, 請盡可能優(yōu)先使用片內內存資源.

  另外, M4有兩個(gè)總線(xiàn)連接到AXI/AHB interconnect, 一個(gè)負責數據傳輸,另一個(gè)負責指令傳輸, 因此為了最好的性能優(yōu)化, 我們需要將數據放置與連接數據總線(xiàn)的區域,而指令代碼放置與連接指令總線(xiàn)的區域. 例如, 對于TCM,則放置代碼于TCML空間, 而放置數據于TCMU空間.

  然后關(guān)于Resource Domain Controller (RDC), 對于iMX7,由于Cortex-A7和Cortex-M4核心內存和外設的訪(fǎng)問(wèn)都是共享且平等的,為了保證不產(chǎn)生資源沖突,通過(guò)這個(gè)控制器來(lái)從硬件層面對指定內存和外設的訪(fǎng)問(wèn)權限進(jìn)行保護. RDC 允許定義最多4個(gè)resource domains, 并將不同的內存和外設資源指定到這些resource domain中. 默認情況下, A7核心和相關(guān)外設被指定于domain 0, 當 firmware運行后, M4核心以及相關(guān)外設最初也是domain 0, 但馬上被重新指定到domain 1. 因此如果一個(gè)外設需要被M4使用, 但同時(shí)A7 Linux kernel也使用了, 就需要修改A7 Linux Device Tree來(lái)禁止這個(gè)外設 (詳細操作方法請見(jiàn)這里).

  本文就基于Toradex Colibri iMX7 (基于NXP iMX7 SoC) ARM計算機模塊搭配Colibri Eva Board開(kāi)發(fā)板來(lái)演示編譯和部署FreeRTOS應用. 區別與傳統的MCU處理器, firmware通常從內置的NOR Flash加載, Colibri iMX7則并沒(méi)有這樣的配置, 而是將firmware存放于外部存儲設備中如SD卡或者模塊上的Nand Flash, 同時(shí)這些存儲并不是“memory mapped”, 因此CPU無(wú)法直接執行存儲在這里的firmware, 而是要先被加載到內存區域后才能被執行.

  對于Colibri iMX7, 系統總是由Cortex-A7核心來(lái)啟動(dòng), 先執行內部boot ROM后啟動(dòng)如U-boot這樣的boot loader,然后由boot loader從上述的存儲設備加載firmware到內存,最后在觸發(fā)Cortex-M4核心去執行這個(gè)firmware. 而如果需要更新或者替換firmware,只需要更改存儲設備上面的firmware鏡像即可.

  2). 準備

  a). 硬件準備

  ./ Colibri iMX7計算機模塊和Colibri Eva Board開(kāi)發(fā)板

  ./ Ubuntu Linux開(kāi)發(fā)主機

  b). 軟件準備

  ./ iMX7模塊Cortex-A7核心運行Toradex Embedded Linux release V2.6 Beta2

  ./ Ubuntu Linux開(kāi)發(fā)主機

  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

  //如果開(kāi)發(fā)主機是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 目錄下提供了諸多例程,在編譯前需要先設置叉編譯工具路徑的環(huán)境變量ARMGCC_DIR,然后運行armgcc子目錄下準備好的編譯腳本即可進(jìn)行編譯.

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

  $ 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中進(jìn)行加載, 將編譯好的 hello_world.bin程序放到SD卡根目錄 (FAT32格式) ,并連接到開(kāi)發(fā)板上.

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

  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設置也會(huì )訪(fǎng)問(wèn)UARTB, 為了防止出現沖突, 推薦在device tree 中禁用 UARTB(設置status參數)。也可以在 U-Boot 中添加下面參數,臨時(shí)禁用 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會(huì )自動(dòng)關(guān)閉不使用設備的時(shí)鐘,但A7核心Linux無(wú)法知道哪些時(shí)鐘在M4核心上面被使用,因此需要添加下面內核參數來(lái)保證M4相關(guān)時(shí)鐘正常。

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

  Colibri iMX7 # setenv defargs clk_ignore_unused

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

  d). 通過(guò)另外一個(gè)窗口連接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). 自動(dòng)啟動(dòng)加載 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}

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

  // 設置啟動(dòng)變量,之后U-Boot會(huì )在開(kāi)機啟動(dòng)Linux前先啟動(dòng)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運行程序, 由于A(yíng)7 Linux Device Tree也定義了這幾個(gè)GPIO, 因此測試只在U-Boot環(huán)境下進(jìn)行.

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

  ====================== 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 設置為開(kāi)機自動(dòng)加載

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

  $ echo imx_rpmsg_tty > /etc/modules-load.d/rpmsg_tty.conf

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

  // 另外關(guān)于RPMsg還有其他如pingpong demo, 可以自行測試.

  7). 總結

  本文對iMX7 異構雙核架構進(jìn)行了說(shuō)明, 并基于Toradex Colibri iMX7 模塊演示了在M4核心上面運行FreeRTOS例程以及A7和M4核心通過(guò)RPMsg通信例程, 相信對NXP iMX7架構以及應用有了一個(gè)初步的了解, 其非常適合用于同時(shí)有人機交互和實(shí)時(shí)控制的工業(yè)應用場(chǎng)景, 同時(shí)非常低的功耗也使得整個(gè)嵌入式系統的穩定可靠性有了很好的保證.



關(guān)鍵詞: NXP FreeRTOS

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>