正如汽車(chē)代替了馬車(chē),電子郵件代替了普通郵件一樣,32位元微控制器(MCU)讓8位元MCU變得黯然失色。盡管未來(lái)8位元MCU朝向32位元MCU發(fā)展將會(huì)成為現(xiàn)實(shí),但目前還沒(méi)那么容易實(shí)現(xiàn)。事實(shí)證明8位元MCU和32位元MCU仍是互補(bǔ)的技術(shù),在一些方面各有千秋,而在其它方面的表現(xiàn)卻同樣出色。這其中的竅門(mén)在于厘清何種應(yīng)用適合哪種MCU架構(gòu)。
本文比較了8位元MCU和32位元MCU的使用案例,可作為如何選擇這兩種MCU架構(gòu)的指南使用。
本文大部分32位元范例將關(guān)注于ARM Cortex-M裝置,Cortex-M在不同MCU供應(yīng)商產(chǎn)品組合中表現(xiàn)非常相似。由于8位元MCU有很多種架構(gòu),所以很難對(duì)8位元供應(yīng)商之間進(jìn)行類(lèi)似的產(chǎn)品比較。為了進(jìn)行比較,本文將使用廣泛應(yīng)用、易于理解的8051 8位元架構(gòu)。
事實(shí)上,「ARM Cortex和8051哪個(gè)比較好」不是個(gè)邏輯問(wèn)題,反而像是在問(wèn)「吉他和鋼琴哪個(gè)好」?真正要解決的問(wèn)題是「哪種MCU最能幫助解決目前面臨的問(wèn)題?」。
不同的任務(wù)須使用不同的工具,使用者目的是要了解「如何才能善用所擁有的工具」,包括8位元和32位元裝置。
對(duì)不同的裝置進(jìn)行比較,須要對(duì)其進(jìn)行測(cè)量。有很多建構(gòu)工具可供選擇,本文盡量選擇一些認(rèn)為能夠進(jìn)行最公平的比較,且最能代表開(kāi)發(fā)人員真實(shí)體驗(yàn)的情境。
以下ARM資料是透過(guò)GCC+ nanoCLibrary和-03最佳化選項(xiàng)所生成。
此一比較試驗(yàn)并不為任何一種裝置的代碼最佳化,只是簡(jiǎn)單實(shí)現(xiàn)90%開(kāi)發(fā)人員都會(huì)使用的常見(jiàn)代碼,并呈現(xiàn)普通開(kāi)發(fā)人員所見(jiàn)到的結(jié)果,而不是理想狀態(tài)下的結(jié)果。當(dāng)然,花費(fèi)諸多時(shí)間、精力和財(cái)力去調(diào)整8051代碼使其表現(xiàn)勝過(guò)ARM是可能的,反之亦然,但一開(kāi)始就選擇適合該項(xiàng)工作的最佳工具比費(fèi)盡心力做最佳化簡(jiǎn)單多了。
8位元MCU功效持續(xù)精進(jìn)
在開(kāi)始對(duì)架構(gòu)進(jìn)行比較前,要注意到并非所有的MCU都是一樣,這一點(diǎn)非常重要。
如果將基于ARM Cortex-M0+處理器的現(xiàn)代MCU與30年前的8051 MCU做對(duì)比,8051 MCU在性能上當(dāng)然不會(huì)勝出。幸運(yùn)的是,許多供應(yīng)商一直對(duì)8位元處理器持續(xù)投資。
例如芯科實(shí)驗(yàn)室(Silicon Labs)正持續(xù)更新基于8051核心的EFM8 MCU產(chǎn)品線,其效能比原始的8051架構(gòu)更高,而且開(kāi)發(fā)過(guò)程也已實(shí)現(xiàn)現(xiàn)代化。所以在許多應(yīng)用中,8位元核心能夠容易彌補(bǔ)比M0+或M3核心不利的地方,甚至在一些方面性能更佳。
開(kāi)發(fā)工具也很重要。現(xiàn)代嵌入式韌體開(kāi)發(fā)需要全功能IDE、現(xiàn)成的韌體庫(kù)、豐富的范例、完整的評(píng)估和入門(mén)套件,以及助手應(yīng)用,以簡(jiǎn)化硬體設(shè)定、資料庫(kù)管理和量產(chǎn)編程之類(lèi)的工作。當(dāng)MCU有了現(xiàn)代化的8位元核心和開(kāi)發(fā)環(huán)境時(shí),在很多情況下,這樣的MCU將超越基于ARM-Cortex的類(lèi)似MCU。
以系統(tǒng)規(guī)模選擇MCU
第一個(gè)一般性原則是:ARM Cortex-M核心更適用于較大的系統(tǒng)規(guī)模(》64KB代碼),而8051裝置適用于較小的系統(tǒng)規(guī)模(《8KB代碼)。中等規(guī)模的系統(tǒng)可以選擇兩種方式,這取決于系統(tǒng)要執(zhí)行的任務(wù)。須要注意的是,在大多數(shù)情況下,周邊組合將會(huì)發(fā)揮重要作用。如果需要三個(gè)UART、一個(gè)LCD控制器、四個(gè)時(shí)脈和兩個(gè)ADC,使用者可能不會(huì)在8位元MCU上找到所有的周邊。
易用性與成本/尺寸之比較
對(duì)于中等規(guī)模的系統(tǒng)來(lái)說(shuō),使用任何一種架構(gòu)都可以完成工作。但主要須考量是選擇ARM核心帶來(lái)的易用性,還是8051裝置帶來(lái)的成本和物理尺寸優(yōu)勢(shì)。
ARM Cortex-M架構(gòu)具備統(tǒng)一的儲(chǔ)存模式,并在所有常見(jiàn)編譯器中支援完整的C99,這使得該架構(gòu)非常易于寫(xiě)韌體。此外,還可得到一系列資料庫(kù)和協(xié)力廠商代碼。
當(dāng)然,這種易用性的代價(jià)就是成本。對(duì)于高復(fù)雜性、上市時(shí)間較短的應(yīng)用或缺乏經(jīng)驗(yàn)的韌體開(kāi)發(fā)人員來(lái)說(shuō),易用性是個(gè)重要因素。
比起32位元MCU,8位元MCU的成本頗具優(yōu)勢(shì)。使用者經(jīng)常會(huì)發(fā)現(xiàn)內(nèi)建2KB/512B(Flash/RAM)的小容量8位元MCU,而卻很難找到低于8KB/2KB的32位元MCU。在不需要很多資源的系統(tǒng)中,儲(chǔ)存容量小的MCU能夠讓系統(tǒng)開(kāi)發(fā)人員獲得顯著的成本降低。因此,對(duì)成本極為敏感或僅需較小儲(chǔ)存容量的應(yīng)用,會(huì)更傾向于選擇8051解決方案。
8位元晶片通常也具備物理尺寸上的優(yōu)勢(shì)。例如Silicon Labs提供的最小32位元QFN封裝為4mm×4mm,而基于8051的8位元晶片的QFN封裝可小至2mm×2mm。
晶片級(jí)封裝(CSP)的8位元和32位元架構(gòu)之間的差異較小,但卻使成本增加,且組裝較難。對(duì)于空間嚴(yán)格受限的應(yīng)用來(lái)說(shuō),通常須要選擇8051裝置來(lái)滿足限制要求。
通用代碼/RAM效率易影響MCU成本
8051 MCU成本較低的主要原因之一是其使用Flash和RAM的效率通常比ARM Cortex-M核心更高,這允許系統(tǒng)采用更少資源實(shí)現(xiàn)。系統(tǒng)越大,這種影響就越小。
然而,這種8位元儲(chǔ)存資源的優(yōu)勢(shì)并不總是如此,這一點(diǎn)很重要。在某些情況下,ARM核心會(huì)像8051核心一樣高效或比其更高效。例如32位元運(yùn)算在ARM MCU上僅需要一條指令,而在8051 MCU上則需要多條8位元指令。顯然,這種代碼在ARM架構(gòu)上有更高的執(zhí)行效率。
ARM架構(gòu)在Flash/RAM尺寸較小時(shí)的兩個(gè)主要缺點(diǎn)是代碼空間效率和RAM使用的可預(yù)測(cè)性。首要也是最明顯的問(wèn)題是通用代碼空間效率。8051核心使用1位元組、2位元組或3位元組指令,而ARM核心使用2位元組或4位元組指令。
通常情況下,8051指令更小,但這一優(yōu)勢(shì)因?qū)嶋H上花費(fèi)許多時(shí)間而受到削弱,ARM核心比8051在一條指令下??能做更多工作。32位元運(yùn)算就是這樣一個(gè)范例。以實(shí)踐來(lái)說(shuō),指令寬度是能在8051上產(chǎn)生適度的更密集代碼。
代碼空間效率
在含有分散式存取變數(shù)的系統(tǒng)中,ARM架構(gòu)的載入/儲(chǔ)存架構(gòu)通常比指令寬度更為重要。試想訊號(hào)量的實(shí)現(xiàn),一個(gè)變數(shù)需要在代碼周?chē)亩鄠€(gè)不同位置進(jìn)行減量(分配)或者增量(釋放)。ARM核心必須將變數(shù)載入到暫存器,對(duì)其進(jìn)行操作并重新儲(chǔ)存,這需要三條指令。另一方面,8051核心可以直接在記憶體位置上進(jìn)行操作,且僅需一條指令。隨著每次對(duì)變數(shù)完成工作量的增大,由載入/儲(chǔ)存而產(chǎn)生的消耗就變得微不足道。但對(duì)于每次僅完成一點(diǎn)工作的情況來(lái)說(shuō),載入/儲(chǔ)存能產(chǎn)生重要影響,讓8051獲得明顯的效率優(yōu)勢(shì)。
盡管訊號(hào)量在嵌入式軟體中并非常見(jiàn)結(jié)構(gòu),但簡(jiǎn)單的計(jì)數(shù)器和標(biāo)志卻廣泛應(yīng)用于控制導(dǎo)向的應(yīng)用中并發(fā)揮相同的作用。許多常見(jiàn)的MCU代碼都屬于這一類(lèi)型。
另一個(gè)原因是ARM處理器比8051核心具有更多的自由使用堆疊。通常情況下,8051裝置針對(duì)每次函式呼叫僅在堆疊上儲(chǔ)存返回位址(2位元組),透過(guò)通常分配給堆疊的靜態(tài)變數(shù)處理大量的任務(wù)。在某些情況下,這會(huì)產(chǎn)生問(wèn)題,因?yàn)檫@會(huì)造成函數(shù)預(yù)設(shè)不可重入。然而,這也意味著必須保留的堆疊空間很小,且完全可預(yù)測(cè),這在RAM容量有限的MCU中至關(guān)重要。
舉個(gè)簡(jiǎn)單的例子,試驗(yàn)者設(shè)計(jì)了以下程式,然后測(cè)量funcB內(nèi)部的堆疊深度(圖1),發(fā)現(xiàn)M0+核心的堆疊用了四十八個(gè)位元組,而8051核心的堆疊僅用了十六個(gè)位元組。當(dāng)然,8051核心還靜態(tài)配置了八個(gè)位元組的RAM,總共用了二十四個(gè)位元組。在較大的系統(tǒng)中,這個(gè)差異顯得微不足道,但是在僅有256位元組的ARM的系統(tǒng)中,這就變得很重要。
圖1 測(cè)量funcB內(nèi)部堆疊程式示意圖。
架構(gòu)細(xì)節(jié)之考量
假設(shè)有基于ARM和基于8051的MCU各一個(gè),配有所需的周邊,那么對(duì)于較大的系統(tǒng)或需要重點(diǎn)考慮易用性的應(yīng)用來(lái)說(shuō),ARM裝置是更好的選擇。如果首要考量的是低成本/小尺寸,那么8051裝置將是更好的選擇。本文以下對(duì)于每種架構(gòu)更擅長(zhǎng)的應(yīng)用進(jìn)行更詳細(xì)的分析,同時(shí)也劃分出一般原則。
影響延時(shí)因素
兩種架構(gòu)的中斷和函式呼叫延時(shí)存在很大差異,8051比ARM Cortex-M核心更快。
此外,高階周邊匯流排(APB)配備的周邊也會(huì)影響延時(shí),這是因?yàn)橘Y料必須透過(guò)APB和AMBA高性能匯流排(AHB)傳輸。最后,當(dāng)使用高頻核心時(shí)脈時(shí),許多基于Cortex-M的MCU需要分配APB時(shí)脈,這也增加了周邊延時(shí)。
試驗(yàn)者做了個(gè)簡(jiǎn)單的實(shí)驗(yàn),實(shí)驗(yàn)中的中斷是透過(guò)I/O引腳觸發(fā)的。該中斷對(duì)引腳發(fā)出一些訊號(hào),并根據(jù)引發(fā)中斷的引腳更新標(biāo)志,之后再量測(cè)其部分參數(shù)的變化。圖2為此次32位元Cortex-M與8051對(duì)照實(shí)驗(yàn)的程式碼與參數(shù)比較。
圖2 測(cè)試程式碼與所得結(jié)果參數(shù)
8051核心在中斷服務(wù)程式(ISR)進(jìn)入和退出時(shí)顯示出優(yōu)勢(shì)。但是,隨著中斷服務(wù)程式(ISR)越來(lái)越大和執(zhí)行時(shí)間的增加,這些延遲將變得微不足道。和既有原則一致,系統(tǒng)越大,8051的優(yōu)勢(shì)越小。此外,如果中斷服務(wù)程式(ISR)涉及到大量資料移轉(zhuǎn)或大于8位元的整數(shù)資料運(yùn)算,中斷服務(wù)程式(ISR)執(zhí)行時(shí)間的優(yōu)勢(shì)將轉(zhuǎn)向ARM核心。例如,一個(gè)采用新樣本更新16位元或32位元轉(zhuǎn)動(dòng)平均(Rolling Average)的ADC ISR可能在ARM裝置上執(zhí)行的更快。
8051核心的基本功能是控制代碼,其中對(duì)于變數(shù)的存取是分散的,并且使用了許多控制邏輯(If、Case等)。8051核心在處理8位元資料時(shí)也是非常有效的,而ARM Cortex-M核心擅長(zhǎng)資料處理和32位元運(yùn)算。此外,32位元資料通道使得ARM MCU復(fù)制大的資料更加有效,因?yàn)樗看慰梢砸苿?dòng)四個(gè)位元組,而8051每次僅能夠移動(dòng)一個(gè)位元組。因此,那些主要把資料從一個(gè)地方移到另一個(gè)地方(例如UART到CRC或者到USB)的資料流處理應(yīng)用更適合選擇基于ARM處理器的系統(tǒng)。
來(lái)做個(gè)簡(jiǎn)單的實(shí)驗(yàn)。試驗(yàn)者編譯以下兩種架構(gòu)的函數(shù)(公式1),變數(shù)大小為uint8_t、uint16_t和uint32_t。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?……公式1
隨著資料量的增加,8051核心需要越來(lái)越多的代碼來(lái)完成這項(xiàng)工作,最終超過(guò)了ARM函數(shù)的大小。在16位元的情況下,代碼大小幾乎類(lèi)似,在執(zhí)行速度上稍優(yōu)于32位元核心,因?yàn)橄嗤a通常需要更少周期。還有一點(diǎn)很重要:只有采用最佳化的ARM編譯代碼時(shí),這種比較才有效。未最佳化的代碼需要花費(fèi)幾倍長(zhǎng)的時(shí)間。
這并不意味著有大量資料移動(dòng)或32位元運(yùn)算的應(yīng)用不應(yīng)該選擇8051核心完成。
在許多情況下,其它方面的考量將超過(guò)ARM核心的效率優(yōu)勢(shì),或者說(shuō)這種優(yōu)勢(shì)是無(wú)關(guān)緊要的。舉例來(lái)說(shuō),考慮使用UART到SPI橋接器時(shí),該應(yīng)用花費(fèi)大部分時(shí)間在周邊之間復(fù)制資料,而ARM核心會(huì)更高效地完成該任務(wù)。然而,這也是一個(gè)非常小的應(yīng)用,可能放入到一個(gè)僅有2KB儲(chǔ)存容量的晶片就足夠了。
盡管8051核心效率較低,但它仍然有足夠的處理能力去處理該應(yīng)用中的高資料速率。對(duì)于ARM裝置來(lái)說(shuō),可用的額外周期可能處于空閑回圈或「等待中斷」(WFI),等待下一個(gè)可用的資料到來(lái)。在這種情況下,8051核心仍然最有意義,因?yàn)轭~外的CPU周期是微不足道的,而較小的Flash封裝會(huì)節(jié)約成本。如果使用者要利用額外的周期去做些有意義的工作,那么額外的效率將是至關(guān)重要的,且效率越高越可能越有利于ARM核心。這個(gè)例子說(shuō)明,清楚被開(kāi)發(fā)系統(tǒng)所關(guān)注的環(huán)境中的各種架構(gòu)優(yōu)勢(shì)是何等重要,而作出這個(gè)最佳的決定是簡(jiǎn)單但卻重要的一步。
指標(biāo)為8051特殊優(yōu)勢(shì)
8051裝置不像ARM裝置般統(tǒng)一的儲(chǔ)存映射,而是對(duì)存取碼(Flash)、IDATA(內(nèi)部RAM)和XDATA(外部RAM)有不同的指令。為了產(chǎn)生高效的代碼,8051代碼的指標(biāo)會(huì)說(shuō)明它指向什么空間。然而,在某些情況下,使用通用指標(biāo),可以指向任何空間,但是這種類(lèi)型的指標(biāo)是低效的存取。例如,將指標(biāo)指向緩沖區(qū)并將該緩沖區(qū)資料輸出到UART的函數(shù)。如果指標(biāo)是XDATA指標(biāo),那么XDATA陣列能被發(fā)送到UART,但在代碼空間中的陣列,首先需要被復(fù)制到XDATA。通用指標(biāo)能同時(shí)指向代碼和XDATA空間,但速度較慢,并且需要更多的代碼來(lái)存取。
專(zhuān)用區(qū)域指標(biāo)在大多情況下能發(fā)揮作用,但是通用指標(biāo)在編寫(xiě)使用情況未知的可重用代碼時(shí)非常靈活。如果這種情況在應(yīng)用中很常見(jiàn),那么8051就失去了其效率優(yōu)勢(shì)。
仔細(xì)評(píng)估了解MCU使用優(yōu)勢(shì)
本文已經(jīng)多次注意到,運(yùn)算傾向于選擇ARM,而控制傾向于選擇8051,但沒(méi)有應(yīng)用僅僅著眼于計(jì)算或控制,該怎樣才能定義各種應(yīng)用,并計(jì)算出它的合適范圍呢?
本文考量一個(gè)由10%的32位元計(jì)算、25%的控制代碼和65%的一般代碼構(gòu)成的假定應(yīng)用時(shí),其不能明確的歸成8或32位元類(lèi)別。這個(gè)應(yīng)用也更注重代碼空間而不是執(zhí)行速度,因?yàn)槠洳⒉恍枰锌捎玫倪\(yùn)算效能,并且必須為成本進(jìn)行最佳化。
成本比應(yīng)用速度更為重要的事實(shí)在一般代碼情形下將為8051核心帶來(lái)些微優(yōu)勢(shì)。此外,8051核心在控制代碼中有中間等級(jí)的優(yōu)勢(shì)。ARM核心在32位元計(jì)算方面占上風(fēng),但是這并非是很多應(yīng)用所重視的。考量到所有這些因素,這個(gè)特殊的應(yīng)用選擇8051核心更加合適。
如果做一個(gè)細(xì)微的改變,假設(shè)該應(yīng)用更關(guān)心執(zhí)行速度而非成本,那么通用代碼不會(huì)傾向于哪種架構(gòu),并且ARM核心在計(jì)算代碼中全面占有優(yōu)勢(shì)。在這種情況下,雖然有比計(jì)算更多的控制代碼,但是最后結(jié)果將相當(dāng)均衡。顯然,在這個(gè)過(guò)程中有很多的評(píng)估,但是分解應(yīng)用,然后評(píng)估每一元件的技術(shù)將能確保使用者了解,在哪種情況下哪種架構(gòu)有更顯著的優(yōu)勢(shì)。
功耗影響須多方考量
當(dāng)查閱資料手冊(cè)時(shí),很容易根據(jù)功耗資料得到哪個(gè)MCU更佳的結(jié)論。雖然睡眠模式和工作模式電流性能在某些類(lèi)型MCU上確實(shí)更佳,但是這一評(píng)估可能會(huì)非常容易產(chǎn)生誤導(dǎo)。
工作周期(在每個(gè)電源模式上分別占用多少時(shí)間)始終占據(jù)能耗的主導(dǎo)地位。除非兩個(gè)晶片的工作周期相同,否則資料手冊(cè)中的電流規(guī)格幾乎是沒(méi)有意義的。最適合應(yīng)用需求的核心架構(gòu),通常具備更低的能耗。
假設(shè)有一個(gè)系統(tǒng),在裝置被喚醒后添加一個(gè)16位元ADC樣本到轉(zhuǎn)動(dòng)平均,然后返回到休眠狀態(tài),直到獲取下一個(gè)樣本時(shí)才又被喚醒。該任務(wù)涉及到大量16位元和32位元計(jì)算。ARM裝置將能夠進(jìn)行計(jì)算,并比8051裝置更快返回到休眠狀態(tài),這會(huì)讓系統(tǒng)功耗更低,即使8051具備更好的睡眠和工作模式電流。當(dāng)然,如果進(jìn)行的任務(wù)更適合8051裝置,那么MCU能耗由于相同的原因而對(duì)系統(tǒng)有利。
周邊特性也能夠以類(lèi)似的方式影響功耗。例如,大多數(shù)Silicon Labs的EFM32 32位元MCU具備低功耗的UART(LEUART),能夠在低功耗模式下接收資料,而卻只有兩個(gè)EFM8 MCU具備此功能。此周邊影響電源的工作周期,且在任何須要等待UART通訊的應(yīng)用中,具備LEUART的EFM32 MCU都比缺乏LEUART的EFM8有利。遺憾的是,除了讓MCU供應(yīng)商的現(xiàn)場(chǎng)應(yīng)用工程師利用EFM8來(lái)解決問(wèn)題,沒(méi)有簡(jiǎn)單的指南來(lái)評(píng)估這些周邊因素。同時(shí),系統(tǒng)設(shè)計(jì)人員還應(yīng)了解各種MCU能耗模式下可完成的處理任務(wù)。
ARM/8051各有優(yōu)缺選擇合適工具為開(kāi)發(fā)重點(diǎn)
如果考量到所有這些變數(shù)后,仍然不清楚哪些MCU架構(gòu)是最好的選擇,那會(huì)如何?這表示,不管是8位元或是32位元都是很好的選擇,使用者使用哪種體系架構(gòu)都不要緊。如果沒(méi)有明確的技術(shù)優(yōu)勢(shì),那么過(guò)去的經(jīng)驗(yàn)和個(gè)人喜好在MCU架構(gòu)決定中也發(fā)揮很大的作用。此外,使用者也可以利用這個(gè)機(jī)會(huì)去評(píng)估可能的未來(lái)專(zhuān)案。如果大多數(shù)未來(lái)專(zhuān)案更適合ARM裝置,那么選擇ARM,如果未來(lái)項(xiàng)目更側(cè)重于降低成本和尺寸,那么就選擇8051。
8位元MCU仍然可以為嵌入式開(kāi)發(fā)人員提供許多功能,并且越來(lái)越重視物聯(lián)網(wǎng)。當(dāng)開(kāi)發(fā)人員開(kāi)始設(shè)計(jì)時(shí),重要的是確保從工具箱中獲得合適的工具。實(shí)際上的難題是,不能僅僅依賴于PowerPoint資料中的一兩個(gè)要點(diǎn)就歸納出選擇MCU架構(gòu)的結(jié)論。然而,一旦使用者有正確的資訊,并愿意花一點(diǎn)時(shí)間來(lái)實(shí)際試用產(chǎn)品,就不難作出最佳選擇。
評(píng)論
查看更多