8位還是32位,微處理器怎么選?
另一個原因是ARM處理器比8051核心具有更多的自由使用堆疊。通常情況下,8051裝置針對每次函式呼叫僅在堆疊上儲存返回位址(2位元組),透過通常分配給堆疊的靜態變數處理大量的任務。在某些情況下,這會產生問題,因為這會造成函數預設不可重入。然而,這也意味著必須保留的堆疊空間很小,且完全可預測,這在RAM容量有限的MCU中至關重要。
本文引用地址:http://www.104case.com/article/201807/383693.htm舉個簡單的例子,試驗者設計了以下程式,然后測量funcB內部的堆疊深度,發現M0+核心的堆疊用了四十八個位元組,而8051核心的堆疊僅用了十六個位元組。當然,8051核心還靜態配置了八個位元組的RAM,總共用了二十四個位元組。在較大的系統中,這個差異顯得微不足道,但是在僅有256位元組的ARM的系統中,這就變得很重要。
架構細節之考量
假設有基于ARM和基于8051的MCU各一個,配有所需的周邊,那么對于較大的系統或需要重點考慮易用性的應用來說,ARM裝置是更好的選擇。如果首要考量的是低成本/小尺寸,那么8051裝置將是更好的選擇。本文以下對于每種架構更擅長的應用進行更詳細的分析,同時也劃分出一般原則。
影響延時因素
兩種架構的中斷和函式呼叫延時存在很大差異,8051比ARM Cortex-M核心更快。
此外,高階周邊匯流排(APB)配備的周邊也會影響延時,這是因為資料必須透過APB和AMBA高性能匯流排(AHB)傳輸。最后,當使用高頻核心時脈時,許多基于Cortex-M的MCU需要分配APB時脈,這也增加了周邊延時。
試驗者做了個簡單的實驗,實驗中的中斷是透過I/O引腳觸發的。該中斷對引腳發出一些訊號,并根據引發中斷的引腳更新標志,之后再量測其部分參數的變化。
8051核心在中斷服務程式(ISR)進入和退出時顯示出優勢。但是,隨著中斷服務程式(ISR)越來越大和執行時間的增加,這些延遲將變得微不足道。和既有原則一致,系統越大,8051的優勢越小。此外,如果中斷服務程式(ISR)涉及到大量資料移轉或大于8位元的整數資料運算,中斷服務程式(ISR)執行時間的優勢將轉向ARM核心。例如,一個采用新樣本更新16位元或32位元轉動平均(Rolling Average)的ADC ISR可能在ARM裝置上執行的更快。
8051核心的基本功能是控制代碼,其中對于變數的存取是分散的,并且使用了許多控制邏輯(If、Case等)。8051核心在處理8位元資料時也是非常有效的,而ARM Cortex-M核心擅長資料處理和32位元運算。此外,32位元資料通道使得ARM MCU復制大的資料更加有效,因為它每次可以移動四個位元組,而8051每次僅能夠移動一個位元組。因此,那些主要把資料從一個地方移到另一個地方(例如UART到CRC或者到USB)的資料流處理應用更適合選擇基于ARM處理器的系統。
來做個簡單的實驗。試驗者編譯以下兩種架構的函數(公式1),變數大小為uint8_t、uint16_t和uint32_t。
隨著資料量的增加,8051核心需要越來越多的代碼來完成這項工作,最終超過了ARM函數的大小。在16位元的情況下,代碼大小幾乎類似,在執行速度上稍優于32位元核心,因為相同代碼通常需要更少周期。還有一點很重要:只有采用最佳化的ARM編譯代碼時,這種比較才有效。未最佳化的代碼需要花費幾倍長的時間。
這并不意味著有大量資料移動或32位元運算的應用不應該選擇8051核心完成。
在許多情況下,其它方面的考量將超過ARM核心的效率優勢,或者說這種優勢是無關緊要的。舉例來說,考慮使用UART到SPI橋接器時,該應用花費大部分時間在周邊之間復制資料,而ARM核心會更高效地完成該任務。然而,這也是一個非常小的應用,可能放入到一個僅有2KB儲存容量的晶片就足夠了。
盡管8051核心效率較低,但它仍然有足夠的處理能力去處理該應用中的高資料速率。對于ARM裝置來說,可用的額外周期可能處于空閑回圈或“等待中斷”(WFI),等待下一個可用的資料到來。在這種情況下,8051核心仍然最有意義,因為額外的CPU周期是微不足道的,而較小的Flash封裝會節約成本。如果使用者要利用額外的周期去做些有意義的工作,那么額外的效率將是至關重要的,且效率越高越可能越有利于ARM核心。這個例子說明,清楚被開發系統所關注的環境中的各種架構優勢是何等重要,而作出這個最佳的決定是簡單但卻重要的一步。
指標為8051特殊優勢
8051裝置不像ARM裝置般統一的儲存映射,而是對存取碼(Flash)、IDATA(內部RAM)和XDATA(外部RAM)有不同的指令。為了產生高效的代碼,8051代碼的指標會說明它指向什么空間。然而,在某些情況下,使用通用指標,可以指向任何空間,但是這種類型的指標是低效的存取。例如,將指標指向緩沖區并將該緩沖區資料輸出到UART的函數。如果指標是XDATA指標,那么XDATA陣列能被發送到UART,但在代碼空間中的陣列,首先需要被復制到XDATA。通用指標能同時指向代碼和XDATA空間,但速度較慢,并且需要更多的代碼來存取。
專用區域指標在大多情況下能發揮作用,但是通用指標在編寫使用情況未知的可重用代碼時非常靈活。如果這種情況在應用中很常見,那么8051就失去了其效率優勢。
仔細評估了解MCU使用優勢
本文已經多次注意到,運算傾向于選擇ARM,而控制傾向于選擇8051,但沒有應用僅僅著眼于計算或控制,該怎樣才能定義各種應用,并計算出它的合適范圍呢?
本文考量一個由10%的32位元計算、25%的控制代碼和65%的一般代碼構成的假定應用時,其不能明確的歸成8或32位元類別。這個應用也更注重代碼空間而不是執行速度,因為其并不需要所有可用的運算效能,并且必須為成本進行最佳化。
成本比應用速度更為重要的事實在一般代碼情形下將為8051核心帶來些微優勢。此外,8051核心在控制代碼中有中間等級的優勢。ARM核心在32位元計算方面占上風,但是這并非是很多應用所重視的。考量到所有這些因素,這個特殊的應用選擇8051核心更加合適。
如果做一個細微的改變,假設該應用更關心執行速度而非成本,那么通用代碼不會傾向于哪種架構,并且ARM核心在計算代碼中全面占有優勢。在這種情況下,雖然有比計算更多的控制代碼,但是最后結果將相當均衡。顯然,在這個過程中有很多的評估,但是分解應用,然后評估每一元件的技術將能確保使用者了解,在哪種情況下哪種架構有更顯著的優勢。
評論