兩個(gè)核心比一個(gè)好!有時(shí),兩個(gè)不同的內(nèi)核比兩個(gè)相同的內(nèi)核更好!本應(yīng)用筆記解釋了原因。
介紹
當(dāng)大多數(shù)人想到多核處理器時(shí),他們的腦海中會(huì)立即想到個(gè)人電腦、智能手機(jī)或其他高級(jí)計(jì)算設(shè)備。這些設(shè)備統(tǒng)一具有復(fù)雜的用戶界面和搶占模式操作系統(tǒng)。
當(dāng)我們閱讀新PC或新智能手機(jī)的評(píng)論時(shí),通常會(huì)提到的一件事是內(nèi)核數(shù)量:“該設(shè)備中的CPU有四個(gè)內(nèi)核,最多支持八個(gè)線程。有了這些信息,我們知道操作系統(tǒng)可以將任務(wù)調(diào)度到任何內(nèi)核,以嘗試平衡整體工作負(fù)載。
在這種環(huán)境中,所有計(jì)算核心都盡可能相同。畢竟,必須針對(duì)不同的 CPU 架構(gòu)單獨(dú)編譯每個(gè)任務(wù)是沒有意義的。
但對(duì)于深度嵌入式處理器,擁有大量相同類型的內(nèi)核可能不如擁有多個(gè)專用內(nèi)核那么理想。
差異化內(nèi)核案例
首先,在許多深度嵌入式應(yīng)用程序中,甚至可能沒有操作系統(tǒng)。由設(shè)計(jì)人員決定哪些任務(wù)在哪些內(nèi)核上運(yùn)行、何時(shí)運(yùn)行以及運(yùn)行多長(zhǎng)時(shí)間。其次,主任務(wù)很可能在單個(gè)線程中運(yùn)行,任何其他內(nèi)核都將在那里運(yùn)行特定的專用任務(wù)。
在這些情況下,人們并不真正關(guān)心內(nèi)核是否都相同,一個(gè)CPU處理所有監(jiān)督任務(wù),另一個(gè)從屬計(jì)算內(nèi)核處理專用任務(wù)。擁有在特定區(qū)域具有更多功能、使用更少功率或消耗更少芯片硅面積的專用內(nèi)核更有意義。
例如,考慮MAX32655。它是一款基于 Arm Cortex-M4 的微控制器,Arm Cortex-M4 是一款功能強(qiáng)大、備受推崇的單線程 CPU 內(nèi)核。MAX32655具有半兆字節(jié)閃存、128KRAM和許多外設(shè),包括低功耗藍(lán)牙無(wú)線電。?
現(xiàn)在,就停在那里。低功耗藍(lán)牙可能聽起來像是硬件功能,但它與軟件和硬件一樣多。你看,硬件實(shí)際上相當(dāng)簡(jiǎn)單:發(fā)射器和接收器必須具有一定的頻率捷變性,因?yàn)樗鼈儽仨氄{(diào)諧到四十個(gè)可能的通道中的任何一個(gè),并且它們必須快速完成。發(fā)射器和接收器均可快速打開和關(guān)閉以節(jié)省功率。他們必須處理高斯頻移鍵控調(diào)制和解調(diào)。不是微不足道的,但也不是特別具有挑戰(zhàn)性。
但是軟件 - 這可能是真正的挑戰(zhàn)!主機(jī)必須管理一整套協(xié)議——屬性協(xié)議、鏈路層控制和適應(yīng)協(xié)議、安全管理器協(xié)議等。并且有一個(gè)接口將主機(jī)連接到控制器層。正是這一層管理無(wú)線電硬件,也不是微不足道的。有一個(gè)設(shè)備管理器、鏈路管理器和鏈路控制器——這些功能塊將無(wú)線電硬件的細(xì)節(jié)抽象到主機(jī)協(xié)議。
關(guān)于BLE軟件堆棧的好消息是您不必編寫它。在大多數(shù)環(huán)境中, 當(dāng)您指定特定的 BLE 設(shè)備時(shí),軟件堆棧就會(huì)出現(xiàn).壞消息是BLE軟件堆棧要求很高。這并不是說它需要特別大的處理器帶寬或存儲(chǔ),但BLE堆棧中的時(shí)序至關(guān)重要。這意味著當(dāng)BLE需要完成某事時(shí),需要立即完成!如果微控制器內(nèi)核已經(jīng)在執(zhí)行一些時(shí)間關(guān)鍵型功能,則必須提供一些東西!
這就是第二個(gè)核心的用武之地。主內(nèi)核被釋放出來,將其資源投入到用戶程序中,因?yàn)樗梢詫LE任務(wù)移交給第二個(gè)內(nèi)核。沒有延遲問題,不用擔(dān)心BLE堆棧會(huì)在錯(cuò)誤的時(shí)刻中斷內(nèi)核。第二個(gè)獨(dú)立核心解決了很多問題!
選擇合適的核心
第二個(gè)內(nèi)核對(duì)于運(yùn)行BLE堆棧是有意義的。但是選擇哪個(gè)核心呢?
一種選擇是使用第二個(gè)Arm Cortex-M4。M4帶來了很多資源。它是AMBA總線的原生版本,藍(lán)牙庫(kù)都針對(duì)Cortex-M系列內(nèi)核進(jìn)行了很好的編譯。那么,為什么不是第二個(gè) M4?
事實(shí)是,與Arm Cortex-M4一樣高效,它比運(yùn)行BLE堆棧的專門任務(wù)所需的CPU更多。更小,更慢,更適度的CPU會(huì)做得很好。但是哪個(gè) CPU?
向RISC-V(發(fā)音為risk-five)核心問好!與Arm Cortex-M4一樣,它是一個(gè)基于RISC架構(gòu)的32位CPU。RISC,或簡(jiǎn)化指令集計(jì)算,是一種計(jì)算機(jī)體系結(jié)構(gòu)哲學(xué),它斷言一小組簡(jiǎn)單的指令比一大組更復(fù)雜的指令更有效地執(zhí)行。在大多數(shù)情況下,RISC在很大程度上贏得了CISC(復(fù)雜指令集計(jì)算)的爭(zhēng)論。但是CISC計(jì)算仍然有一個(gè)巨大的堡壘:x86架構(gòu)。大多數(shù)其他計(jì)算環(huán)境——以及幾乎所有嵌入式處理器——都采用了RISC。
在評(píng)估新的CPU內(nèi)核時(shí),首先跳出的三件事是指令集架構(gòu),寄存器補(bǔ)碼和程序員模型。下一節(jié)將探討RISC-V和Arm Cortex-M4之間的這些因素有何不同。
比較指令集
在查看指令集之前,請(qǐng)記?。合馛這樣的高級(jí)語(yǔ)言不是計(jì)算機(jī)的母語(yǔ)。C 編譯器將程序轉(zhuǎn)換為一組由內(nèi)核執(zhí)行的機(jī)器指令。一個(gè) C 語(yǔ)句可以轉(zhuǎn)換為數(shù)十條機(jī)器指令。C編譯器已經(jīng)變得如此高效,以至于匯編語(yǔ)言編程,即一個(gè)語(yǔ)句完全轉(zhuǎn)換為一個(gè)機(jī)器指令,已經(jīng)成為一種失傳的藝術(shù)。
然而,C語(yǔ)句——或Python,或JavaScript,或其他高級(jí)語(yǔ)言——最終用原生機(jī)器代碼表達(dá)。因此,關(guān)注指令集的工作原理是有意義的。
Arm Cortex-M4基于ARMv7E-M指令集架構(gòu)。雖然Arm Cortex-M4是32位CPU,但ARMv7E-M指令集使用Thumb-2指令編碼,大多數(shù)情況下,這些是16位指令。這里有一個(gè)故事。
最初,Arm 指令集是 32 位的。盡管底層架構(gòu)是RISC,但指令集很豐富,但在代碼大小方面并不是特別有效。Arm在90年代中期提出了Thumb編碼,以解決這些關(guān)于指令集效率的擔(dān)憂。拇指指令的長(zhǎng)度為 16 位,與以前使用的 32 位編碼的子集非常接近。指令集效率更高,但留下了許多功能。
Thumb-2 于 2003 年推出,混合使用 16 位和 32 位編碼,在恢復(fù)一些 32 位編碼功能的同時(shí)保留了大部分代碼密度優(yōu)勢(shì)。當(dāng)然,這種方案有一個(gè)缺點(diǎn):它會(huì)導(dǎo)致可變長(zhǎng)度指令集。但是今天,Thumb-2編碼已經(jīng)成熟且易于理解,實(shí)際上是Arm Cortex-M4內(nèi)核支持的唯一指令編碼。
相比之下,大多數(shù)RISC-V方案(包括Maxim的MAX32655中使用的實(shí)現(xiàn)方案)都使用純32位編碼。RISC-V支持可選的壓縮編碼,其術(shù)語(yǔ)為16位指令支持。但與 Arm Cortex-M4 中的 Thumb 指令編碼不同,它確實(shí)是可選的。
但是有什么指示呢?
ARMv7E-M和RISC-V指令集都支持負(fù)載存儲(chǔ)架構(gòu)。這意味著,算術(shù)和邏輯指令的操作數(shù)必須從內(nèi)存顯式加載到寄存器中,一旦執(zhí)行操作,結(jié)果必須顯式存儲(chǔ)回內(nèi)存。
負(fù)載存儲(chǔ)架構(gòu)是RISC內(nèi)核的標(biāo)志,但除此之外,ARMv7E-M指令集并沒有太多的“減少”。ARM指令集包含數(shù)十條指令和指令變體,具有條件執(zhí)行,作為指令操作數(shù)的移位,許多位和字節(jié)操作子指令以及多種內(nèi)存尋址模式。把這一切加起來,它使ARM內(nèi)核成為一個(gè)相當(dāng)復(fù)雜的邏輯。
RISC-V并非如此。RV32I指令集中只有40條基本指令。由于其中許多可以分組到指令族中,因此指令集變得更加易于理解:有六個(gè)分支指令,五個(gè)加載指令,三個(gè)存儲(chǔ)指令和兩個(gè)用于函數(shù)調(diào)用的“跳轉(zhuǎn)和鏈接”指令。把這些指令家庭放在一起,只有28個(gè)指令需要考慮。
為了使事情更簡(jiǎn)單,只有六種編碼格式:注冊(cè)到注冊(cè)、立即、上層立即、存儲(chǔ)、分支和跳轉(zhuǎn)。就是這樣!RISC-V編譯器的代碼生成部分很容易。
看看所有這些寄存器!
現(xiàn)在,寄存器補(bǔ)充:ARMv7E-M 架構(gòu)指定了 16 個(gè)寄存器,其中 13 個(gè)是通用寄存器。RISC-V架構(gòu)指定了32個(gè)寄存器,其中除一個(gè)寄存器外,其他所有寄存器都是通用的。以下是它們的工作原理。
臂寄存器命名為 R0 到 R15。但是前三個(gè)寄存器有特殊的用途:R15是程序計(jì)數(shù)器,對(duì)R15的任何寫入實(shí)際上都是跳轉(zhuǎn)到該位置。R14是鏈路寄存器。執(zhí)行分支和鏈接(函數(shù)調(diào)用)時(shí),返回地址存儲(chǔ)在 R14 中。R13 是堆棧指針。PUSH指令遞減R13并將指定寄存器中的值存儲(chǔ)到降序存儲(chǔ)器位置;POP 指令從升序內(nèi)存位置加載值并遞增 R13。
RISC-V寄存器被命名為x0到x31,只有一個(gè)用戶可見的特殊用途寄存器:x0在讀取時(shí)始終返回零值,寫入x0的任何內(nèi)容都會(huì)被丟棄。這對(duì)簡(jiǎn)化指令集編碼來說是一個(gè)真正的福音。
所有其他寄存器都是真正的通用寄存器。按照慣例,x1 用作返回地址(Arm 稱之為鏈接寄存器),x2 用作堆棧指針,但硬件中沒有任何內(nèi)容可以強(qiáng)制執(zhí)行(除非在核心設(shè)計(jì)中實(shí)現(xiàn)了壓縮擴(kuò)展,但那是另一回事)。雖然 ARM BL(分支和鏈接)指令始終將返回地址存儲(chǔ)在 R14 中,但 RISC-V JAL(跳轉(zhuǎn)和鏈接)指令允許您指定獲取返回地址的寄存器。
RISC-V指令集中似乎缺少一些指令,例如寄存器到寄存器的移動(dòng)操作!相反,一個(gè)寄存器的內(nèi)容使用 ADDI 指令移動(dòng)到另一個(gè)寄存器:ADDI rd, rs, 0 將 rs 的內(nèi)容添加到值零并將結(jié)果存儲(chǔ)在 rd 中,從而有效地將 rs 中的任何內(nèi)容移動(dòng)到 rd。整潔!
您可能認(rèn)為 ADDI 是 MOVE 的糟糕替代品,因?yàn)樗阈g(shù)指令會(huì)修改標(biāo)志寄存器,而 MOVE 不會(huì)。在RISC-V內(nèi)核中,這不是一個(gè)問題,因?yàn)闆]有標(biāo)志寄存器!相反,分支指令 - BEQ(如果相等則分支)、BNE(如果不等于則分支)、BLT(如果小于則為分支)、BGE(如果大于或等于則為分支)、BLTU(如果小于,則為分支,無(wú)符號(hào))和 BGEU(如果大于或等于,則為分支,無(wú)符號(hào))——都接受兩個(gè)寄存器說明符,執(zhí)行比較,然后有條件地獲取分支。
但是,如果結(jié)果為零,如何分支?只需寫 BEQ rs x0 .請(qǐng)記住,x0 始終包含值零。這使得編寫測(cè)試零、非零、負(fù)或正值的分支指令變得容易。
因此,雖然RISC-V的指令集和程序員模型對(duì)于那些習(xí)慣于Arm指令集的人來說可能看起來有點(diǎn)陌生,但它確實(shí)功能強(qiáng)大且完整。
這些內(nèi)核是如何堆疊的?
所以,現(xiàn)在我們來到一個(gè)大問題:為什么要使用RISC-V內(nèi)核來運(yùn)行BLE堆棧?
答案在于可定制性。所有商用CPU內(nèi)核都允許一定程度的定制,這也適用于Arm Cortex-M系列。不過,一般來說,Arm 內(nèi)核中提供的自定義選項(xiàng)是大粒度的。例如,它是否具有浮點(diǎn)運(yùn)算或嵌入式跟蹤?
相比之下,RISC-V內(nèi)核具有芯片設(shè)計(jì)人員可以啟用或禁用的一整套擴(kuò)展:三種浮點(diǎn)單元(單精度,雙精度和四精度),原子指令,整數(shù)乘除法,壓縮指令以節(jié)省代碼空間,以及其他規(guī)格尚未凍結(jié)。
在設(shè)計(jì)運(yùn)行BLE控制器堆棧的內(nèi)核時(shí),RISC-V內(nèi)核只需整數(shù)乘法和除法擴(kuò)展即可構(gòu)建。沒有必要包含其他功能, 因?yàn)樗鼈儗?duì)運(yùn)行 BLE 堆棧沒有任何幫助.因此,沒有理由占用硅空間并消耗支持這些功能的功率。我們可以比主 Arm Cortex-M4 更慢地為核心計(jì)時(shí)。更慢地對(duì)內(nèi)核進(jìn)行計(jì)時(shí)可以降低內(nèi)核的功耗。
這就是為什么提前知道第二個(gè)內(nèi)核的用途有助于芯片設(shè)計(jì)人員并有助于創(chuàng)造最佳的微控制器體驗(yàn)!
審核編輯:郭婷
-
智能手機(jī)
+關(guān)注
關(guān)注
66文章
18707瀏覽量
186375 -
寄存器
+關(guān)注
關(guān)注
31文章
5622瀏覽量
130529 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
7447瀏覽量
129666
發(fā)布評(píng)論請(qǐng)先 登錄
MAX32655:低功耗藍(lán)牙微控制器的卓越之選
LX2080釋放復(fù)位瞬間啟動(dòng)電流過大,有什么辦法讓CPU核緩啟動(dòng)或者8個(gè)核分時(shí)依次啟動(dòng)嗎?
詳解極海G32R501 MCU的兩核外設(shè)分配
核磁檢測(cè)同步光調(diào)節(jié)治療
VDMA IP核簡(jiǎn)介
使用rk3568開發(fā)板,核0\\1\\3運(yùn)行l(wèi)inux,核2運(yùn)行hal,在核0中怎么關(guān)閉核2
Vivado浮點(diǎn)數(shù)IP核的握手信號(hào)
如何在rt-thread studio上開發(fā)STM32H747這類雙核的單片機(jī)?
請(qǐng)問雙核的芯片如何調(diào)試?
【飛凌嵌入式】基于i.MX9352開發(fā)板M核的FreeRTOS設(shè)計(jì)例程
紫光展銳4G旗艦性能之王智能穿戴平臺(tái)W527登場(chǎng) 一大核三小核異構(gòu)處理器架構(gòu)
MAX32655:為什么兩核優(yōu)于一個(gè)核
評(píng)論