多核的微控制器(MCU)向來(lái)是設(shè)計(jì)上的一大挑戰(zhàn),尤其是多核異構(gòu)的設(shè)計(jì)。恩智浦半導(dǎo)體早在2011年年底,就率先推出了基于Cortex-M4F和Cortex-M0的雙核MCU——LPC43xx/43Sxx系列, 主頻高達(dá)204MHz。憑借其超強(qiáng)的處理性能,很快受到業(yè)界的好評(píng)。四年之后,MCU雙核精簡(jiǎn)版本LPC5411x系列,在廣大LPC發(fā)燒友的期待中,終于露出了一代天驕的本色。
雙核MCU:LPC5411x
這款LPC5411x系列MCU集成了Cortex-M4F和Cortex-M0+雙內(nèi)核,主頻高達(dá)100MHz 。因?yàn)镃ortex-M4F內(nèi)核采用Harvard架構(gòu),3級(jí)流水線,支持SIMD,支持單精度浮點(diǎn)運(yùn)算,單個(gè)時(shí)鐘周期就能完成一條乘累加(MAC)指令,所以其處理性能強(qiáng)悍,一般用于處理復(fù)雜的計(jì)算或算法。而Cortex-M0+內(nèi)核結(jié)構(gòu)簡(jiǎn)單,只有2級(jí)流水線,能效高,一般用于實(shí)時(shí)控制、外設(shè)管理、數(shù)據(jù)通信等任務(wù)。
在LPC5411x產(chǎn)品中Cortex-M4F是主核,而Cortex-M0+是從核。從核的主要任務(wù)是協(xié)助主核處理非計(jì)算性的雜務(wù),充分解放主核的運(yùn)算能力,這樣可以達(dá)到整個(gè)系統(tǒng)的最優(yōu)性能。
為了實(shí)現(xiàn)整體性能最優(yōu),LPC5411x采用了多層AHB矩陣式總線架構(gòu),以及多個(gè)RAM分塊。下圖是LPC5411x的內(nèi)部功能框圖,可以看到內(nèi)部的AHB矩陣式總線架構(gòu),Cortex-M4F和M0+都是總線上的master,可以訪問(wèn)所有的片上資源??偩€訪問(wèn)的優(yōu)先級(jí)可以通過(guò)寄存器設(shè)定。
Cortex-M4F核在AHB總線上有3個(gè)接口:I-code, D-code和System總線。而Cortex-M0+只有一個(gè)System總線接口。不同的RAM塊可以被不同的AHB master同時(shí)訪問(wèn)。
雙核MCU的存儲(chǔ)區(qū)分配
I-code總線用于從CODE內(nèi)存分區(qū)取指令, 地址范圍是:0x0000-0000~0x1FFF-FFFF。D-code總線用于從CODE內(nèi)存分區(qū)取操作數(shù),地址范圍是:0x0000-0000~0x1FFF-FFFF。
當(dāng)以上兩條總線同時(shí)訪問(wèn)同一內(nèi)存單元時(shí),D-code總線訪問(wèn)優(yōu)先級(jí)比I-code高,所以D-code先訪問(wèn)。對(duì)地址范圍從0x2000-0000~0xDFFF-FFFF的訪問(wèn)是通過(guò)System總線進(jìn)行的,可用于訪問(wèn)操作數(shù)、指令等,數(shù)據(jù)訪問(wèn)的優(yōu)先級(jí)高于取指令及中斷向量。
各個(gè)存儲(chǔ)區(qū)所在的地址區(qū)域如下表:
存儲(chǔ)區(qū) | 地址區(qū)域 | 大小 |
Flash |
0x0000-0000 ~ 0x0003-FFFF |
256KB |
Boot ROM |
0x0300-0000 ~ 0x0300-7FFF |
32KB |
SRAMX |
0x0400-0000 ~ 0x0400-7FFF |
32KB |
SRAM0 |
0x2000-0000 ~ 0x2000-FFFF |
64KB |
SRAM1 |
0x2001-0000 ~ 0x2001-FFFF |
64KB |
SRAM2 |
0x2002-0000 ~ 0x2002-7FFF |
32KB |
為優(yōu)化系統(tǒng)整體處理能力,需要讓這兩個(gè)CPU內(nèi)核同時(shí)以最快速度執(zhí)行各自指令, 比如Cortex-M4F上能執(zhí)行單周期的的MAC指令,同時(shí)Cortex-M0+上能執(zhí)行單周期的32位乘法。
因此,存儲(chǔ)區(qū)的合理分配策略是,F(xiàn)lash和RAMX以及SRAM0需要分配給Cortex-M4F內(nèi)核,分別用于存放指令代碼和操作數(shù)(見上圖紅/黃框部分)。而SRAM1/SRAM2這兩塊需要分給Cortex-M0+(見上圖綠色框部分)。 需要注意的是,只要其中一個(gè)RAM塊分配給某個(gè)CPU核,這個(gè)RAM塊就不能分配給另一個(gè)CPU核, 否則這兩個(gè)CPU核同時(shí)訪問(wèn)同一塊區(qū)域時(shí),就會(huì)出現(xiàn)總線爭(zhēng)用,而導(dǎo)致另一個(gè)CPU核訪問(wèn)出現(xiàn)等待周期,從而降低整個(gè)系統(tǒng)處理效率。
雙核運(yùn)行的功耗如何?
在回答這個(gè)問(wèn)題之前,讓我們看一下其實(shí)測(cè)的CoreMark動(dòng)態(tài)功耗圖吧:
以代碼放在Flash中運(yùn)行并且主頻為48MHz為例,Cortex-M4F動(dòng)態(tài)功耗大約為96uA/MHz,而Cortex-M0+為75uA/MHz。兩者之和為171uA/MHz,也就是說(shuō)雙核同時(shí)運(yùn)行時(shí)的功耗為8.2mA。這個(gè)功耗比許多其他廠家的單Cortex-M4F核的MCU還低,但性能要強(qiáng)很多。
當(dāng)然如果你比較關(guān)心功耗,可以根據(jù)應(yīng)用實(shí)際情況讓一個(gè)CPU內(nèi)核進(jìn)入低功耗模式,另一個(gè)CPU內(nèi)核工作,等到一定條件時(shí)再喚醒另一個(gè)核。
雙核之間怎么通信?
下面這張圖說(shuō)明了倆核之間的通信機(jī)制。
當(dāng)一個(gè)CPU內(nèi)核準(zhǔn)備好數(shù)據(jù)之后,通過(guò)互鎖信號(hào)放在共享RAM中,再通過(guò)郵箱機(jī)制產(chǎn)生中斷事件,通知另一個(gè)CPU內(nèi)核來(lái)處理。另一個(gè)CPU內(nèi)核處理完數(shù)據(jù)后,清理相應(yīng)的中斷標(biāo)志。通過(guò)這種方式可以實(shí)現(xiàn)實(shí)時(shí)性很強(qiáng)的雙核通信和數(shù)據(jù)交換。也可以不用互鎖信號(hào)和共享RAM,直接通過(guò)郵箱機(jī)制傳遞最多32位的數(shù)據(jù)。
另外一種簡(jiǎn)單的方法叫作消息隊(duì)列機(jī)制:直接在共享RAM中創(chuàng)建循環(huán)緩沖器用于消息隊(duì)列。當(dāng)一個(gè)CPU內(nèi)核準(zhǔn)備好數(shù)據(jù)之后,就把數(shù)據(jù)發(fā)送到這個(gè)隊(duì)列最后面(隊(duì)尾),而另一CPU內(nèi)核每次從這個(gè)隊(duì)列的最前面取數(shù)據(jù)。對(duì)每個(gè)隊(duì)列的訪問(wèn)是單向的,即一個(gè)CPU核只能寫,而另一個(gè)CPU內(nèi)核只能讀。要實(shí)現(xiàn)雙向,必須創(chuàng)建至少兩個(gè)隊(duì)列。 這種方法可以不用互鎖信號(hào),但可以使用中斷機(jī)制通知另一個(gè)CPU核,以便實(shí)現(xiàn)實(shí)時(shí)通信和數(shù)據(jù)交換。
雙核的開發(fā)很難嗎?
針對(duì)雙核以及多核體系架構(gòu),恩智浦提供了多核SDK開發(fā)庫(kù)(稱為MCSDK), 以及豐富的例程,包含在相應(yīng)多核平臺(tái)的MCUXpresso SDK 開發(fā)包中。 下圖顯示了MCSDK的架構(gòu):
eRPC即嵌入式遠(yuǎn)程過(guò)程調(diào)用(Embedded Remote Procedure Call),是一套實(shí)現(xiàn)調(diào)用另一核上遠(yuǎn)程服務(wù)的透明函數(shù)調(diào)用接口。MCMGR即多核管理器(Multicore Manager),是包含所有CPU內(nèi)核信息及啟動(dòng)從核的函數(shù)調(diào)用接口。RPMsg-Lite即遠(yuǎn)程處理器消息機(jī)制精簡(jiǎn)版(Remote Processor Messaging – Lite),包含了所有處理器間通信的函數(shù)庫(kù)。
這套庫(kù)支持市面上所有主流ARM Cortex-M軟件開發(fā)工具,包括IAR、KEIL、GCC,以及MCUXpresso IDE。
有了這套多核SDK開發(fā)庫(kù),用戶可以不用關(guān)心硬件底層的通信機(jī)制,直接使用相應(yīng)的例程和調(diào)用接口,幾分鐘內(nèi)便可以實(shí)現(xiàn)雙核間的通信和數(shù)據(jù)交換代碼。
下面這個(gè)例子說(shuō)明如何使用RPMsg-Lite,從一個(gè)CPU內(nèi)核發(fā)送數(shù)據(jù)到另一內(nèi)核:
rpmsg_lite_send(my_rpmsg, my_ept, REMOTE_EPT_ADDR, (char *)&msg,sizeof(msg), …);
其中my_rpmsg是rpmsg_lite_remote_init()或rpmsg_lite_master_init()調(diào)用所創(chuàng)建的RPMsg實(shí)例;如果是主CPU內(nèi)核,就用rpmsg_lite_master_init()初始化, 否則就是遠(yuǎn)程CPU內(nèi)核,用rpmsg_lite_remote_init()初始化
my_ept是此消息管道的端點(diǎn),由rpmsg_lite_create_ept()調(diào)用創(chuàng)建的:
my_ept = rpmsg_lite_create_ept(my_rpmsg, LOCAL_EPT_ADDR, …);
msg是真正要交換的消息。
REMOTE_EPT_ADDR,LOCAL_EPT_ADDR分別是此消息管道的遠(yuǎn)程端點(diǎn)和本地端點(diǎn)的邏輯地址。
怎么調(diào)試雙核應(yīng)用程序?
在回答這個(gè)問(wèn)題之前,先看一下硬件調(diào)試接口圖:
上圖說(shuō)明,LPC5411x 系列支持對(duì)雙核同時(shí)調(diào)試 ,就像調(diào)試單個(gè)CPU內(nèi)核程序一樣簡(jiǎn)單。
-
mcu
+關(guān)注
關(guān)注
146文章
17162瀏覽量
351343 -
雙核
+關(guān)注
關(guān)注
0文章
37瀏覽量
15208
原文標(biāo)題:如果你的設(shè)計(jì)正好需要雙核MCU,請(qǐng)看本文 !
文章出處:【微信號(hào):mcuworld,微信公眾號(hào):嵌入式資訊精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論