恩智浦非對稱雙核微控制器的研究 智慧應用 影音
工研院
ST Microsite

恩智浦非對稱雙核微控制器的研究

圖一
圖一

在開發MCU應用系統時,如果單顆MCU無法滿足系統的要求,一個很普遍的做法就是使用2顆或更多的MCU,把一部分「雜項工作」分配給另一個有「助理」性質的低端MCU來完成。但是,採用2顆MCU,缺點也是很明顯的,尤其是在晶片與PCB成本、系統可靠性,以及功耗上面,都有先天的不足。

進一步地,若是採用了不同架構的MCU,還要面臨需要不同的開發工具與開發人員的挑戰。如果換個思路,讓MCU內部包含了2個內核,其中一個用於主控,另一個用於協控,並且它們主控與協控在架構上能向下相容、高效通信,則在很多場合下,都可以既保存多機系統的強大,又免去多機系統的不足。

圖二

圖二

1.背景與基本概念

事實上,這即是「非對稱多處理器(簡稱AMP)」架構的特點。AMP是與「對稱多處理器(簡稱SMP)」相對的架構,後者各處理器有一致的程式設計模型,並且在分配工作時主要以均衡為原則。而AMP的優點在於精細的任務分工,靈活地適應不同情景,物盡其用,以最佳地平衡成本、性能與功耗。此外,AMP的程式設計難度也更低。因此,在MCU應用領域,AMP較SMP更為適合。

與獨立的雙MCU相比,AMP架構有很多優點。其中相當關鍵的,就是再添加1個內核的代價遠比添加1個獨立的MCU要低,尤其是當2個內核架構相似時,甚至僅相當於在現有矽片上再添加1、2個UART。另一方面,2個內核可以有相同的主頻,並且可以通過匯流排矩陣平等地訪問片上的資源。而在分立的雙MCU方案中,協控MCU的主頻常常遠低於主控,並且雙方使用低速的串列鏈路通信。

接下來,我們以目前唯一的泛用型AMP MCU產品——恩智浦半導體新推出的LPC4300系列為例,尤以LPC4350型號為代表,對AMP MCU作一簡單的介紹。

2.非對稱雙核MCU的特點

AMP MCU一般用於相對大型的系統,在功能和性能上都有較高的要求。從功能上,應支援較多的外設。LPC4350片載2個高速USB、2個CAN、工業乙太網、圖形LCD控制器,以及SDHC等介面;外加一些獨有的邏輯可配置外設以及眾多傳統外設,適用於工控、能源、醫療、音訊、車載、電機、監控等眾多行業產品的開發。性能的改善則是AMP MCU的靈魂。內核、儲存體,以及匯流排架構對於性能有著至關重要的影響。圖一展示了LPC4350的實現方式。

首先是內核的選擇。LPC4350基於32位的ARM Cortex-M4和Cortex-M0內核(以下簡稱M4和M0),2個內核均可在高達204MHz的主頻下執行代碼。其中,M4以信號處理和浮點運算能力見長,勝任很多原先要採用DSP才能滿足的應用,並且繼承了Cortex-M3的控制能力;另一方面,M0以其成本、能效和處理能力的壓倒性優勢,正迅速吸引開發人員從8/16位架構向上過渡。更重要的是,M4完全向下相容M0,使用同一套開發工具即可開發、調試。

其次是儲存體的容量和組織方式。LPC4350配備多達264KB片上RAM,並且這些RAM劃分成4個組,每組連接一條單獨的匯流排,而並非鐵板一塊。如若不然,將會出現2個核競爭使用同一塊RAM的情況,性能反而還不如只用單個內核!進一步地,LPC4350還有2條匯流排連接到外部擴展的並行和串列儲存體,故總共有6個獨立的儲存體位址空間——LPC4350無片上快閃記憶體。對於有片上快閃記憶體的型號,片上快閃記憶體也分為2塊。

最後是匯流排架構。LPC4350內部有1個八層匯流排矩陣,它如同一組縱橫開關,可以把CPU與包括儲存體在內的眾多從設備通過匯流排任意連接。合理分配匯流排接通關係,避免多個主設備(如CPU和DMA)同時訪問相同的儲存體或外設,可以最大地保證各條資料流程並行不悖,從而可以充分發揮性能上的優勢。

3.內核間通信

內核間的通信可分為兩類。一類是控制與狀態資訊的通信,另一類則是資料通信。前者一般不攜帶資料,但是往往有較高的即時要求;後者則主要是各類資料緩衝區,常常即時性要求偏低但資料量大。控制?狀態通信有較大的通用性,並且與任務間同步較為相似,適合由系統軟體實現並提供程式設計介面。而資料通信則往往與具體的應用相關較大,尤其是在資料結構上,需要量體裁衣。在實現時,適合由應用軟體定義各種資料結構。

內核間通過共用的RAM進行通信,並且每個內核都可以觸發對方的一個中斷源,通過「準備資料-觸發中斷」的方式進行通信,如圖二所示。當然,內核也可以定期檢查共用RAM的狀態。接下來我們介紹基於訊息佇列和消息池的控制?狀態通信方案。

3.1訊息佇列

開設2個訊息佇列,一個用於M4發送消息給M0,另一個則是M0發送消息給M4。2個佇列的位址需事先約定好。佇列是迴圈佇列,可以使用簡單的陣列配以讀、寫下標來實現,也可以使用鏈表結構來實現。前者實現簡單,開銷小,但消息只能是定長,不便於攜帶其他資訊,還有就是必須把陣列放置在共用記憶體區連續的位置,靈活性低。

基於鏈表的實現用指標連結每則消息,每則消息除了公共的鏈表控制部分外,還可以根據消息類別攜帶各種各樣的附加參數,並且可以由系統軟體的記憶體管理機制靈活分配消息記憶體,不過,缺點是相對複雜,額外開銷大。若涉及動態記憶體管理,即時性將遠不如基於陣列的方案。

訊息佇列有一個缺點,就是消息的序列化處理,它沒有優先順序的概念。但實際上我們有RTOS以及嵌套中斷機制的支援,本應實現消息的併發處理。

3.2消息池

消息池在存儲結構上其實是簡化的基於陣列的訊息佇列——去掉了佇列的讀、寫下標記錄器。池中每個元素是一個消息,並且有一個位元組指示每個池的狀態——空閒?已處理、新、半處理。當發送方寫入消息時,掃描陣列以查找空閒位置;當接收方讀取消息時,也是掃描陣列以查找狀態。可見,消息池是基於優先順序來處理消息的——小下標的元素優先得到處理。但消息池的缺點也很明顯:每個優先順序只能存儲單個消息,且消息數目不宜過多,否則遍歷陣列將使即時性很難保證。

消息池的可掃描性實現了消息的併發處理,並且可以通過中斷上下文和任務上下文分兩次「反芻式」處理。在處理消息池的插斷服務程式中,先掃描各消息完成第一次處理,執行消息中(如果有的話)對即時性要求較高的部分。如果系統中沒有使用RTOS,可以在後台的主迴圈中再接下來二次掃描消息池以完成第二次處理。對於使用了RTOS的系統,可以根據消息的優先順序創建或啟動不同優先順序的任務,使消息「附身」在這些任務的上下文中得到第二次處理。

消息池的一大缺點就是不宜支援較大數目的待處理消息。如有需要,可以給每則消息添加鏈表控制欄位,我們可以把同一優先順序的消息鏈成一串,從而徹底消除這一局限。

4.1若干重要的細節:內核互斥

與多工之間的互斥相似,內核間也有互斥的問題。尤其嚴重的是,一個內核無法關閉另一個內核的中斷,因此還無法通過關中斷臨界區來保護。唯一能保證的就是不會出現2個內核同時讀寫相同位址的情況。我們可以通過施加一些程式設計準則來實現互斥。最簡易有效的,就是給不同內核在相同位址設置「唯讀」或「只寫」的許可權,或者是有條件的讀寫許可權。

比如,對於訊息佇列的讀位置,只有接收方可以寫,而發送方只能讀取來判斷佇列是否空?滿。又如,對於消息池,儘管發送方和接收方對池中的元素狀態均可讀可寫,但有如下的條件:發送方只能把空閒狀態改為非空閒,接收方只能把各種非空閒的狀態改為空閒。再如,對於鏈表結構,可以只允許發送方更新各種指標。接收方通過更改鏈表中元素的狀態以及觸發中斷,以指示發送方更新各指標的時機。要注意的是,由於架構上的局限,無法使用「自旋鎖」來互斥。

4.2內核鑒別

M4向下相容M0,這使我們可以重用很多原始程式碼。但是,有時需要鑒別當前正在哪個內核上運行。有兩種方法。一種是通過C/C++的預處理器,並且在編譯器設置中預定義諸如「CORE_M4」以及「CORE_M0」。另一種則是在運行期通過讀取一個名為「CPUID」的寄存器,根據CPUID來判定是M4還是M0。

4.3初始化與可執行映射

LPC4350在上電後,M4開始執行代碼,而M0卻一直保持在重置模式。這是絕大多數AMP的設計方式,使我們也可以無視M0的存在,而只按單核MCU來使用。但若要使用M0,M4就需要為M0準備好開始執行的一切環境,再釋放M0。當M0處在重置模式時,我們可以通過JTAG發現M0,但是卻無法操作它。因此,如果要調試M0的程式,需要先給M4下載適當的映射使其釋放M0才可,不可能在拿到一個空白的晶片後直接先從M0動手。

儘管M4與M0各有自己的映射,但是M0的映射內含於M4的映射中,這樣在生產時只需要燒寫一次快閃記憶體。M4在初始化期間需要為M0準備映射,把它拷貝到擬讓M0執行的位置。由於M0固定從零位址開始取向量,M4還需要設置M0的位址映射,把映射的首位址設置成為M0的零位址。

4.4調試時的細節

當我們使用調試模擬器連接MCU時通常都會產生重置信號,但範圍可僅限於內核,也可重置全芯片。在調試M0時,需設定重定置範圍僅包括M0,避免殃及正在運行的M4。另外,也需要編寫適當的調試初始化腳本以準備好內核的執行環境。這些工作繁瑣但有高度的通用性,我們可以借鑒現有的腳本。我們可以同時調試M4和M0,只需運行2個獨立的IDE進程,分別打開相應的專案工程即可——經實踐,至少在MDK+ULINK下可行。

5.核間任務分工

M0沒有M4強大的處理能力,但是作為一個CPU,亦有完整的中斷系統和基本的算術與資料傳送能力,並且在LPC4350上可以在高達204MHz的主頻下運行。合理地分擔一些任務給M0,才能利用雙核設計的優勢。接下來,我們討論兩種主要的任務分工模型。

5.1處理高頻中斷:智慧「DMA」

中斷的回應是有額外開銷的。既包括CPU的中斷模型本身產生的硬體開銷,也包括作業系統的中斷管理產生的軟體開銷。當中斷的頻率很高時,比如,到達每秒數十甚至上百千次,這些額外開銷將對CPU時間產生不可忽略的佔用。更重要的是,中斷的回應通常是淩駕在任務管理之上的,幾乎總是可以影響所有任務的性能。DMA在很多情況下明顯改善了這一狀況。但是當DMA通道或匯流排分派不足,或者是設備不受DMA支援時,我們就可以讓M0來回應這些高頻的中斷,合理組織資料緩衝區,如同一個智慧的DMA一般。

例如,在調光設備中,需要進行多達幾十甚至上百路的AD採樣來獲取每路燈光的預期亮度,以及同樣多的LED來指示實際輸出的亮度。後者需要非常多的PWM,極可能已超出硬體PWM通道的數目。因此,在實現AD採樣與軟體PWM時,均需要快速的通道資料流程處理與高頻LED刷新以保證PWM精度。這兩者很容易導致高達幾十kHz的插斷要求,僅中斷回應的額外開銷就可佔用一半以上的CPU時間。傳統的做法是使用若干顆MCU來分塊處理。在LPC4350下,則可由M0來處理這些任務。同樣的例子也適用於PLC應用,它需要快速地刷新多路控制。

5.2 為弱計算操作提供額外的處理能力

M0的整體性能約是M4的72%,但對於弱計算操作,如加減乘與邏輯運算、移位、以及簡單的資料傳送,並沒有太多劣勢。弱計算操作在程式中往往占一半以上的比例,尤其體現在驅動程式以及一些通訊協定棧上。合理地分配一部分弱計算操作任務給M0,可以有效地提升整體的處理能力,使得完成相同的任務只要更低的主頻以降低功耗,或者反過來在有限的主頻下完成需要更多的任務。

例如,在高精密工業運動控制中,對於電機的控制往往需要運算量很大的演算法,同時又要處理如CAN、工業乙太網、以及各種現場匯流排的通信。我們可以讓M4來運行電機控制演算法,而通訊協定棧與驅動程式則由M0來完成。同樣的例子也適用於嵌入式音訊,由M4執行音訊編解碼與音效處理演算法,而M0則負責音訊匯流排、USB等事務。

小結
通過以上我們對非對稱雙核MCU的介紹,可以看出相比於傳統的使用多顆MCU的方案,在性能、成本、功耗、生產等諸多環節都有明顯的優勢。核間通信稍顯複雜,但作為基礎設施可由稱底層系統軟體來實現。在具體開發時,應根據實際問題合理分工任務,並且在初始化流程、內核鑒別,以及調試上,需注意一些操作細節。 (本圖文由台灣恩智浦半導體提供,作者:高級應用工程師 宋岩,陳毅斌整理)