最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

基于imx8m plus開(kāi)發(fā)板全體系開(kāi)發(fā)教程5:Cortex-M7開(kāi)發(fā)

2023-05-30 15:48 作者:華清遠(yuǎn)見(jiàn)研發(fā)中心  | 我要投稿

前言:

i.MX8M Plus 開(kāi)發(fā)板是一款擁有 4 個(gè) Cortex-A53 核心,運(yùn)行頻率 1.8GHz;1 個(gè) Cortex-M7 核心,運(yùn)行頻率 800MHz;此外還集成了一個(gè) 2.3 TOPS 的 NPU,大大加速機(jī)器學(xué)習(xí)推理。

全文所使用的開(kāi)發(fā)平臺(tái)均為與NXP官方合作的FS-IMX8MPCA開(kāi)發(fā)板(華清遠(yuǎn)見(jiàn)imx8mp開(kāi)發(fā)板),支持Weston、ubuntu20.04、Android11 等操作系統(tǒng);同時(shí)支持 Xenomai 硬實(shí)時(shí)內(nèi)核、EtherCAT 總線、TSN 時(shí)間敏感網(wǎng)絡(luò)、ROS1.0、ROS2.0 等工業(yè)與機(jī)器人領(lǐng)域應(yīng)用;可以用于工業(yè)互聯(lián)網(wǎng)、人工智能、邊緣計(jì)算、多屏異顯等應(yīng)用方向。華清遠(yuǎn)見(jiàn)研發(fā)中心編寫了大量開(kāi)發(fā)教程并錄制了豐富視頻教學(xué)資源免費(fèi)提供給大家!

開(kāi)發(fā)板更多資料可關(guān)注華清遠(yuǎn)見(jiàn)在線實(shí)驗(yàn)室(微信號(hào):hqyjlab)領(lǐng)取``?

?Cortex-M7 開(kāi)發(fā)

第一個(gè)程序 Helloworld

本章節(jié)以最簡(jiǎn)單的 Helloworld 程序?yàn)槔?,在開(kāi)發(fā)板上 Cortex-M7 核心上運(yùn)行該程序,來(lái)

演示程序的調(diào)試,編譯和下載。

Cortex-M7 程序編譯與運(yùn)行

在啟動(dòng) Cortex-M7 核心之前需要先在開(kāi)發(fā)板連接調(diào)試串口以及開(kāi)發(fā)板電源。

? 導(dǎo)入源碼

首先需要打開(kāi)基于 Cortex-M7 的 Helloworld 程序,該程序位于【華清遠(yuǎn)見(jiàn)-I.MX8M Plus

開(kāi)發(fā)資料\程序源碼\Cortex-M7】下的 SDK_2_10_0_EVK-MIMX8MP.zip 文件夾。

打開(kāi)“IAR EW for Arm 9.10.1”應(yīng)用,依次點(diǎn)擊“File”->“Open workspace…”按鈕

在彈出的對(duì)話框中選擇 SDK_2_10_0_EVKMIMX8MP/boards/evkmimx8mp/demo_apps/helloworld\iar 目錄下的 hello_world.eww 文件即可

打開(kāi) hello_world 工程。

之后可以在窗口的左上角看到 hello_world 工程

? 編譯源碼

hello_world 工程的結(jié)構(gòu),分為“debug”,“release”,“ddr_debug”,“ddr_release”,

“flash_debug”,“flash_release”。

debug/release:程序用于在 CPU 內(nèi)部的 TCM 中執(zhí)行。

ddr_debug/ddr_release:主要用于在 DRAM 中執(zhí)行。

flash_debug/ flash_release:主要用于在 QSPI/XIP 部存儲(chǔ)器中執(zhí)行。

這里我們通過(guò)仿真器對(duì)程序進(jìn)行仿真,因此使用 debug/release 代碼進(jìn)行編譯。

在窗口左上角的 Workspace 區(qū)域找到 dubug 菜單

切換成功后,在工具欄中找到“Make”按鈕對(duì)程序鏡像編譯。

編譯成功如下圖所示

Cortex-M7 協(xié)處理器的啟動(dòng)

在啟動(dòng) Cortex-M7 核心之前需要先在開(kāi)發(fā)板連接調(diào)試串口以及開(kāi)發(fā)板電源。

? 在 TCM 中執(zhí)行程序

首先導(dǎo)入前面提到的 Helloworld 程序,然后將成功切換到“release”,編程成功后會(huì)在

【iar\release】目錄下生成 hello_world.bin 鏡像。

我們可以將該鏡像復(fù)制到 SDcard 的根目錄下,開(kāi)發(fā)板通過(guò)讀取 SDcard 目錄下的鏡像文

件加載到 TCM 中執(zhí)行程序。

我們將開(kāi)發(fā)板上電,使程序停留在 u-boot 控制終端。

通過(guò) SDcard 加載鏡像文件則執(zhí)行如下指令

默認(rèn) TF 卡無(wú)分區(qū)

執(zhí)行成功后在 M7 的串口終端上會(huì)看到有“hello world.”字符輸出

Cortex-M7 協(xié)處理器自啟動(dòng)

上小節(jié)我們實(shí)現(xiàn)了 Cortex-M7 協(xié)處理器的手動(dòng)啟動(dòng),本小節(jié)主要實(shí)現(xiàn) Cortex-M7 協(xié)處理

器的上電自啟動(dòng)。

Cortex-M7 協(xié)處理器與傳統(tǒng) M7 處理器不大相同,該處理器沒(méi)有辦法自己上電運(yùn)行,需要

通過(guò) u-boot 加載程序來(lái)引導(dǎo) Cortex-M7 才行。

通過(guò)下面的指令可以將外部 SDcard 存儲(chǔ)器的程序上電自動(dòng)加載到 TCM 中執(zhí)行,我們還

以上一章節(jié)的 Helloworld 程序鏡像為例進(jìn)行演示。

首先將 release 程序生成的鏡像放到 SDcard 根目錄,然后設(shè)置 m7_run 環(huán)境變量為“mmc

dev 1; fatload mmc 1:1 0x48000000 hello_world.bin; cp.b 0x48000000 0x7e0000 0x20000; bootaux 0x7e0000”這里的環(huán)境變量即為上小節(jié)提到的環(huán)境變量。

我們將開(kāi)發(fā)板上電,使程序停留在 u-boot 控制終端。

之后輸入如下指令設(shè)置環(huán)境變量

之后重啟開(kāi)發(fā)板即可看到在 M7 串口終端會(huì)自動(dòng)運(yùn)行程序。

本例中只是以 SDcard 下的 TCM 運(yùn)行方式作為示例,按照此方法支持上小節(jié)提供的所有啟

動(dòng)方式,只需修改相應(yīng)的 m7_run 環(huán)境變量即可。

LED 燈控制

硬件原理分析

只要是對(duì)硬件操作,就要首先查看原理圖。查看外設(shè)是和 SoC 的哪個(gè)引腳相連。開(kāi)發(fā)板

上的 LED 的亮滅狀態(tài),與芯片上的引腳 I/O 輸出電平有關(guān)。

開(kāi)發(fā)平臺(tái)上 LED 的 I/O 擴(kuò)展,在底板原理圖中,查找 LED 原理圖如下:

如圖所示,可知控制 LED 燈的引腳編號(hào)為 GPIO_LED,然后繼續(xù)查找這個(gè)編號(hào)。

在這個(gè)原理圖下,可以查知其所接插座對(duì)應(yīng)引腳的網(wǎng)絡(luò)編號(hào)為 SD1_DATA5,然后在核心

板的原理圖下查找這個(gè)網(wǎng)絡(luò)編號(hào)。

如圖所示,最終可以得到其所接芯片的引腳為 AA29,我們對(duì)這個(gè)引腳設(shè)置高低電平最終

便可控制 LED 燈的亮滅。

?

常用到的寄存器主要如下:

程序編寫

首先介紹一下程序中用到的比較重要的結(jié)構(gòu)體

? gpio_pin_config_t :主要用于對(duì) GPIO 引腳進(jìn)行配置

這里只提供部分重要代碼,如想查看部分函數(shù)里的詳細(xì)實(shí)現(xiàn),請(qǐng)打開(kāi)光盤資料對(duì)應(yīng)的工

程【資料光盤\華清遠(yuǎn)見(jiàn)-I.MX8M Plus 開(kāi)發(fā)資料\程序源碼\Coertx-M7\igpio_led_output_task】。

在此程序中,第 7 行定義了一個(gè)引腳配置的結(jié)構(gòu)體, 然后從 13 行到 20 行是對(duì)開(kāi)發(fā)板以

及系統(tǒng)的初始化,在第 25 行對(duì) GPIO 進(jìn)行初始化,第一個(gè)參數(shù)決定對(duì)哪路 GPIO 操作,第二個(gè)參數(shù)決定操作的哪個(gè)引腳,第三個(gè)參數(shù)是對(duì)引腳進(jìn)行的配置。然后在 while 循環(huán)中,第 29行至 39 行實(shí)現(xiàn)控制 LED 燈的循環(huán)閃爍。

注意:程序運(yùn)行參考《Cortex-M7 協(xié)處理器的啟動(dòng)》小節(jié)即可。

串口收發(fā)

硬件原理分析

串行通信的基礎(chǔ)知識(shí):

串口通信是指外設(shè)和計(jì)算機(jī)間,通過(guò)數(shù)據(jù)信號(hào)線、地線、控制線等,按位進(jìn)行傳輸數(shù)據(jù)

的一種通訊方式。這種通信方式使用的數(shù)據(jù)線少,在遠(yuǎn)距離通信中可以節(jié)約通信成本,但其

傳輸速度比并行傳輸?shù)汀?/p>

串口是計(jì)算機(jī)上一種非常通用的設(shè)備通信協(xié)議。大多數(shù)計(jì)算機(jī)(不包括筆記本電腦)包

含兩個(gè)基于 RS-232 的串口。串口同時(shí)也是儀器儀表設(shè)備通用的通信協(xié)議(串口通信協(xié)議也可以用于獲取遠(yuǎn)程采集設(shè)備的數(shù)據(jù))。

一條信息的各位數(shù)據(jù)被逐位按順序傳送的通訊方式稱為串行通訊。

評(píng)價(jià)一個(gè)通訊是否優(yōu)質(zhì),主要體現(xiàn)在傳輸?shù)乃俣?,?shù)據(jù)的正確性,功耗是否低,布線成本是否低(例如 1 根線收發(fā)都能滿足就比 8 根線的并行收發(fā)要節(jié)約成本);使用是否普及(就好像大家都學(xué)英語(yǔ),世界很大部分的人都可以獨(dú)立使用英語(yǔ)嗎,會(huì)英語(yǔ)的人多,就非常普及,可通訊面就非常廣;如果你學(xué)的鳥(niǎo)語(yǔ),那就只能跟鳥(niǎo)通信,沒(méi)有人能聽(tīng)懂)。串行通訊的特點(diǎn)是:數(shù)據(jù)位傳送,傳按位順序進(jìn)行,最少只需一根傳輸線即可完成,成本低但送速度慢。串行通訊的距離可以從幾米到幾千米。

RS-232(串口的英文代名詞)采取不平衡傳輸方式,即所謂單端通訊,其共模抑制能力

差,其傳送距離最長(zhǎng)為約 15 米,最高速率為 20kb/s。RS-232 是為點(diǎn)對(duì)點(diǎn)(即只用一對(duì)收、

發(fā)設(shè)備)通訊而設(shè)計(jì)的。所以 RS-232 適合本地設(shè)備之間的通信。

傳統(tǒng)的串行接口標(biāo)準(zhǔn)有 22 根線,采用標(biāo)準(zhǔn) 25 芯 D 型插頭座(DB25),后來(lái)使用簡(jiǎn)化

為 9 芯 D 型插座(DB9),現(xiàn)在應(yīng)用中 25 芯插頭座已很少采用。

像現(xiàn)在所說(shuō)的幾線串口,一般都是指使用了幾根線,最初的 RS-232 串口是 25 針的,所

有的針腳定義都有用到,后來(lái)變成了 9 針的,所謂全功能串口就是所有的針腳定義都使用上了,例如流量控制,握手信號(hào)等都有用到,一般來(lái)說(shuō)國(guó)外的產(chǎn)品做產(chǎn)品比較規(guī)矩,把所有的串口信號(hào)都做上去了。但是國(guó)內(nèi)的技術(shù)人員發(fā)現(xiàn),其實(shí) RS-232 串口最主要使用的就是 2,3 線,另外的接口如果不使用的話,也不會(huì)出現(xiàn)很大的問(wèn)題,所以,就在 9 針的基礎(chǔ)上做精簡(jiǎn),所以就有所謂的 2,3,4,5,6,8 線的串口出來(lái)了。.

2 線串口只有 RXD,TXD 兩根基本的收發(fā)信號(hào)線;3 線串口除了 RXD 和 TXD,還有

GND;所謂 4~9 線只是在 TXD 和 RXD 基礎(chǔ)上增加了相應(yīng)的控制信號(hào)線,依據(jù)實(shí)際需要進(jìn)

行設(shè)計(jì)。一般來(lái)說(shuō),使用 5 線的 232 通信,是加了硬件流控的,即 RTS,CTS 信號(hào),主要是為了保證高速通信時(shí)的可靠性,如果你的通信速度不是很高,完全可以不用理會(huì)。根據(jù)信息的傳送方向,串行通訊可以進(jìn)一步分為單工、半雙工和全雙工三種。信息只能單向傳送為單工;信息能雙向傳送但不能同時(shí)雙向傳送稱為半雙工;信息能夠同時(shí)雙向傳送則稱為全雙工。

?如果在通信過(guò)程的任意時(shí)刻,信息只能由一方 A 傳到另一方 B,則稱為單工。

?如果在任意時(shí)刻,信息既可由 A 傳到 B,又能由 B 傳 A,但只能由一個(gè)方向上的傳輸存

在,稱為半雙工傳輸。

?如果在任意時(shí)刻,線路上存在 A 到 B 和 B 到 A 的雙向信號(hào)傳輸,則稱為全雙工。

并行通信和串行通信:

單片機(jī)與外界通信的基本方式有兩種:并行通信和串行通信,串口屬于串行通信。并行

通信是指利用多條數(shù)據(jù)傳輸線將一個(gè)數(shù)據(jù)的各位同時(shí)發(fā)送或接收。串行通信是指利用一條傳

輸線將數(shù)據(jù)一位位地順序發(fā)送或接收。

并行通信和串行通信的示意圖如下圖:

在每一條傳輸線傳輸速率相同時(shí),并行通信的傳輸速度比和串行通信快。然而當(dāng)傳輸距

離變長(zhǎng)時(shí),并行通信的缺點(diǎn)就會(huì)凸顯,首先是相比于串行通信而言信號(hào)易受外部干擾,信號(hào)

線之間的相互干擾也增加,其次是速率提升之后不能保證每根數(shù)據(jù)線的數(shù)據(jù)同時(shí)到達(dá)接收方

而產(chǎn)生接收錯(cuò)誤,而且距離越長(zhǎng)布線成本越高。

所以并行通信目前主要用在短距離通信,比如處理器與外部的 flash 以及外部 RAM 以

及芯片內(nèi)部各個(gè)功能模塊之間的通信。串行通信以其通信速率快和成本低等優(yōu)點(diǎn)成為了遠(yuǎn)距

離通信的首選。RS232 串口,以及差分串行總線像 RS485 串口、USB 接口、CAN 接口、

IEEE-1394 接口、以太網(wǎng)接口、SATA 接口和 PCIE 接口等都屬于串行通信的范疇。

下圖左側(cè)為每根數(shù)據(jù)線的數(shù)據(jù)同時(shí)到達(dá)接收方,被正確采樣的最理想情況;右側(cè)的圖為

每根數(shù)據(jù)線的數(shù)據(jù)不能同時(shí)到達(dá)接收方而產(chǎn)生接收錯(cuò)誤情形。

串口的原理和特點(diǎn):

串口是計(jì)算機(jī)上一種非常通用設(shè)備通信的協(xié)議(不要與通用串行總線 Universal Serial Bus

或者 USB 混淆)。大多數(shù)計(jì)算機(jī)包含兩個(gè)基于 RS232 的串口。串口同時(shí)也是儀器儀表設(shè)備

通用的通信協(xié)議;很多 GPIB(通用接口總線)兼容的設(shè)備也帶有 RS-232 口。同時(shí),串口通信

協(xié)議也可以用于獲取遠(yuǎn)程采集設(shè)備的數(shù)據(jù)。

串口通信的概念非常簡(jiǎn)單,串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并

行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。它很簡(jiǎn)單并且

能夠?qū)崿F(xiàn)遠(yuǎn)距離通信。典型地,串口用于 ASCII 碼字符的傳輸。通信使用 3 根線完成:(1)

地線,(2)發(fā)送,(3)接收。由于串口通信是異步的,端口能夠在一根線上發(fā)送數(shù)據(jù)同時(shí)在

另一根線上接收數(shù)據(jù)。其他線用于握手,但是不是必須的。串口通信最重要的參數(shù)是波特率、

數(shù)據(jù)位、停止位和奇偶校驗(yàn)。

對(duì)于兩個(gè)進(jìn)行通行的端口,這些參數(shù)必須匹配:

波特率:這是一個(gè)衡量通信速度的參數(shù)。它表示每秒鐘傳送的 bit 的個(gè)數(shù)。例如 300 波特

表示每秒鐘發(fā)送 300 個(gè) bit。當(dāng)我們提到時(shí)鐘周期時(shí),我們就是指波特率例如如果協(xié)議需要4800 波特率,那么時(shí)鐘是 4800Hz。這意味著串口通信在數(shù)據(jù)線上的采樣率為 4800Hz。通常電話線的波特率為 14400,28800 和 36600。波特率可以遠(yuǎn)遠(yuǎn)大于這些值,但是波特率和距離成反比。高波特率常常用于放置的很近的儀器間的通信,典型的例子就是 GPIB 設(shè)備的通信。

數(shù)據(jù)位:這是衡量通信中實(shí)際數(shù)據(jù)位的參數(shù)。當(dāng)計(jì)算機(jī)發(fā)送一個(gè)信息包,實(shí)際的數(shù)據(jù)不

會(huì)是 8 位的,標(biāo)準(zhǔn)的值是 5、7 和 8 位。如何設(shè)置取決于你想傳送的信息。比如,標(biāo)準(zhǔn)的 ASCII碼是 0~127(7 位)。擴(kuò)展的 ASCII 碼是 0~255(8 位)。如果數(shù)據(jù)使用簡(jiǎn)單的文本(標(biāo)準(zhǔn)ASCII 碼),那么每個(gè)數(shù)據(jù)包使用 7 位數(shù)據(jù)。每個(gè)包是指一個(gè)字節(jié),包括開(kāi)始/停止位,數(shù)據(jù)位和奇偶校驗(yàn)位。由于實(shí)際數(shù)據(jù)位取決于通信協(xié)議的選取,術(shù)語(yǔ)“包”指任何通信的情況。

停止位:用于表示單個(gè)包的最后一位。典型的值為 1 ,1.5 和 2 位。這里的 1.5 位的數(shù)據(jù)寬度,就是 1.5 個(gè)波特率,由于數(shù)據(jù)是在傳輸線上定時(shí)的,并且每一個(gè)設(shè)備有其自己的時(shí)鐘,很可能在通信中兩臺(tái)設(shè)備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供計(jì)算機(jī)校正時(shí)鐘同步的機(jī)會(huì)。適用于停止位的位數(shù)越多,不同時(shí)鐘同步的容忍程度越大,但是數(shù)據(jù)傳輸率同時(shí)也越慢。

奇偶校驗(yàn)位:在串口通信中一種簡(jiǎn)單的檢錯(cuò)方式。有四種檢錯(cuò)方式:偶、奇、高和低。

當(dāng)然沒(méi)有校驗(yàn)位也是可以的。對(duì)于偶和奇校驗(yàn)的情況,串口會(huì)設(shè)置校驗(yàn)位(數(shù)據(jù)位后面的一

位),用一個(gè)值確保傳輸?shù)臄?shù)據(jù)有偶個(gè)或者奇?zhèn)€邏輯高位。例如,如果數(shù)據(jù)是 011,那么對(duì)于偶校驗(yàn),校驗(yàn)位為 0,保證邏輯高的位數(shù)是偶數(shù)個(gè)。如果是奇校驗(yàn),校驗(yàn)位位 1 ,這樣就有3 個(gè)邏輯高位。高位和低位不真正的檢查數(shù)據(jù),簡(jiǎn)單置位邏輯高或者邏輯低校驗(yàn)。這樣使得接收設(shè)備能夠知道一個(gè)位的狀態(tài),有機(jī)會(huì)判斷是否有噪聲干擾了通信或者是否傳輸和接收數(shù)據(jù)是否不同步.

硬件流控制: 硬件流控制常用的有 RTS/CTS 流控制和 DTR/ R(數(shù)據(jù)終端就緒/數(shù)據(jù)設(shè)置

就緒)流控制。硬件流控制必須將相應(yīng)的電纜線連上,用 RTS/CTS(請(qǐng)求發(fā)送/清除發(fā)送)流控制時(shí),應(yīng)將通訊兩端的 RTS、CTS 線對(duì)應(yīng)相連,數(shù)據(jù)終端設(shè)備(如計(jì)算機(jī))使用 RTS 來(lái)起始調(diào)制解調(diào)器或其它數(shù)據(jù)通訊設(shè)備的數(shù)據(jù)流,而數(shù)據(jù)通訊設(shè)備(如調(diào)制解調(diào)器)則用 CTS 來(lái)起動(dòng)和暫停來(lái)自計(jì)算機(jī)的數(shù)據(jù)流。這種硬件握手方式的過(guò)程為:我們?cè)诰幊虝r(shí)根據(jù)接收端緩沖區(qū)大小設(shè)置一個(gè)高位標(biāo)志(可為緩沖區(qū)大小的 75%)和一個(gè)低位標(biāo)志(可為緩沖區(qū)大小的25%),當(dāng)緩沖區(qū)內(nèi)數(shù)據(jù)量達(dá)到高位時(shí),我們?cè)诮邮斩藢?CTS 線置低電平(送邏輯 0),當(dāng)發(fā)送端的程序檢測(cè)到 CTS 為低后,就停止發(fā)送數(shù)據(jù),直到接收端緩沖區(qū)的數(shù)據(jù)量低于低位而將 CTS 置高電平。RTS 則用來(lái)標(biāo)明接收設(shè)備有沒(méi)有準(zhǔn)備好接收數(shù)據(jù)。

常用的流控制還有還有 DTR/ R(數(shù)據(jù)終端就緒/數(shù)據(jù)設(shè)置就緒)。我們?cè)诖瞬辉僭斒觥?/p>

打開(kāi)我們的底板原理圖,查找 M7 用于串行通信的串口,如圖所示:

如圖所示,可知 M7 核使用的串口為 UART4,然后繼續(xù)查找這個(gè)編號(hào)。

在這個(gè)原理圖下,可以查知其所接插座對(duì)應(yīng)引腳的網(wǎng)絡(luò)編號(hào)為 UART4_TXD 與

UART4_RXD,然后在核心板的原理圖下查找此網(wǎng)絡(luò)編號(hào)

如圖所示,便可以得到所用串口的 RXD 與 TXD 連接芯片的引腳為 AJ5 與 AH3。

? 連接調(diào)試串口

按照上圖圈出的 M7 調(diào)試串口(下向上分別為 5V、M4_TX、M4_RX、A53_TX、A53_RX、

GND)。這里我們只連接 GND、M7_RX、M7_TX 三條線。

主要控制器配置

主要用到的寄存器如下,因?yàn)椴⒉皇敲總€(gè)寄存器的所有位都會(huì)用到,這里只是介紹每個(gè)

寄存器中所用到的某幾位。

程序編寫

首先介紹一下程序中用到的比較重要的結(jié)構(gòu)體。

? struct _uart_config:此結(jié)構(gòu)體用于對(duì) UART 串口進(jìn)行配置

? struct _uart_transfer:UART 傳輸結(jié)構(gòu)體,一般傳輸數(shù)據(jù)時(shí)會(huì)用到此結(jié)構(gòu)體

然后介紹一下用到的函數(shù)。

? status_t UART_Init 函數(shù)

? status_t UART_TransferSendNonBlocking 函數(shù)

? status_t UART_TransferReceiveNonBlocking 函數(shù)

? void UART_TransferCreateHandle 函數(shù)

這里只提供部分重要代碼,如想查看部分函數(shù)里的詳細(xì)實(shí)現(xiàn),請(qǐng)打開(kāi)光盤資料對(duì)應(yīng)的工

程【資料光盤\華清遠(yuǎn)見(jiàn)-I.MX8M Plus 開(kāi)發(fā)資料\程序源碼\CoertxM7\iuart_interrupt_transfer_task】。

?在此程序中,第 12 行至 18 行完成對(duì)開(kāi)發(fā)板以及內(nèi)核的初始化,在第 29 行得到串口的默

認(rèn)配置,然后在 30 行至 33 行,對(duì)串口進(jìn)行修改配置,包括設(shè)置串口波特率和接收 FIFO 的大小、使能 TX 與 RX。完成以后在 35 行對(duì)串口進(jìn)行初始化。在 41 行初始化 UART 句柄,在此用戶需要自定義一個(gè)回調(diào)函數(shù) UART_UserCallback,此回調(diào)函數(shù)用于判斷狀態(tài)標(biāo)志。

在 while 中,54 行判斷是否在接收數(shù)據(jù)以及接收緩沖區(qū)是否為空,滿足條件時(shí)開(kāi)始接收

數(shù)據(jù),將接收到的數(shù)據(jù)放到 g_rxBuffer 中。在 68 行判斷發(fā)送緩沖區(qū)是否為空以及接收緩沖區(qū)是否為滿,符合條件時(shí)將接收緩沖區(qū)的內(nèi)容復(fù)制到發(fā)送緩沖區(qū)中。61 行判斷是否正在進(jìn)行發(fā)送數(shù)據(jù)以及發(fā)送緩沖區(qū)是否為滿,當(dāng)滿足條件時(shí)將 g_txBuffer 中的數(shù)據(jù)發(fā)送出去。最終實(shí)現(xiàn)字符串的接收與發(fā)送。另外,在本程序中,緩沖區(qū)大小 ECHO_BUFFER_LENGTH 定義為 8,因此每次發(fā)送、接收都是八個(gè)字符。程序運(yùn)行參考《Cortex-M7 協(xié)處理器的啟動(dòng)》小節(jié)即可。實(shí)驗(yàn)結(jié)果如下:

FreeRTOS 實(shí)時(shí)操作系統(tǒng)應(yīng)用

FreeRTOS 基本接口介紹

RTOS 全稱為 Real Time Operation System,即實(shí)時(shí)操作系統(tǒng)。RTOS 強(qiáng)調(diào)的是實(shí)時(shí)性,又

分為硬實(shí)時(shí)和軟實(shí)時(shí)。硬實(shí)時(shí)要求在規(guī)定的時(shí)間內(nèi)必須完成操作,不允許超時(shí);而軟實(shí)時(shí)里

對(duì)處理過(guò)程超時(shí)的要求則沒(méi)有很嚴(yán)格。RTOS 的核心就是任務(wù)調(diào)度

FreeRTOS 是 RTOS 的一種,尺寸非常小,可運(yùn)行于微控制器上。微控制器是尺寸小,資

源受限的處理器,它在單個(gè)芯片上包含了處理器本身、用于保存要執(zhí)行的程序的只讀存儲(chǔ)器

(ROM 或 Flash)、所執(zhí)行程序需要的隨機(jī)存取存儲(chǔ)器(RAM),一般情況下程序直接從只

讀存儲(chǔ)器執(zhí)行FreeRTOS 作為一種嵌入式系統(tǒng)使用的開(kāi)源實(shí)時(shí)操作系統(tǒng),也可以支持許多不同硬件架構(gòu)以及交叉編譯器。

下面介紹一下 FreeRTOS 操作系統(tǒng)常用到的功能函數(shù),主要如下:

? xTaskCreate 函數(shù)

? xTaskCreate 函數(shù)

? UART_RTOS_Receive 函數(shù)

? UART_RTOS_Send 函數(shù)

? xSemaphoreCreateBinary(void) 函數(shù)

? xSemaphoreGive(xSemaphore) 函數(shù)

? SemaphoreTake(SemaphoreHandle_t xSemaphore,TickType_t xBlockTime) 函數(shù)

基于 FreeRTOS 的按鍵點(diǎn)燈控制系統(tǒng)

本次實(shí)驗(yàn)是通過(guò)一個(gè)按鍵來(lái)控制 LED 燈的點(diǎn)亮與熄滅,整個(gè)程序的控制流程圖如下所示:

主要代碼如下,這里只提供部分重要代碼,如想查看部分函數(shù)里的詳細(xì)實(shí)現(xiàn),請(qǐng)打開(kāi)光

盤 資 料對(duì) 應(yīng)的 工程【 資 料光 盤\華 清遠(yuǎn)見(jiàn) -I.MX8M Plus 開(kāi)發(fā) 資 料\程 序源 碼 \CoertxM7\freertos_sem_test】。

在主函數(shù)中,第 4 行與 11 行定義了兩個(gè)信號(hào)量,在 18 行和 25 行創(chuàng)建了兩個(gè)任務(wù),然后在 33 行開(kāi)始運(yùn)行任務(wù)。

在 producer_task 任務(wù)中,43 行阻塞等待按鍵是否按下,當(dāng)滿足條件時(shí),45 行釋放

xSemaphore_consumer 信號(hào)量。在 consumer_task 任務(wù)中,獲取到 xSemaphore_consumer 信號(hào)量以后,執(zhí)行點(diǎn)燈操作,然后再釋放 xSemaphore_producer 信號(hào)量,此時(shí) producer_task 任務(wù)獲取到這個(gè)信號(hào)量以后,再執(zhí)行滅燈操作。

程序運(yùn)行參考《Cortex-M7 協(xié)處理器的啟動(dòng)》小節(jié)即可。

Cortex-M7 端多核通訊的實(shí)現(xiàn)

此開(kāi)發(fā)板支持 Cortex-M7 與 Cortex-A53 兩個(gè)核心,所謂多核通信即指 Cortex-M7 核與

Cortex-A53 核之間進(jìn)行數(shù)據(jù)交互。

在實(shí)現(xiàn)多核通信時(shí),需要用到一些協(xié)議庫(kù),主要包括:

(1) 嵌入式遠(yuǎn)程過(guò)程調(diào)用(eRPC):該組件是庫(kù)和代碼生成器工具的組合,實(shí)現(xiàn)了對(duì)遠(yuǎn)程

服務(wù)(運(yùn)行在不同的核心上)的透明函數(shù)調(diào)用接口。

(2) 多核管理器(MCMGR):這個(gè)庫(kù)維護(hù)所有核的信息,并啟動(dòng)輔助核。

?其主要功能主要如下:

? 維護(hù)系統(tǒng)中所有核心的信息

? 二次/輔助核心啟動(dòng)和關(guān)閉

? 遠(yuǎn)程核心監(jiān)控和事件處理

(3) (RPMsg-Lite):處理器間通信庫(kù)。

這里需要提到 RPMsg 協(xié)議,RPMSG 全稱 Remote Processor Messaging,其定義了一個(gè)標(biāo)

準(zhǔn)的二進(jìn)制接口,用于異構(gòu)多核系統(tǒng)中多個(gè)核之間的通信。RPMsg 作為處理器間的消息傳輸總線,其中每個(gè)處理器都是總線上的器件。它允許內(nèi)核驅(qū)動(dòng)程序與系統(tǒng)上的遠(yuǎn)程處理器進(jìn)行通信,同時(shí),驅(qū)動(dòng)程序可以根據(jù)需要公開(kāi)適當(dāng)?shù)挠脩艨臻g接口。與遺留的 OpenAMP 實(shí)現(xiàn)相比,RPMsg-Lite 提供了代碼大小的縮減、API 的簡(jiǎn)化和改進(jìn)的模塊化。

RPMsg 協(xié)議的主要特點(diǎn):

? 共享內(nèi)存處理器間通信

? 基于 virtio 的消息傳遞總線

? 端點(diǎn)之間發(fā)送的應(yīng)用程序定義的消息

? 可移植到不同的環(huán)境/平臺(tái)

? 在 upstream Linux 操作系統(tǒng)可用

基于此,本次實(shí)驗(yàn)主要實(shí)現(xiàn) Cortex-M7 與 Cortex-A53 之間的數(shù)據(jù)傳輸。

Cortex-M7 端程序?qū)崿F(xiàn)

首先介紹一下 Cortex-M7 部分主要使用的庫(kù)函數(shù):

? *rpmsg_lite_remote_init 函數(shù)

M7 端程序主要如下,這里只提供部分重要代碼,如想查看部分函數(shù)里的詳細(xì)實(shí)現(xiàn),請(qǐng)打

開(kāi)光盤資料對(duì)應(yīng)的工程【資料光盤\華清遠(yuǎn)見(jiàn)-I.MX8M Plus 開(kāi)發(fā)資料\程序源碼\CoertxM7\multicore-communication\rpmsg_lite_str_echo_rtos_imxcm7_test】。

?

在本次 A53 與 M7 的多核通信中,主要實(shí)現(xiàn)的效果如下:A53 核向 M7 循環(huán)發(fā)送“LED

ON”或“LED OFF”的指令,M7 接收指令以后,分別控制 LED 燈的亮滅,同時(shí)再向 A53 發(fā)

送“l(fā)ed on”或“l(fā)ed off”的字符串。

首先在主函數(shù)中,第 6 行至 12 行完成對(duì)開(kāi)發(fā)板以及內(nèi)核的初始化,然后在第 19 行通過(guò)

FreeRTOS 創(chuàng)建了一個(gè)任務(wù)。之后運(yùn)行到這個(gè)任務(wù)中,先定義一些程序中所需要的變量,在 50

行初始化堆棧,會(huì)得到一個(gè)實(shí)例指針,52 行阻塞等待 M7 與 A53 是否已經(jīng)鏈接,當(dāng)鏈接成功以后,繼續(xù)往下運(yùn)行,然后再 55、56 行創(chuàng)建所需要的隊(duì)列和 RPMSG 端點(diǎn),這些用于數(shù)據(jù)發(fā)送與接收。

進(jìn)入到 for 循環(huán)以后,在 64 行阻塞接收數(shù)據(jù),85 行與 92 行判斷是否為控制 LED 燈指令,進(jìn)而執(zhí)行亮燈或滅燈操作,然后在 100 行回復(fù)相對(duì)應(yīng)的字符串。

程序運(yùn)行參考《Cortex-M7 協(xié)處理器的啟動(dòng)》小節(jié)即可。

Cortex-A53 端程序?qū)崿F(xiàn)

A53 端程序主要如下,這里只提供部分重要代碼,如想查看部分函數(shù)里的詳細(xì)實(shí)現(xiàn),請(qǐng)

打開(kāi)光盤資料對(duì)應(yīng)的工程【資料光盤\華清遠(yuǎn)見(jiàn)-I.MX8M Plus 開(kāi)發(fā)資料\程序源碼\CoertxM7\multicore-communication\multicore-A53】。

Multicore-a53.c

在 A53 程序中,第 3 行至第 7 行定義了程序中需要的變量,其中第 5 行定義的結(jié)構(gòu)體用于提供健全的線路設(shè)置集合,主要配置 M7 與 A53 雙核通信的串口通道。在 11 行打開(kāi)我們所使用的通道,第 20 行至 37 行完成對(duì)結(jié)構(gòu)體成員的配置。

在 while 循環(huán)中,調(diào)用 write 函數(shù)分別發(fā)送“LED ON”或者“LED OFF”的字符串,每

次發(fā)送完都使用 read 接收 M7 核返回的數(shù)據(jù),進(jìn)行循環(huán)運(yùn)行。

對(duì)于 A53 部分,程序編寫完成以后,下一步需要進(jìn)行編譯。編譯之前,需要先安裝 imxrobot-xwayland 交叉編譯工具鏈,安裝過(guò)程可參考《交叉編譯工具鏈安裝》小節(jié)。

? 導(dǎo)入 SDK

linux@ubuntu: $ source /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-li

Nux

驗(yàn)證開(kāi)發(fā)工具是否安裝正確,顯示版本信息如下圖所示。

linux@ubuntu: $ $CC --version

? 編譯并執(zhí)行

編譯前請(qǐng)確保 SDK 已經(jīng)導(dǎo)入,前面我們已經(jīng)導(dǎo)入了 SDK。另外還需要添加一個(gè) Makefile

文件,我們?cè)谠创a路徑下提供了編寫好的 Makefile 文件,可以直接使用,執(zhí)行 make 編譯即可生成 test 可以執(zhí)行程序。

linux@ubuntu: $ make

運(yùn)行程序

將上一步生成的 test 可執(zhí)行程序,導(dǎo)入到目標(biāo)板。這里使用 scp 的方式。

linux@ubuntu: $ scp test root@192.168.100.100:~

這里 root 為目標(biāo)板的用戶名,192.168.100.100 為目標(biāo)板的 IP 地址,~為目標(biāo)板的家目錄。

程序執(zhí)行步驟

程序編寫完成以后,打開(kāi)用于連接 A53 核的串口,啟動(dòng)到 u-boot 狀態(tài),另外再打開(kāi)連接M7 核的串口,然后啟動(dòng) Cortex-M7 協(xié)處理器,顯示如下:

另外對(duì)于 A53 核,在 u-boot 狀態(tài),我們需要設(shè)置一下環(huán)境變量

u-boot=> setenv fdt_file imx8mp-ai-robot-rpmsg.dtb

u-boot=> save

Saving Environment to MMC... Writing to MMC(1)... OK

然后可以執(zhí)行 boot 啟動(dòng)到內(nèi)核

u-boot=> boot

進(jìn)入到內(nèi)核之前,需要輸入登錄密碼,密碼為 root

此時(shí)在 M7 核程序中已經(jīng)判斷連接成功,便會(huì)再打印一條語(yǔ)句,如下所示:

A53 進(jìn)入到內(nèi)核以后,首先需要加載一個(gè)驅(qū)動(dòng)文件,這個(gè)文件用于產(chǎn)生 M7 與 A53 雙核通信的通道,同時(shí)在執(zhí)行 A53 核程序以后,還會(huì)向 M7 發(fā)送“hello world!”字符串。

root@imx-robot-kinetic:~# modprobe imx_rpmsg_tty

此時(shí)查看 dev 目錄下 tty 設(shè)備,可以看到多出了一個(gè) RPMSG 的串口,這個(gè)便就是用于

A53 與 M7 雙核通信。

將 A53 核程序生成的可執(zhí)行文件發(fā)送到開(kāi)發(fā)板中,在開(kāi)發(fā)板終端下進(jìn)行執(zhí)行。

root@imx-robot-kinetic:~# ./test /dev/ttyRPMSG30

運(yùn)行結(jié)果分別如下


基于imx8m plus開(kāi)發(fā)板全體系開(kāi)發(fā)教程5:Cortex-M7開(kāi)發(fā)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
合肥市| 玉溪市| 建水县| 云林县| 道孚县| 介休市| 玛多县| 申扎县| 碌曲县| 海丰县| 太康县| 宜丰县| 广宁县| 桃江县| 逊克县| 平塘县| 贵港市| 安乡县| 旅游| 建水县| 陇西县| 花莲县| 利辛县| 邮箱| 吴旗县| 东光县| 临澧县| 同江市| 沅江市| 江津市| 临武县| 西林县| 宣城市| 宜川县| 都匀市| 龙岩市| 石林| 金华市| 伊吾县| 牡丹江市| 临潭县|