飛凌iMX8MQ 平臺(tái)內(nèi)部有一個(gè)Cortex M4內(nèi)核,支持使用MCUXpresso SDK進(jìn)行開(kāi)發(fā)。 MCUXpresso SDK是微控制器軟件支持的集合,它包含外圍驅(qū)動(dòng)程序,RPMSG多核通信,以及FreeRTOS支持。可以查看SDK API文檔了解它實(shí)現(xiàn)的函數(shù)和結(jié)構(gòu)體。
一、使用ARM GCC工具編譯應(yīng)用程序在Linux環(huán)境下,MCUXpresso SDK使用GCC工具進(jìn)行編譯,下面以hello_world demo為例說(shuō)明編譯的過(guò)程。 首先需要搭建Linux編譯環(huán)境: 1、安裝cmake $ sudo apt-get install cmake $ cmake --version cmake 的版本要大于 3.0.x 才行。如果您的的版本小于3.0,可以參考下列步驟進(jìn)行更新。 $ cd /tmp $ wget https://cmake.org/files/v3.11/cmake-3.11.0-rc4-Linux-x86_64.tar.gz $ tar zxvf cmake-3.11.0-rc4-Linux-x86_64.tar.gz $ sudo mv cmake-3.11.0-rc4-Linux-x86_64 /opt/cmake-3.11 $ sudo ln -sf /opt/cmake-3.11/bin/* /usr/bin/ $ cmake --version 2、安裝GCc編譯器 將用戶資料工具目錄的 gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2 拷貝到虛擬機(jī)/tmp 目錄。 $ cd /tmp $ sudo tar xvf gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2 -C /opt 3、設(shè)置環(huán)境變量 $ export ARMGCC_DIR=/opt/gcc-arm-none-eabi-7-2017-q4-major $ export PATH=/opt/gcc-arm-none-eabi-7-2017-q4-major/binPATH 設(shè)置完成可以看一下是否設(shè)置成功: $ echo $ARMGCC_DIR $ echo $PATH 4、編譯 將用戶資料原廠資料中的 SDK_2.8.0_EVK-MIMX8MQ.zip 拷貝到虛擬機(jī) /home/forlinx/imx8mq 目錄下: $ cd /home/forlinx/imx8mq $ mkdir SDK_2.8.0_EVK-MIMX8MQ $ mv SDK_2.8.0_EVK-MIMX8MQ.zip SDK_2.8.0_EVK-MIMX8MQ $ cd SDK_2.8.0_EVK-MIMX8MQ $ unzip SDK_2.8.0_EVK-MIMX8MQ.zip $ cd boards/evkmimx8mq/demo_apps/hello_world/armgcc $ ./build_debug.sh 編譯出來(lái)的 hello_world.bin 文件在 ./debug 目錄下。 注意:這里也可以編譯其他版本,如build_ddr_debug.sh,只是在運(yùn)行的時(shí)候會(huì)有差別。 二、 使用IAR和J link編譯和 調(diào)試參考官方提供的手冊(cè) 《SDK_2.8.0_EVK-MIMX8MQ\docs\Getting Started with MCUXpresso SDK for EVK-MIMX8MQ》。 1、IAR和Jlink官方工具版本要求IAR請(qǐng)使用IAR embedded Workbench 8.30.2版本或更高版本,jlink官方工具版本請(qǐng)使用包含MIM8M6_M4設(shè)備的版本,我們使用的版本為JLink_Windows_V654c。IAR embedded Workbench為付費(fèi)軟件,請(qǐng)用戶自行購(gòu)買安裝。Jlink官方工具用戶可以在jlink官方網(wǎng)站下載。 另外還需要NXP提供的SDK_2.8.0_EVK-MIMX8MQ,用戶資料內(nèi)已經(jīng)提供。 2、IAR通過(guò)Jlink運(yùn)行測(cè)試程序步驟一、打開(kāi)工程 1. 打開(kāi)IAR 2. 在“File”菜單下選擇“Open Workspace”,選擇SDK_2.8.0_EVK-MIMX8MQ\boards\evkmimx8mq\demo_apps\hello_world\iar\hello_world.eww。 3. 選擇debug選項(xiàng) 步驟 二 、 配置工程 按下ALT+F7快捷鍵打開(kāi)配置界面。 1. 設(shè)置General Options選項(xiàng)配置: 2. 設(shè)置linker選項(xiàng)配置: 點(diǎn)擊“Edit...” 選擇MIMX8MQ6xxxJZ_cm4_ddr_ram.icf、MIMX8MQ6xxxJZ_cm4_ram.icf,不同的選項(xiàng)會(huì)生成的鏡像會(huì)運(yùn)行在不同的存儲(chǔ)中(ddr、ram)。 3. 設(shè)置Debugger選項(xiàng)配置: 4. 設(shè)置J-Link/J-Trace選項(xiàng)配置: 配置完成后點(diǎn)擊 “OK”。 步驟三、編譯并運(yùn)行工程 注意:調(diào)試M4程序,iMX8MQ開(kāi)發(fā)板不能啟動(dòng)到Linux內(nèi)核階段,需要停止在uboot(啟動(dòng)時(shí),在調(diào)試串口按下空格鍵)。 1. 點(diǎn)擊“Make”編譯工程,工程編譯完成,且無(wú)報(bào)錯(cuò): 2. 點(diǎn)擊“Download and Debug”按鈕: 3. 提示設(shè)置 J-Link 選擇設(shè)備: 4. 選擇“MIMX8MQ6_M4”設(shè)備: 5. 運(yùn)行測(cè)試程序: 6. 在M4核調(diào)試串口查看運(yùn)行結(jié)果: 三、使用 U -boot運(yùn)行應(yīng)用程序可以在iMX8MQ開(kāi)發(fā)板啟動(dòng)的時(shí)候進(jìn)入u-boot命令行,通過(guò)u-boot命令來(lái)將bin文件加載到M4中并運(yùn)行,下面以hello_world.bin程序?yàn)槔f(shuō)明運(yùn)行的過(guò)程。 注意:M4程序運(yùn)行可能和A53有資源沖突,如某個(gè)接口在M4中已經(jīng)使用,A53中不要再次調(diào)用此接口。M4程序運(yùn)行在DDR中,需要Linux中預(yù)留這部分內(nèi)存。在系統(tǒng)燒寫(xiě)的設(shè)備樹(shù)ok8mq-evk-rpmsg.dtb中有配置。我們下面測(cè)試都是使用此設(shè)備樹(shù)測(cè)試M4程序。 在uboot命令行內(nèi)輸入下列命令修改設(shè)備樹(shù): $ setenv fdt_file ok8mq-evk-rpmsg.dtb $ saveenv 1、 準(zhǔn)備測(cè)試用M4程序 采用第一或者第二中的方法生成運(yùn)行在DDR和ram的hello_world.bin,并將它們分別命名為hello_world_ddr.bin和hello_world_ram.bin。 2、 串口連接 由于hello_world程序中使用了uart2,因此在開(kāi)始測(cè)試之前請(qǐng)連接uart2到PC的串口。并使用串口調(diào)試工具打開(kāi)對(duì)應(yīng)的COM口,波特率等參數(shù)設(shè)置和OKMX8MQ Debug口參數(shù)相同。 3、 將編譯出來(lái)的hello_world_ddr.bin和hello_world_ram.bin拷貝到U盤(fat32)的根目錄下面,將U盤插到開(kāi)發(fā)板上,重啟iMX8MQ開(kāi)發(fā)板,停在u-boot命令行。 4、 在u-boot命令行執(zhí)行如下命令 對(duì)于debug/release版本的bin文件,它運(yùn)行在TCM,執(zhí)行下列命令: $ usb start $ fatload usb 0:1 0x48000000 hello_world_ram.bin $ cp.b 0x48000000 0x7e0000 0x20000 $ bootaux 0x7e0000 終端的執(zhí)行: 在uart2的調(diào)試串口工具上可以看到打印信息如下: 對(duì)于ddr_debug/ddr_release版本的bin文件,它運(yùn)行在ddr4,執(zhí)行下列命令: $setenv fdt_file ok8mq-evk-rpmsg.dtb $ saveenv $ usb start $ fatload usb 0:1 0x80000000 hello_world_ddr.bin $ dcache flush $ bootaux 0x80000000 終端的執(zhí)行: 在uart2的調(diào)試串口工具上可以看到打印信息如下: 四、Uboot自動(dòng)啟動(dòng)M4程序 在制作系統(tǒng)鏡像的時(shí)候,會(huì)將源碼包內(nèi)images/m4/文件夾下的文件寫(xiě)入到boot.img鏡像內(nèi),該鏡像是rootfs.sdcard的一部分。我們把鏡像燒寫(xiě)到emmc后,這些m4程序的鏡像就在emmc的fat32分區(qū)內(nèi)存在。Uboot啟動(dòng)過(guò)程中會(huì)運(yùn)行m4_run,將m4_run設(shè)置為啟動(dòng)m4程序,啟動(dòng)后uboot會(huì)啟動(dòng)M4程序。 以hello_world例程示例,按下面的方法設(shè)置uboot環(huán)境變量后,uboot會(huì)自動(dòng)啟動(dòng)M4程序。 hello_world程序的鏡像,我們已經(jīng)默認(rèn)添加到源碼的images/m4/文件夾下,所以我們的鏡像內(nèi)emmc的分區(qū)1內(nèi)的m4文件夾下包含了hello_world的鏡像,hello_world_ram.bin和hello_world_ddr.bin。 在ram啟動(dòng)M4程序。 $ setenv m4_run 'mmc dev 0; fatload mmc 0:1 0x48000000 m4/hello_world_ram.bin; cp.b 0x48000000 0x7e0000 0x20000; bootaux 0x7e0000 ' $ saveenv 在ddr啟動(dòng)M4程序。 $ setenv m4_run 'mmc dev 0; fatload mmc 0:1 0x80000000 m4/hello_world_ddr.bin; dcache flush; bootaux 0x80000000' $ saveenv 注1:用戶添加自己編譯的鏡像放到images/m4/文件夾下,編輯生成鏡像,燒寫(xiě)后就會(huì)在emmc的fat分區(qū)內(nèi),啟動(dòng)的時(shí)候根據(jù)編譯的為ddr版或ram版選擇m4_run的設(shè)置方法,并將m4_run命令內(nèi)的m4鏡像名字替換成自己編譯的m4鏡像的名字。 注2:可以在系統(tǒng)啟動(dòng)后查看fat分區(qū)內(nèi)包含的鏡像,也可以通過(guò)cp命令添加鏡像。 查看鏡像: $ ls /run/media/mmcblk0p1/m4 復(fù)制鏡像到文件夾: $ cp /run/media/sda1/m4_flash.bin /run/media/mmcblk0p1/m4/ 五、異構(gòu)多核通信測(cè)試使用RPMsg(Remote Processor Messaging)實(shí)現(xiàn)Cortex A53跟Cortex M4進(jìn)行通信。 RPMsg是一種基于virtio的消息傳遞總線,它允許內(nèi)核驅(qū)動(dòng)程序與系統(tǒng)上可用的遠(yuǎn)程處理器(如Cortex M4)進(jìn)行通信。下圖是一個(gè)多核通信架構(gòu): 飛凌iMX8MQ的MCUXpresso SDK中有一個(gè)demo:rpmsg_lite_pingpong_rtos,它實(shí)現(xiàn)了Cortex A53與Cortex M4的數(shù)據(jù)收發(fā),二者使用了共享內(nèi)存,并且在Cortex M4上運(yùn)行了一個(gè)FreeRTOS Task。 在Cortex A53端通過(guò)內(nèi)核模塊的方式實(shí)現(xiàn)該功能,代碼位于:drivers/rpmsg/imx_rpmsg_pingpong.c。 下面以 Arm GCC 方式編譯示例。 進(jìn)入以下目錄: $ cd boards/evkmimx8mq/multicore_examples/rpmsg_lite_pingpong_rtos/linux_remote/armgcc 編譯debug版本的bin文件: $ ./build_debug.sh $ cd debug $ ls -l 將編譯出來(lái)的bin文件rpmsg_lite_pingpong_rtos_linux_remote.bin拷貝到U盤(Fat32)的根目錄下面,啟動(dòng)開(kāi)發(fā)板停在u-boot命令行。 $ setenv fdt_file ok8mq-evk-rpmsg.dtb $ saveenv $ usb start $ fatload usb 0:1 0x48000000 rpmsg_lite_pingpong_rtos_linux_remote.bin $ cp.b 0x48000000 0x7e0000 0x20000 $ bootaux 0x7e0000 運(yùn)行bin文件后,可以在uart2的串口終端看到以下輸出: 然后在A53 U-boot命令行輸入 boot 啟動(dòng)kernel,此時(shí)可以在Cortex M4的串口終端看到以下輸出: 然后在Cortex A53的串口終端加載以下內(nèi)核模塊: $ modprobe imx_rpmsg_pingpong 模塊加載之后,Cortex A53開(kāi)始跟Cortex M4進(jìn)行數(shù)據(jù)傳輸,此時(shí)可以在Cortex M4的串口終端看到以下輸出: 此時(shí)可以在Cortex A53的串口終端看到以下輸出:
詳情請(qǐng)查看飛凌官方網(wǎng)站https://www.forlinx.com/
|