Silicon Labs微控制器和無線產品系統(tǒng)工程師 Josh Norem
?
探索IoT應用中對于8位、32位MCU的選擇
Silicon Labs微控制器和無線產品系統(tǒng)工程師Josh Norem
引言
該如何對8位、32位MCU進行選擇?8位和32位MCU在功能上仍是互為補充,各有千秋,這其中的訣竅在于弄清什么樣的應用適合什么樣的MCU架構。本文對比了8位MCU和32位MCU的使用案例,也可作為如何選擇這兩種MCU架構的指南使用。本文中大部分32位MCU示例將關注ARM Cortex-M設備,Cortex-M在不同MCU供應商產品組合中表現得非常相似。鑒于8位MCU有很多種架構,所以很難對8位供應商產品進行類似的比較。為了便于進行比較,我們將使用廣泛應用的、易于理解的8051 架構,該架構深受嵌入式開發(fā)人員的青睞。
8位和32位MCU該如何選擇
有時,當我對比人們所熟知的事物(例如ARM和8051)時,感覺就像在互聯網論壇上發(fā)出“《星際迷航》比《星球大戰(zhàn)》好看”的帖子一樣,很快就能火起來。
事實上,“ARM Cortex和8051哪個更好”并不是個邏輯問題,就像是在問,“吉他和鋼琴哪個更好”一樣。真正要解決的問題是“哪種MCU能幫我更好地解決當下面臨的問題”。不同的任務需要使用不同的工具,我們的目的是要了解“如何才能更好地運用我們所擁有的工具”,包括8位和32位MCU。幾乎可以肯定地說,那些簡單回答“ARM更好”或“8051更好”的人各有其目的,他們也許正在試圖銷售某種產品。
對不同的設備進行比較,需要對其進行測量。有很多構建工具可供選擇,我們盡量選擇一些場景,我認為其能夠進行最公平的比較,且最能代表開發(fā)人員的真實體驗。以下ARM數據是通過GCC+nanoCLibrary和-03優(yōu)化選項所生成的。
我并不想為任何一種設備優(yōu)化代碼,只是簡單地實現90%開發(fā)人員都會使用的最顯而易見的“常規(guī)”代碼,更感興趣的是普通開發(fā)人員所見到的結果,而不是理想狀態(tài)下的結果。當然,花費諸多時間、精力和財力去調整8051代碼使其表現得比ARM更好是可能的(反之亦然),但一開始就選擇適合該項工作的最佳工具更為簡易。
并非所有的MCU都是一樣的
在開始對架構進行比較之前,要注意到并非所有生產的MCU都是一樣的,這一點非常重要。如果將基于ARM Cortex-M0+處理器的現代MCU與30年前的8051 MCU進行對比,8051 MCU在性能對比上不會勝出。幸運的是,依然有許多供應商一直在對8位處理器進行持續(xù)投資。例如:Silicon Labs一直更新基于8051內核的EFM8 MCU產品線,比原來的8051架構更為高效,而且開發(fā)過程也已經實現現代化。所以,在許多應用中,8位內核能夠容易彌補M0+或M3內核不利的地方,甚至在一些方面性能更佳。
開發(fā)工具也很重要?,F代嵌入式固件開發(fā)需要全功能IDE、現成的固件庫、豐富的示例、完整的評估和入門套件,以及助手應用,以簡化硬件配置、庫管理和量產編程之類的工作。當MCU有了現代化的8位內核和開發(fā)環(huán)境后,在很多情況下,這樣的MCU將超越基于ARM-Cortex的類似MCU。
一般性取舍
在深入探討內核架構和其他技術細節(jié)之前,我要和大家講一個故事,在我讀大學的時候,記得有一次考試,因為太在意考取好分數和比其他同學先完成考題,以至于沒有注意到在試卷的正反面都印有試題。不用說,我的確是第一個完成考卷的人,但卻是我不愿再想起的一次經歷。如果一個應用需要的只是256 KB的閃存或0.25美元的批量定價,那么分析復雜的MCU特性和功能是沒有意義的。這些需求足以說明何種MCU架構才是最佳選擇。
系統(tǒng)規(guī)模
一般性原則是,ARM Cortex-M內核更適用于較大的系統(tǒng)規(guī)模(>64 KB代碼),而8051設備適用于較小的系統(tǒng)規(guī)模(<8 KB代碼)。中等規(guī)模的系統(tǒng)可以選擇兩種方式,這取決于系統(tǒng)要執(zhí)行的任務。有必要注意一點,在大多數情況下,外設組合將會發(fā)揮重要的作用。如果需要3個UART、1個LCD控制器、4個時鐘和2個ADC,你可能并不會在8位MCU上找到所有這些外設。
易用性vs成本和尺寸
對于中等規(guī)模的系統(tǒng)來說,使用任何一種架構都可以完成工作,需要權衡的是選擇ARM內核帶來的易用性,還是8051設備帶來的成本和物理尺寸優(yōu)勢。
ARM Cortex-M架構具有統(tǒng)一的存儲映射模式,并且在所有常見編譯器中支持完整的C99,這使得這種架構非常易于寫固件。此外,還可得到一系列庫和第三方代碼。當然,這種易用性的代價就是成本。對于高復雜性、上市時間較短的應用或缺乏經驗的固件開發(fā)人員來說,易用性是個重要因素。
盡管8位與32位部件相比有些成本上的優(yōu)勢,但真正的區(qū)別就在于成本級別。大家經常會發(fā)現具有2 KB/512 B(Flash/RAM)的小容量8位器件,而卻很少見低于8 KB/2 KB的32位器件。在不需要很多資源的系統(tǒng)中,該范圍的存儲容量能夠讓系統(tǒng)開發(fā)人員獲得顯著降低成本的解決方案。因此,對成本極為敏感或僅需較小存儲容量的應用會更傾向于選擇8051解決方案。
通常,8位器件也具有物理尺寸上的優(yōu)勢。例如:Silicon Labs提供的最小的32位QFN封裝為4 mm×4 mm,而基于8051的8位器件的QFN封裝可小至2 mm×2 mm。芯片級封裝(CSP)的8位和32位架構之間的差異較小,但卻使成本增加,且組裝較難。對于空間嚴格受限的應用來說,通常需要選擇8051 MCU來滿足限制要求。
通用代碼和RAM效率
8051 MCU成本較低的主要原因之一是,它通常比ARM Cortex-M內核更高效地使用Flash和RAM,這允許系統(tǒng)采用更少資源實現。系統(tǒng)越大,這種影響就越小。
但這種8位存儲資源的優(yōu)勢并不總是如此,在某些情況下,ARM內核會像8051內核一樣高效或比其更高效。例如:32位運算僅需要一條ARM設備指令,而在8051 MCU上則需要多條8位指令。顯然,這種代碼在ARM架構上有更高的執(zhí)行效率。
ARM架構在Flash/RAM尺寸較小時的兩個主要缺點是:代碼空間效率和RAM使用的可預測性。首要也是最明顯的問題是通用代碼空間效率。8051內核使用1字節(jié)、2字節(jié)或3字節(jié)指令,而ARM內核使用2字節(jié)或4字節(jié)指令。通常情況下,8051指令更小,但這一優(yōu)勢因實際上花費許多時間而受到削弱,ARM內核比8051在一條指令下能做更多工作,32位運算就是這樣一個示例。實踐起來,指令寬度是能在8051上產生適度的更密集代碼。
代碼空間效率
在含有分布式訪問變量的系統(tǒng)中,ARM架構的加載/存儲架構通常比指令寬度更為重要。試想信號量的實現,一個變量需要在代碼周圍的多個不同位置進行減量(分配)或者增量(釋放)。ARM內核必須將變量加載到寄存器,對其進行操作并重新存儲,這需要3條指令。另一方面,8051內核可以直接在內存位置上進行操作,且僅需1條指令。隨著每次對變量完成工作量的增大,由于加載/存儲而產生的消耗就變得微不足道。但對于每次僅完成一點工作的情況來說,加載/存儲能產生重要影響,讓8051獲得明顯的效率優(yōu)勢。
盡管信號量在嵌入式軟件中并非常見,但簡單的計數器和標志信號量卻廣泛應用于控制導向的應用中并起著相同的作用。許多常見的MCU代碼都屬于這一類型。
另一個原因是,ARM處理器比8051內核擁有更多的自由使用??臻g。通常情況下,8051設備針對每次函數調用僅在棧上存儲返回地址(2字節(jié)),通常通過分配給棧的靜態(tài)變量處理大量的任務。在某些情況下,這會產生問題,因為這會造成函數默認不可重入。然而,這也意味著必須保留的??臻g很小,且完全可預測,這在RAM容量有限的MCU中至關重要。
舉個簡單的例子,我創(chuàng)建了以下程序,然后測量funcB內部的棧深度,發(fā)現M0+內核的棧用了48個字節(jié),而8051內核的棧僅用了16個字節(jié)。當然,8051內核還靜態(tài)分配了8個字節(jié)的RAM,總共用了24個字節(jié)。在較大的系統(tǒng)中,這個差異顯得微不足道,但是在僅有256字節(jié)ARM的系統(tǒng)中,這就變得很重要。代碼示例如下:
int main(void){
fucA (0xACED)
while (1)
}
void funcA (uint32_t a){
uint8_t i,j=0
for (i=0;i<3; i++) {j = funcB(i,j);}
}
uint16_t funcB(uint16_t testA,uint16_t testB){
return (testA * testB) / (testA-testB)
}
架構細節(jié)
現在,我們來說基本情景。假設有基于ARM和基于8051的MCU各一個,配有所需的外設,那么對于較大的系統(tǒng)或需要重點考慮易用性的應用來說,ARM設備是更好的選擇。如果首要考慮的是低成本/小尺寸,那么8051設備將是更好的選擇。下面我們對于每種架構更擅長的應用進行更詳細的分析,同時也劃分出一般原則。
(1) 延時
兩種架構的中斷和函數調用延時存在很大差異,8051比ARM Cortex-M內核更快。此外,高級外設總線(APB)配備的外設也會影響延時,這是因為數據必須通過APB和AMBA高性能總線(AHB)傳輸。最后,當使用高頻內核時鐘時,許多基于Cortex-M的MCU需要分配APB時鐘,這也增加了外設延時。
我做了1個簡單的實驗,實驗中的中斷是通過I/O引腳觸發(fā)的。該中斷對引腳發(fā)出一些信號,并根據引發(fā)中斷的引腳更新標志。然后我測量了一些參數,如表1所列。這里的列表顯示了32位的實現。
//Status var
volatile uint8_t hello;
//ISR
void GPIO_ODD_IRQHandler(void){
GPIO->P[gpioPortA]. DOUTSET = 0x03; //T1
GPIO->P[gpioPortA]. DOUTCLR = 0x01; //T2
if(GPIO->IF & 0x0100) {
hello = 4;
}
else{
hello = 5;
}
GPIO->IFC = 0xFFFF;//clear interrupt
GPIO->P[gpioPortA]. DOUTCLR =0x02;//T3
}
//Main loop
while (1){
hello = 0;
GPIO->P[gpioPortA]. DOUTSET = 0x04; //T0
while(!hello);
GPIO->P[gpioPortA]. DOUTCLR = 0x04; //T4
for(i=0; i<0x1000; 1++);
}
表1 參數比較
8051內核在中斷服務程序(ISR)進入和退出時顯示出優(yōu)勢。但是,隨著中斷服務程序(ISR)越來越大和執(zhí)行時間的增加,這些延遲將變得微不足道。和已有原則一致,系統(tǒng)越大,8051的優(yōu)勢越小。此外,如果中斷服務程序(ISR)涉及到大量數據遷移或大于8位的整數數據運算,中斷服務程序(ISR)執(zhí)行時間的優(yōu)勢將轉向ARM內核。例如,一個采用新樣本更新16位或32位移動平均的ADC ISR可能在ARM設備上執(zhí)行得更快。
(2) 控制vs處理
8051內核的基本功能是控制代碼,其中對于變量的訪問是分散的,并且使用了許多控制邏輯(if、case等)。8051內核在處理8位數據時也是非常有效的,而ARM Cortex-M內核擅長數據處理和32位運算。此外,32位數據通道使得ARM MCU復制大包的數據更加有效,因為它每次可以移動4個字節(jié),而8051每次僅能夠移動1個字節(jié)。因此,那些主要把數據從一個地方移動到另一個地方(例如UART到CRC或者到USB)的流數據處理的應用,更適合選擇基于ARM處理器的系統(tǒng)。
來做1個簡單的實驗,我們編譯以下兩種架構的函數,變量大小為uint8_t、uint16_t和uint32_t。
uint32_t funcB(uint32_t testA, uint32_t testB){
return (testA * testB)/(testA-testB)
}
|data type | 32bit(-o3) | 8bit |
| uint8_t | 20 | 13 | bytes
| uint16_t | 20 | 20 | bytes
| uint32_t | 16 | 52 | bytes
隨著數據量的增加,8051內核需要越來越多的代碼來完成這項工作,最終超過了ARM函數的大小。16位的情況在代碼大小上幾乎類似,在執(zhí)行速度上稍好于32位內核,因為相同代碼通常需要更少周期。還有一點很重要,那就是要注意到,只有采用優(yōu)化的ARM編譯代碼,這種比較才有效。未優(yōu)化的代碼需要花費幾倍長的時間。
這并不意味著有大量數據移動或32位運算的應用不應該選擇8051內核完成。在許多情況下,其他方面的考慮將超過ARM內核的效率優(yōu)勢,或者說這種優(yōu)勢是不相關的??紤]使用UART到SPI橋接器,該應用花費大部分時間在外設之間復制數據,而ARM內核會更高效地完成該任務。然而,這也是一個非常小的應用,可能小到足以放入一個僅有2 KB存儲容量的器件就足夠合適。盡管8051內核效率較低,但它仍然有足夠的處理能力去處理該應用中的高數據速率。對于ARM設備來說,可用的額外周期可能處于空閑循環(huán)或“WFI”(等待中斷),等待下一個可用的數據片到來。在這種情況下,8051內核仍然最有意義,因為額外的CPU周期是微不足道的,而較小的Flash封裝會節(jié)約成本。如果我們要利用額外的周期去做些有意義的工作,那么額外的效率將是至關重要的,且效率越高可能越有利于ARM內核。這個例子說明,清楚被開發(fā)系統(tǒng)所關注的環(huán)境中的各種架構優(yōu)勢是何等重要。做出這個最佳的決定是簡單但卻重要的一步。
(3) 指針
8051設備沒有像ARM設備那樣的統(tǒng)一的存儲映射,而是對訪問代碼(Flash)、IDATA(內部RAM)和XDATA(外部RAM)有不同的指令。為了生成高效的代碼,8051代碼的指針會說明它指向什么空間。然而,在某些情況下,使用通用指針可以指向任何空間,但是這種類型的指針是低效的訪問。例如,將指針指向緩沖區(qū)并將該緩沖區(qū)數據輸出到UART的函數。如果指針是XDATA指針,那么XDATA數組能被發(fā)送到UART,但在代碼空間中的數組首先需要被復制到XDATA。通用指針能同時指向代碼和XDATA空間,但速度較慢,并且需要更多的代碼來訪問。專用區(qū)域指針在大多情況下能發(fā)揮作用,但是通用指針在編寫使用情況未知的可重用代碼時非常靈活。如果這種情況在應用中很常見,那么8051就失去了其效率優(yōu)勢。
(4) 通過選擇完成工作
我已經注意到多次,運算傾向于選擇ARM,而控制傾向于選擇8051,但沒有應用僅僅著眼于計算或控制。我們怎樣才能表征廣義上的應用,并計算出它的合適范圍呢?讓我們考慮一個由10%的32位計算、25%的控制代碼和65%的一般代碼構成的假定的應用,它不能明確地歸于8位或32位類別。這個應用也更注重代碼空間而不是執(zhí)行速度,因為它并不需要所有可用MIPS,并且必須為成本進行優(yōu)化。成本比應用速度更為重要的事實在一般代碼情形下將給8051內核帶來微弱優(yōu)勢。此外,8051內核在控制代碼中有中間等級的優(yōu)勢。ARM內核在32位計算上占上風,但是這并非是很多應用所考慮的??紤]到所有這些因素,這個特殊的應用選擇8051內核更加合適。
如果進行細微的改變,假設該應用更關心執(zhí)行速度而非成本,那么通用代碼不會傾向于哪種架構,并且ARM內核在計算代碼中全面占優(yōu)。在這種情況下,雖然有比計算更多的控制代碼,但是總的結果將相當均衡。
顯然,在這個過程中有很多的評估,但是分解應用,然后評估每一組件的技術將幫助并確保我們了解在哪種情況下哪種架構有更顯著的優(yōu)勢。
功耗
當查閱數據手冊時,很容易根據功耗數據得出哪個MCU更優(yōu)的結論。雖然睡眠模式和工作模式電流性能在某些類型MCU上更優(yōu),但是這一評估可能會非常具有誤導性。占空比(在每個電源模式上分別占用多少時間)將始終占據功耗的主導地位。除非兩個器件的占空比相同,否則數據手冊中的電流規(guī)格幾乎是沒有意義的。最適合應用需求的核心架構通常具有更低的功耗。
假設有一個系統(tǒng),在設備被喚醒后添加一個16位ADC樣本到移動平均,然后返回到休眠狀態(tài),直到獲取下一個樣本時才又被喚醒。該任務涉及到大量16位和32位計算。ARM設備將能夠進行計算,并比8051設備更快返回到休眠狀態(tài),這會讓系統(tǒng)功耗更低,即使8051具有更好的睡眠和工作模式電流。當然,如果進行的任務更適合8051設備,那么MCU功耗由于相同的原因而對系統(tǒng)有利。
外設特性也能夠以這樣或那樣的方式影響功耗。例如,大多數Silicon Labs的EFM32 32位MCU具有低功耗的UART(LEUART),能夠在低功耗模式下接收數據,而只有兩個EFM8 MCU具有此功能。這一外設影響電源的占空比,且在任何需要等待UART通信的應用中都比缺乏LEUART的EFM8在很大程度上有利于EFM32 MCU。遺憾的是,除了讓MCU供應商的本地應用工程師利用EFM8來解決上述問題之外,并沒有簡單的指南來評估這些外設因素。系統(tǒng)設計人員還應了解MCU各種功耗模式下,可完成的處理任務。
8位或32位?我仍然不能決定!
如果考慮到所有這些變量后,仍然不清楚哪些MCU架構是最好的選擇,會怎樣?那好吧!這說明,它們都是很好的選擇,你使用哪種體系結構并不是緊要的事情。如果沒有明確的技術優(yōu)勢,那么過去的經驗和個人喜好在你的MCU架構決定中也起到了很大的作用。此外,你也可以利用這個機會去評估可能的未來項目,如果大多數未來項目更適合ARM設備,那么選擇ARM,如果未來項目更側重于降低成本和尺寸,那么就選擇8051。
這到底意味著什么呢?
8位MCU仍然可以為嵌入式開發(fā)人員提供許多功能,并且越來越關注物聯網。當開發(fā)人員開始設計時,重要的是確保從工具箱中獲得合適的工具。雖然我還是很樂意把8051出售給可能更適合選擇32位設備的客戶,但是我不禁想象,如果開發(fā)人員僅僅花費1個小時思考就作出決定,那么他們的工作將會更加容易、最終的產品將會更好。
實際上的難題是,不能僅僅依賴于PowerPoint演示文稿中的一兩個要點,就得出選擇MCU架構的結論。然而,一旦你有正確的信息,并愿意花一點時間應用它,就不難作出最佳選擇。
關于作者
Josh Norem是Silicon Labs微控制器和無線產品系統(tǒng)工程師。他于2006年加入Silicon Labs公司,任職產品和測試工程師,擔任過包括測試和應用方面的多個技術職位,目前擔任系統(tǒng)工程師。在加入Silicon Labs公司之前,Josh就職于AMD公司,負責x86微處理器的系統(tǒng)級速度調試工作。此前,他就職于TI公司,負責DSP產品的開發(fā)和存儲測試。Josh擁有伊利諾斯大學(University of Illinois)Urbana-Champaign分校電氣工程科學學士學位。
收稿日期:(責任編輯:楊迪娜2016-03-31)