色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

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

            1). 簡(jiǎn)介

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

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

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

            

           

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

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

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

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

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

            2). 準(zhǔn)備

            a). 硬件準(zhǔn)備

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

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

            b). 軟件準(zhǔn)備

            ./ iMX7模塊Cortex-A7核心運(yùn)行Toradex Embedded Linux release V2.6 Beta2

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

            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ā)主機(jī)是Ubuntu 64bit 操作系統(tǒng),則需要安裝下面32bit支持包

            $ sudo dpkg --add-architecture i386

            $ sudo apt-get update

            $ sudo apt-get install libc6:i386 libncurses5:i386

            //測(cè)試gcc運(yùn)行

            $ 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 目錄下提供了諸多例程,在編譯前需要先設(shè)置叉編譯工具路徑的環(huán)境變量ARMGCC_DIR,然后運(yùn)行armgcc子目錄下準(zhǔn)備好的編譯腳本即可進(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

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

            編譯好的可執(zhí)行文件位于armgcc下的release和debug子目錄下, 可以加載到M4核心上面運(yùn)行了.

            5). 在M4核心上面運(yùn)行Firmware

            a). M4的固件程序在Colibri iMX7 A7核心Linux系統(tǒng)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 默認(rèn)使用 UARTB 作為其調(diào)試輸出串口, 波特率設(shè)置115200 8N1。A7 Linux 默認(rèn)device tree設(shè)置也會(huì)訪問(wèn)UARTB, 為了防止出現(xiàn)沖突, 推薦在device tree 中禁用 UARTB(設(shè)置status參數(shù))。也可以在 U-Boot 中添加下面參數(shù),臨時(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è)備的時(shí)鐘,但A7核心Linux無(wú)法知道哪些時(shí)鐘在M4核心上面被使用,因此需要添加下面內(nèi)核參數(shù)來(lái)保證M4相關(guān)時(shí)鐘正常。

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

            Colibri iMX7 # setenv defargs clk_ignore_unused

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

            d). 通過(guò)另外一個(gè)窗口連接UARTB, 可以收到hello world程序運(yùn)行后的打印輸出

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

            $ 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 上運(yùn)行的程序

            // 運(yùn)行下面命令將SD卡上面的程序文件復(fù)制到系統(tǒng)為M4程序單獨(dú)提供的ubi分區(qū)空間

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

            Colibri iMX7 # ubi part ubi

            ...

            Colibri iMX7 # fatload mmc 0:1 ${loadaddr} hello_world.bin

            ...

            Colibri iMX7 # ubi write ${loadaddr} m4firmware ${filesize}

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

            // 設(shè)置啟動(dòng)變量,之后U-Boot會(huì)在開(kāi)機(jī)啟動(dòng)Linux前先啟動(dòng)M4程序

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

            Colibri iMX7 # setenv m4boot 'ubi read 0x7F8000 m4firmware && dcache flush && bootaux 0x7F8000'

            Colibri iMX7 # s**eenv

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

            6). M4 程序示例

            除了上面測(cè)試的hello world, 在examples目錄中還有很多示例程序.

            a). GPIO示例

            // 例程位置: .../examples/imx7_colibri_m4/driver_examples/gpio_imx/

            // 同上述方法編譯后生成應(yīng)用: gpio_imx_example.bin

            // 例程中使用EXT_IO1作為按鍵輸入, EXT_IO0作為輸出控制LED; 在Colibri 評(píng)估板上面, 利用X21將對(duì)應(yīng)Pin腳和組件相連:

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

            EXT_IO0 => X21-LED1

            EXT_IO1 => X21-SW6

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

            // 在Uboot運(yùn)行程序, 由于A7 Linux Device Tree也定義了這幾個(gè)GPIO, 因此測(cè)試只在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/

            // 同上述方法編譯后生成應(yīng)用: rpmsg_str_echo_freertos_example.bin

            // A7 Linux kernel對(duì)應(yīng)module 源文件: drivers/rpmsg/imx_rpmsg_tty.c

            // U-Boot執(zhí)行如下命令

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

            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下執(zhí)行下面命令

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

            $ 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串口對(duì)應(yīng)輸出

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

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

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

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

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

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

            7). 總結(jié)

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



          關(guān)鍵詞: NXP FreeRTOS

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉