痞子衡最近在深耕i.MXRT1170這顆劃時代的MCU,已經寫了不少篇相關技術文章,涉及整體特點、Raw NAND啟動、FlexRAM子產品、ECC特性等,文章寫得越多越發覺得i.MXRT1170是座寶礦,值得大家去仔細探索。話不多說,咱們繼續挖礦吧,今天痞子衡為大家介紹i.MXRT1170雙核間互相激活的方法。
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是恩智浦i.MXRT1170上Cortex-M7與Cortex-M4核心互相激活的方法。
痞子衡最近在深耕i.MXRT1170這顆劃時代的MCU,已經寫了不少篇相關技術文章,涉及整體特點、Raw NAND啟動、FlexRAM子產品、ECC特性等,文章寫得越多越發覺得i.MXRT1170是座寶礦,值得大家去仔細探索。話不多說,咱們繼續挖礦吧,今天痞子衡為大家介紹i.MXRT1170雙核間互相激活的方法。
雙核是i.MXRT1170除了1GHz主頻之外的第二個顯著特點,i.MX RT系列也是從RT1170開始首次引入了雙核架構。i.MXRT1170包含了一個Cortex-M7核心(1GHz)以及一個Cortex-M4核心(400MHz),超強的Cortex-M7核心專注于音視訊識别與處理、千兆以太網通訊控制等複雜任務上;低功耗Cortex-M4核心則做一些相對簡單的鍵盤響應、傳感器采集、電機控制等任務,即如下圖所示:

i.MXRT1170雖然是雙核(Cortex-M7與Cortex-M4),但這兩個核并沒有确定的主從關系,i.MXRT1170系統設計裡每個核都既可以當主核也可以當從核(預設CM7是主核,CM4是從核),使用者設定了主從關系之後,晶片上電後先從主核啟動,然後由主核來激活從核啟動。
主核是在eFuse中標明的,fusemap中0x960[13:12]對應的是BT_CORE_CTRL和BT_CORE_SEL bit,預設兩個bit都是0,即從CM7是主核,上電CM7啟動,如果需要更改主核為CM4,則需要燒寫eFuse。
這裡順便插一句,我們知道晶片上電都是先執行BootROM代碼,既然CM7和CM4都可以當主核,那麼這個BootROM代碼需要既可以在CM4下執行,也可以在CM7下執行。這裡借助的是Cortex-M處理器向下相容、軟體二進制向上相容的特性,BootROM代碼使用Cortex-M4指令集去編譯即可。
標明了主核之後,主核App由BootROM加載執行,我們需要在主核App裡添加代碼來啟動從核。啟動從核的第一步是加載從核App,App從加載執行位置上可分為兩種,一種是在Flash裡原地執行,另一個是拷貝到RAM裡執行,隻有後者才需要先加載再執行。
關于從核App執行位置,這裡有必要好好聊一下,下面是CM7和CM4下各自系統記憶體映射表,從表裡可以看到除了各自核心TCM空間僅對自己可見外,其餘位址空間對兩個核均是可見的(并且映射位址也是相同的)。如果加載的從核App是在TCM裡執行的,主核需要将從核App加載到從核TCM對應的OCRAM空間(此種情況僅适用CM4當從核,其TCM對應的是OCRAM(M4)空間;CM7當從核時其TCM對應的空間CM4是無法通路的);如果加載的從核App不是在TCM裡執行的,那麼情況就比較簡單,直接加載到那個目标映射位址空間即可。
下面是加載從核App示例代碼,appBuffer是從核App Image在外部Flash裡存放的首位址,vectorAddr是加載的目标RAM首位址。為了防止Cache幹擾後續從核取複位向量執行,主核在加載App前後最好均要清一下DCache。
加載從核App完成之後,接下來便是設定從核啟動所需的中斷向量表位置,從核需要從中斷向量表裡取出初始棧位址(SP)和複位向量(PC)來執行。
CM7啟動初始向量表位址設定在IOMUXC_LPSR_GPR26裡(對應SCB->VTOR[31:7]),CM4啟動初始向量表位址設定在IOMUXC_LPSR_GPR0/1裡(對應SCB->VTOR[31:3])。
Note: A0版本晶片CM7啟動初始向量表設定在IOMUXC_GPR19裡;B0版本晶片CM7啟動初始向量表設定改到了IOMUXC_LPSR_GPR26裡。
下面是設定從核啟動初始中斷向量表位址的示例代碼:
此時從核已經摩拳擦掌,等待來自主核的最後激活指令了。激活控制是在SRC->SCR寄存器裡實作的,将BT_RELEASE_Mx位置1即可啟動CMx從核。這裡需要注意一點,如果是在調試,從核有可能已經被調試器的腳本激活過了,那麼此時僅需要reset一下從核即可。
下面是激活從核啟動的示例代碼:
最後給一個完整示例,主核是CM7,從核是CM4,從核App代碼存儲在0x60010000位址,App長度是32KB,從核APP是從ITCM起始位址(0x1FFE0000)開始連結的。CM7激活CM4完整代碼如下:
至此,恩智浦i.MXRT1170上Cortex-M7與Cortex-M4核心互相激活的方法痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、知乎首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。