大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是超級(jí)下載算法開(kāi)發(fā)筆記(1)之執(zhí)行在不同 CM 內(nèi)核下。
文接上篇 《RT-UFL - 一個(gè)適用全平臺(tái) i.MXRT 的超級(jí)下載算法設(shè)計(jì)》,痞子衡開(kāi)源的這個(gè)項(xiàng)目已經(jīng)正式啟動(dòng)了。痞子衡說(shuō)過(guò)會(huì)記錄 RT-UFL 項(xiàng)目開(kāi)發(fā)過(guò)程所有疑難點(diǎn)及其解決方法,和大家分享下載算法設(shè)計(jì)背后的奧秘。
本篇是開(kāi)發(fā)筆記第一篇,咱們重點(diǎn)聊聊這個(gè)項(xiàng)目的立身之本,即如何做到一個(gè) .FLM(其實(shí)就是最終的可執(zhí)行機(jī)器碼)能在所有 i.MXRT 芯片下均能正常運(yùn)行。
?
一、從嵌入式程序角度看 i.MXRT 家族差異
因?yàn)槌?jí)下載算法要運(yùn)行于所有 i.MXRT 型號(hào)下,首先我們得知道 i.MXRT 家族一共有哪些型號(hào)、這些不同型號(hào)間差異是什么,哪些差異是影響超級(jí)下載算法的主要因素。
下表是當(dāng)前 i.MXRT 家族已面世的全部 9 款型號(hào)(注:部分型號(hào)下不止一款芯片,但僅是內(nèi)部外設(shè)數(shù)量差別):
雖然從芯片本身角度去細(xì)看差異會(huì)比較多,但我們可以從一個(gè)嵌入式程序最根本的三大要素(指令、外設(shè)操作、鏈接空間)來(lái)逐一定向分析:
從上表我們可以看出 i.MXRT 都是基于 ARM Cortex-M 內(nèi)核的,這其實(shí)是整個(gè)項(xiàng)目立項(xiàng)最重要的基礎(chǔ),它們的指令集一脈相承。不過(guò)雖然都是 Cortex-M 內(nèi)核,但是涉及到三個(gè)內(nèi)核處理器版本(M4、M7、M33),因此設(shè)計(jì)超級(jí)下載算法時(shí)第一要考慮的就是處理器版本差異。
再?gòu)耐庠O(shè)角度來(lái)看,超級(jí)下載算法代碼可能涉及操作芯片內(nèi)部的 Clock(時(shí)鐘)、IOMUXC(引腳)、FlexSPI(Flash 控制器)等外設(shè),這些外設(shè)會(huì)有差異,但并不重要,我們可以為不同 i.MXRT 型號(hào)引入不同代碼處理分支。
最后從鏈接空間來(lái)看,超級(jí)下載算法是要加載到內(nèi)部 RAM 去執(zhí)行的,這些 i.MXRT 內(nèi)部 RAM 大小不一,并且在系統(tǒng)映射地址空間中的地址也略有不同,但也不重要,如果你看過(guò)痞子衡之前寫(xiě)的文章 《串行 NOR Flash 下載算法(Keil MDK 工具篇) 》,你應(yīng)該知道下載算法代碼都是位置無(wú)關(guān)鏈接,其加載地址可以不固定(由配套 xml 文件或 IDE 工程設(shè)置中額外指定),因此 RAM 的差異也不重要。
?
二、解決 Cortex-M 處理器不同版本指令差異
經(jīng)過(guò)上一節(jié)的分析,我們知道解決超級(jí)下載算法在 i.MXRT 全系列下運(yùn)行最重要的問(wèn)題就是處理不同 Cortex-M 內(nèi)核指令差異。
在解決指令差異問(wèn)題前,有一個(gè)重要問(wèn)題痞子衡不得不澄清,那就是不同 Cortex-M 芯片其中斷向量表序列定義并不同,前 16 個(gè)是系統(tǒng)向量,這是由 ARM 規(guī)定的,但后面的中斷向量均是由廠商自定義的。不同芯片型號(hào)下,同一類(lèi)型外設(shè)分配的向量號(hào)并不一定相同,因此對(duì)于一些異構(gòu)雙核下跑的嵌入式程序,需要處理中斷向量表差異。但是這對(duì)于下載算法來(lái)說(shuō),不是個(gè)問(wèn)題,因?yàn)橄螺d算法不是一般的嵌入式程序,其不含中斷向量表,這意味著下載算法中沒(méi)有使用中斷響應(yīng)函數(shù),不能開(kāi)啟外設(shè)中斷(這是位置無(wú)關(guān)鏈接導(dǎo)致的)。
好,我們現(xiàn)在來(lái)解決指令差異問(wèn)題。查看 ARM 官方資料得知,Cortex-M 家族共有 10 款處理器(M0、M0+、M1、M3、M23、M4、M33、M35P、M7、M55),分屬四個(gè)架構(gòu)規(guī)范(ARMv6-M、ARMv7-M、ARMv8-M、ARMv8.1-M),架構(gòu)主要和指令集息息相關(guān)。
再來(lái)看兩張 Cortex-M 指令集關(guān)系圖,從圖里我們可以看出 Cortex-M0/M0+/M1 處理器基于 ARMv6-M 架構(gòu),這是一個(gè)只支持 56 條指令的小指令集(藍(lán)色粗框標(biāo)出),所有 Cortex-M 處理器都支持這個(gè) 56 條指令的指令集。
看到這你是不是有所領(lǐng)悟?ARM 公司其實(shí)為了能讓 Cortex-M 用戶的軟件能重用,特地在設(shè)計(jì) Cortex-M 處理器時(shí)為其賦予了處理器向下兼容、軟件二進(jìn)制向上兼容特性。通俗地說(shuō)就是在較低版本 Cortex-M 處理器上編譯出來(lái)的機(jī)器碼可以在較高版本 Cortex-M 處理器上直接執(zhí)行。
因此為了實(shí)現(xiàn)超級(jí)下載算法在 i.MXRT 全系列上(M4、M7、M33)運(yùn)行,我們只需要做一件事,那就是編譯生成算法文件的源 MDK 工程設(shè)置里選擇 Cortex-M0 處理器就行,是不是超級(jí)簡(jiǎn)單?如果你下載了 CMSIS_5 包,里面的下載算法模板工程默認(rèn)處理器就是 ARMCM0,這并不只是個(gè)偶然!
至此,超級(jí)下載算法開(kāi)發(fā)筆記(1)之執(zhí)行在不同 CM 內(nèi)核下痞子衡便介紹完畢了,掌聲在哪里~~~