在嵌入式開發(fā)設(shè)計中,對客戶來說用什么技術(shù),、芯片不是主要的,。主要的是能否滿足要求。高性價比,、開發(fā)門檻底,、易于使用才是硬道理。Cortex-M3是一個32位處理器內(nèi)核,。從理論上來說性價比高,。
三級流水線+分支預(yù)測
ARM Cortex-M3與ARM7內(nèi)核一樣,采用適合于微控制器應(yīng)用的三級流水線,,但增加了分支預(yù)測功能?,F(xiàn)代處理器大多采用指令預(yù)取和流水線技術(shù),以提高處理器的指令執(zhí)行速度,。流水線處理器在正常執(zhí)行指令時,,如果碰到分支(跳轉(zhuǎn))指令,由于指令執(zhí)行的順序可能會發(fā)生變化,,指令預(yù)取隊列和流水線中的部分指令就可能作廢,,而需要從新的地址重新取指、執(zhí)行,,這樣就會使流水線“斷流”,,處理器性能因此而受到影響。特別是現(xiàn)代C語言程序,,經(jīng)編譯器優(yōu)化生成的目標代碼中,,分支指令所占的比例可達10-20%,對流水線處理器的影響會的更大,。為此,,現(xiàn)代高性能流水線處理器中一般都加入了分支預(yù)測部件,就是在處理器從存儲器預(yù)取指令時,,當遇到分支(跳轉(zhuǎn))指令時,,能自動預(yù)測跳轉(zhuǎn)是否會發(fā)生,再從預(yù)測的方向進行取指,,從而提供給流水線連續(xù)的指令流,流水線就可以不斷地執(zhí)行有效指令,保證了其性能的發(fā)揮,。
ARM Cortex-M3內(nèi)核的預(yù)取部件具有分支預(yù)測功能,,可以預(yù)取分支目標地址的指令,使分支延遲減少到一個時鐘周期,。
哈佛結(jié)構(gòu)
ARMCortex-M3采用哈佛結(jié)構(gòu),,并選擇了適合于微控制器應(yīng)用的三級流水線,但增加了分支預(yù)測功能,。
從內(nèi)核訪問指令和數(shù)據(jù)的不同空間與總線結(jié)構(gòu),,可以把處理器分為哈佛結(jié)構(gòu)和普林斯頓結(jié)構(gòu)(或馮.諾伊曼結(jié)構(gòu))。馮.諾伊曼結(jié)構(gòu)的機器指令,、數(shù)據(jù)和I/O共用一條總線,,這樣內(nèi)核在取指時就不能進行數(shù)據(jù)讀寫,反之亦然,。這在傳統(tǒng)的非流水線處理器(如MCS51)上是沒有什么問題的,,它們?nèi)≈浮?zhí)行分時進行,,不會發(fā)生沖突,。但在現(xiàn)代流水線處理器上,由于取指,、譯碼和執(zhí)行是同時進行的(不是同一條指令),,一條總線就會發(fā)生總線沖突,必須插入延遲等待,,從而影響了系統(tǒng)性能,。ARM7TDMI內(nèi)核就是這種結(jié)構(gòu)的。
而哈佛結(jié)構(gòu)的處理器采用獨立的指令總線和數(shù)據(jù)總線,,可以同時進行取指和數(shù)據(jù)讀寫操作,,從而提高了處理器的運行性能。ARM Cortex-M3,、ARM966E,、ARM926EJ、ARM1136JF等內(nèi)核都采用了哈佛結(jié)構(gòu),。
內(nèi)置嵌套向量中斷控制器(NVIC)
針對業(yè)界對ARM處理器中斷響應(yīng)的問題,,Cortex-M3首次在內(nèi)核上集成了嵌套向量中斷控制器(NVIC)。Cortex-M3的中斷延遲只有12個時鐘周期(ARM7需要24-42個周期),;Cortex-M3還使用尾鏈技術(shù),,使得背靠背(back-to-back)中斷的響應(yīng)只需要6個時鐘周期(ARM7需要大于30個周期)。以STM32運行在75MHz為例,,中斷延遲只有80ns-160ns,。另外,,Cortex-M3采用了基于棧的異常模式,使得芯片初始化的封裝更為簡單,。
ARM7TDMI內(nèi)核不帶中斷控制器,,具體MCU的中斷控制器是各芯片廠商自己加入的,這使得各廠商的ARM7 MCU中斷控制部分都不一樣,,給用戶使用及程序移植帶來了很大麻煩,。Cortex-M3內(nèi)核集成NVIC,各廠商生產(chǎn)的基于Cortex-M3內(nèi)核的MCU都具有統(tǒng)一的中斷控制器,,對用戶使用各種Cortex-M3 MCU,,特別是中斷編程帶來了很大的便利。
支持位綁定操作
以前的ARM內(nèi)核不支持位操作,,當需要對一個變量或端口的某一位操作時,,先要用邏輯與/或指令屏蔽其他的位,使位操作需要較多的指令和時鐘周期,。ARM Cortex-M3采用了一種特殊的方法——位綁定:把一個地址單元的32位變量中的每一位,,通過一個簡單的地址轉(zhuǎn)換算法,映射到另一個地址空間,,每一位占用一個地址,,對此地址空間的操作,只有數(shù)據(jù)的最低一位是有效的,,其余高31位的值被忽略,。相當于把一個“橫”的32位字給“豎”起來。這樣對新的映射空間操作時,,就可以不用屏蔽操作,,優(yōu)化了RAM和I/O寄存器的讀寫,提高了位操作的速度,。
這種方法粗看起來好像損失了很多地址空間,,其實對于32位的ARM處理器而言,總共可以尋址4GB的空間,,而對于一個MCU來說,,一般只用到幾百KB的空間。所以這種處理方法絲毫不會影響一個MCU的正常使用,,又大大簡化了處理器的設(shè)計,,可以說是一種良策。
支持串行調(diào)試(SWD)
ARM處理器一般都使用JTAG調(diào)試接口,,使得仿真,、調(diào)試工具統(tǒng)一而廉價,方便了用戶開發(fā),。但JTAG調(diào)試接口至少要占用芯片的5-6個引腳,,這對于一些引腳較少的MCU來說,,有時會對仿真調(diào)試和I/O使用帶來麻煩。
ARM Cortex-M3在保持原來JTAG調(diào)試接口的基礎(chǔ)上,,還支持串行調(diào)試(SWD),。使用SWD時,只占用2個引腳,,就可以進行所有的仿真和調(diào)試,節(jié)省了調(diào)試用引腳,,用戶就可以使用更多的引腳,。
另外,Cortex-M3支持8個硬件斷點(ARM7,、ARM9只支持2個硬件斷點),,可以減少斷點調(diào)試時對代碼的影響,保證仿真,、調(diào)試的時序準確性,。
內(nèi)核支持低功耗模式
ARM內(nèi)核已經(jīng)是一個高性能、低功耗的內(nèi)核,,但ARM7,、ARM9等內(nèi)核本身只有運行/停止模式,沒有其他模式,。各芯片廠商只能在內(nèi)核基礎(chǔ)上,,對各自加入的外設(shè)定義各種低功耗模式。Cortex-M3加入了類似于8位處理器的內(nèi)核低功耗模式,,支持3種功耗管理模式:通過一條指令立即睡眠,;異常/中斷退出時睡眠;深度睡眠,。使整個芯片的功耗控制更為有效,。以STM32為例,其RAM和寄存器狀態(tài)保持的停機模式耗電僅為14uA,,從此狀態(tài)的啟動時間僅為7us,。
Cortex-M3的運行功耗(Active Mode)也很低。以STM32系列微控制器為例,,其典型功耗約為500uA/MHz,,也只是目前業(yè)界超低功耗單片機MSP430系列(約為250uA/MHz)的2倍。但MSP430是16位處理器,,而STM32是32位處理器,。
高效的Thumb2 16/32位混合指令集
ARM7、ARM9等內(nèi)核使用不同的處理器狀態(tài)分別執(zhí)行32位的ARM指令和16位的Thumb指令,,使用狀態(tài)切換指令完成ARM狀態(tài)和Thumb狀態(tài)的切換,。Cortex-M3使用更高效的Thumb2指令集,,它是一種16/32位混合編碼指令,兼容Thumb指令,。對于一個應(yīng)用程序編譯生成的Thumb2代碼,,以接近Thumb編碼的代碼尺寸,達到了接近ARM編碼的運行性能,。Thumb2是一種緊湊,、高效的新一代指令集。
Thumb2指令集是面向高級語言的指令集,,適合于C語言編程,,由編譯器生成目標代碼,不建議直接使用Thumb2匯編語言編程,。
32位硬件除法和單周期乘法
以往的ARM處理器沒有除法指令,,在某些除法密集型應(yīng)用中性能不盡如意。Cortex-M3加入了32位除法指令,,彌補了這一缺陷,,使Cortex-M3可以和其他通用處理器一樣,完成各種數(shù)學(xué)運算操作,。
Cortex-M3還改進了乘法運算部件,,32結(jié)果的32位x32位乘法操作只要一個時鐘周期。這一性能使得使用Cortex-M3來進行乘,、乘加運算時,,已逼近DSP的性能,因此特別適合一些需要簡單DSP的應(yīng)用領(lǐng)域,,如電機控制,、數(shù)字濾波、FFT變換等,。
需要指出的是,,32位的乘/除運算,對于一個8位機而言,,已經(jīng)是一段比較復(fù)雜的程序,,而對于32位的Cortex-M3而言,只需一句指令,。因此,,即使二者工作主頻一樣,實際運行性能也不是一個數(shù)量級的,。
支持存儲器非對齊訪問
基于Cortex-M3的MCU,,為提高性能,其內(nèi)部存儲器(Flash,、RAM)都是32位編址的,。這樣當常量,、變量是字節(jié)或半字類型時,如果處理器只支持對齊訪問(以往的處理器都是如此),,那么這些字節(jié)/半字類型的數(shù)據(jù)也必須被分配,、占用一個32位的存儲單元,這樣就浪費了部分存儲空間,。
Cortex-M3支持存儲器的非對齊訪問,,它可以訪問存儲在一個32位單元中的字節(jié)/半字類型數(shù)據(jù),這樣4個字節(jié)類型(或2個半字類型)數(shù)據(jù)可以被分配在一個32位的單元中,,提高了存儲器的利用率,。對于一般的應(yīng)用程序而言,這種技術(shù)可以節(jié)省約25%的SRAM使用量,,從而可以選擇SRAM較小、更廉價的MCU,。
定義了統(tǒng)一的存儲器映射
ARM7,、ARM9等內(nèi)核沒有定義存儲器映射,各芯片廠商自己定義了存儲器映射,,這使得各廠商的MCU存儲器映射都不完全一致,,給用戶學(xué)習(xí)使用及程序移植帶來了麻煩。
Cortex-M3內(nèi)核定義了統(tǒng)一的存儲器映射,,各廠商生產(chǎn)的基于Cortex-M3內(nèi)核的微控制器芯片都具有一致的存儲器映射,,對用戶使用各種基于Cortex-M3的 MCU以及代碼在不同MCU上的移植帶來了很大的便利。
嵌入式開發(fā)設(shè)計服務(wù)商朗銳智科(www.lrist.com)認為基于Cortex-M3的微控制器相比于ARM7TDMI的微控制器,,在相同的工作時鐘頻率下:平均性能要高約30%,;代碼尺寸要比ARM編碼小約30%;價格一般也更低,。以STM32系列Cortex-M3微控制為例,,工作頻率可達75MHz,而價格比STR71x系列ARM7TDMI芯片要低約30%,,具有極高的性價比,。目前已有的芯片的功能太少。Cortex M系列在處理能力基本與ARM7同,,主要是成本低,,功耗小。