本篇是超級下載下傳算法開發筆記第一篇,咱們重點聊聊這個項目的立身之本,即如何做到一個.FLM(其實就是最終的可執行機器碼)能在所有i.MXRT晶片下均能正常運作。
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是超級下載下傳算法開發筆記(1)之執行在不同CM核心下。
文接上篇 《RT-UFL - 一個适用全平台i.MXRT的超級下載下傳算法設計》,痞子衡開源的這個項目已經正式啟動了。痞子衡說過會記錄 RT-UFL 項目開發過程所有疑難點及其解決方法,和大家分享下載下傳算法設計背後的奧秘。
本篇是開發筆記第一篇,咱們重點聊聊這個項目的立身之本,即如何做到一個.FLM(其實就是最終的可執行機器碼)能在所有i.MXRT晶片下均能正常運作。
因為超級下載下傳算法要運作于所有i.MXRT型号下,首先我們得知道i.MXRT家族一共有哪些型号、這些不同型号間差異是什麼,哪些差異是影響超級下載下傳算法的主要因素。
下表是目前i.MXRT家族已面世的全部9款型号(注:部分型号下不止一款晶片,但僅是内部外設數量差别):

雖然從晶片本身角度去細看差異會比較多,但我們可以從一個嵌入式程式最根本的三大要素(指令、外設操作、連結空間)來逐一定向分析:
從上表我們可以看出i.MXRT都是基于ARM Cortex-M核心的,這其實是整個項目立項最重要的基礎,它們的指令集一脈相承。不過雖然都是Cortex-M核心,但是涉及到三個核心處理器版本(M4、M7、M33),是以設計超級下載下傳算法時第一要考慮的就是處理器版本差異。
再從外設角度來看,超級下載下傳算法代碼可能涉及操作晶片内部的Clock(時鐘)、IOMUXC(引腳)、FlexSPI(Flash控制器)等外設,這些外設會有差異,但并不重要,我們可以為不同i.MXRT型号引入不同代碼處理分支。
最後從連結空間來看,超級下載下傳算法是要加載到内部RAM去執行的,這些i.MXRT内部RAM大小不一,并且在系統映射位址空間中的位址也略有不同,但也不重要,如果你看過痞子衡之前寫的文章 《串行NOR Flash下載下傳算法(Keil MDK工具篇) 》,你應該知道下載下傳算法代碼都是位置無關連結,其加載位址可以不固定(由配套xml檔案或IDE工程設定中額外指定),是以RAM的差異也不重要。
經過上一節的分析,我們知道解決超級下載下傳算法在i.MXRT全系列下運作最重要的問題就是處理不同Cortex-M核心指令差異。
在解決指令差異問題前,有一個重要問題痞子衡不得不澄清,那就是不同Cortex-M晶片其中斷向量表序列定義并不同,前16個是系統向量,這是由ARM規定的,但後面的中斷向量均是由廠商自定義的。不同晶片型号下,同一類型外設配置設定的向量号并不一定相同,是以對于一些異構雙核下跑的嵌入式程式,需要進行中斷向量表差異。但是這對于下載下傳算法來說,不是個問題,因為下載下傳算法不是一般的嵌入式程式,其不含中斷向量表,這意味着下載下傳算法中沒有使用中斷響應函數,不能開啟外設中斷(這是位置無關連結導緻的)。
好,我們現在來解決指令差異問題。檢視ARM官方資料得知,Cortex-M家族共有10款處理器(M0、M0+、M1、M3、M23、M4、M33、M35P、M7、M55),分屬四個架構規範(ARMv6-M、ARMv7-M、ARMv8-M、ARMv8.1-M),架構主要和指令集息息相關。
再來看兩張Cortex-M指令集關系圖,從圖裡我們可以看出Cortex-M0/M0+/M1處理器基于ARMv6-M架構,這是一個隻支援56條指令的小指令集(藍色粗框标出),所有Cortex-M處理器都支援這個56條指令的指令集。
看到這你是不是有所領悟?ARM公司其實為了能讓Cortex-M使用者的軟體能重用,特地在設計Cortex-M處理器時為其賦予了處理器向下相容、軟體二進制向上相容特性。通俗地說就是在較低版本Cortex-M處理器上編譯出來的機器碼可以在較高版本Cortex-M處理器上直接執行。
是以為了實作超級下載下傳算法在i.MXRT全系列上(M4、M7、M33)運作,我們隻需要做一件事,那就是編譯生成算法檔案的源MDK工程設定裡選擇Cortex-M0處理器就行,是不是超級簡單?如果你下載下傳了CMSIS_5包,裡面的下載下傳算法模闆工程預設處理器就是ARMCM0,這并不隻是個偶然!
至此,超級下載下傳算法開發筆記(1)之執行在不同CM核心下痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、知乎首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。