ARM宣布推出 Cortex 微控制器軟件接口標準 (Microcontroller Software Interface Standard,CMSIS)。他們聲稱,對于新器件的軟件開發(fā)項目或將現(xiàn)有軟件在不同芯片廠商的基于 Cortex-M 的單片機之間移植時,這項標準可降低軟件設計成本。這聽起來很不錯,但事實確實如此嗎?本文將對這些說法進行研究以確定其真實度。我們先回顧一下典型單片機的元件,然后觀察在典型外設固件庫上添加一個抽象層能夠實現(xiàn)或無法實現(xiàn)什么樣的結果。
根據(jù) ARM 所言,CMSIS 是“適用于 Cortex-M 處理器系列的與廠商無關的硬件抽象層。CMSIS為不同芯片廠商和中間件提供商的處理器提供了簡單一致的軟件接口,這簡化了軟件重用,縮短了開發(fā)人員對于新單片機(MCU)的學習過程以及新器件的上市時間。CMSIS的問世使芯片廠商可將資源集中在突出其產(chǎn)品的外設功能上,無需在對單片機進行編程時保持各自不兼容的標準?!?/p>
為聯(lián)系本文環(huán)境,我們需要了解一下單片機是如何設計的。單片機是高度集成的系統(tǒng)解決方案。實際上,可將其稱為片上系統(tǒng) (System on Chip, SoC)。與任何 SoC一樣,該芯片的功能是通過與 CPU 內核集成在一起的硬件外設進行定義的。當然,CPU 內核的性能和架構決定了可在芯片上執(zhí)行的代碼種類,但芯片與系統(tǒng)其他部分的交互要通過外設來進行。單片機外設的靈活性使其成為獨特的 SoC。由于這種靈活性,單片機的設置和控制可能相當復雜。在實際進行任何操作前需要設置大量寄存器。為幫助設計人員完成此任務,芯片廠商提供了可簡化代碼開發(fā)的固件庫。這些庫包括了用于設置所有寄存器以及控制單片機各個部分所必需的所有函數(shù)。由于各個芯片廠商的單片機具有不同的外設和功能,因此每個廠商都會提供一個獨一無二的庫,以使其產(chǎn)品在競爭對手中脫穎而出。我們來看一下單片機的哪些部分形成了各廠商之間的區(qū)別。
每個單片機制造商對實現(xiàn)整體系統(tǒng)集成 (即系統(tǒng)總線、時鐘樹和存儲器)都有自己的方式,即使 CPU 內核相同時也是如此。憑借這些實現(xiàn)方案,各制造商建立了各自的優(yōu)勢,使自己的單片機成為更適合客戶的解決方案。讓我們來研究每一個系統(tǒng)組成:
? 時鐘樹提供系統(tǒng)的時鐘脈沖,以協(xié)調所有其他功能的時序。時鐘樹旨在優(yōu)化系統(tǒng)速度并使系統(tǒng)實現(xiàn)經(jīng)濟運行。芯片所含的功能和外設以及芯片旨在解決的問題直接影響著時鐘樹的結構。因此,各家制造商的時鐘樹結構不盡相同。此外,在進行任何操作前,都需要使用適當?shù)闹祵r鐘樹寄存器進行編程。
? 系統(tǒng)總線的架構定義了所有 MCU 功能的集成方式。有些制造商會使用一條或多條外設總線,具體情況取決于所集成的外設。所有這一切都會改變需要設置的寄存器的種類和數(shù)量,以盡可能利用所有可用的功能。
? 盡管所有單片機都同時具有非易失性存儲器(如閃存)和易失性存儲器(如 SRAM),但每家制造商的具體集成方式都不相同。有些制造商將閃存存儲器直接連接到內核與總線矩陣,而其他一些制造商則將其連接到系統(tǒng)總線或總線矩陣。RAM 有時會分布于兩個獨立的存儲器組,以允許內核和外設同時訪問。這些不同的存儲器結構可能會影響代碼的編寫方式,當設計人員從一個制造商轉到另一個時,這通常會對應用程序的性能產(chǎn)生直接影響。每個制造商都在其單片機上提供了一系列標準和專用的硬件外設。
? 標準外設提供通用功能,例如通過 UART 或 SPI 實現(xiàn)串行通信。這些外設也可以是定時器或 PWM。標準外設在所有 MCU 制造商的產(chǎn)品中都很常見,但它們可能會有某些增強功能,為客戶提供更大的靈活性和 / 或更多功能。與單片機的任何其他部分一樣,標準外設有自己的寄存器。盡管標準外設的功能可能相同,但幾乎每個制造商實現(xiàn)標準外設的方式都不相同,進而導致各個 MCU 廠商產(chǎn)品的寄存器結構也各不相同。
? 專用外設適用于某些應用獨有的特定任務。例如,無刷電機控制 PWM、用于音頻回放的 I2S 或加密 / 解密。根據(jù)復雜性的不同,這些專用外設可能只有幾個寄存器,也可能有 30 個以上的寄存器。
如前文所述,每個MCU制造商都有自己的外設固件庫,用以幫助客戶實現(xiàn)設計并迅速進入原型設計階段。固件庫包括由芯片制造商開發(fā)的代碼,用于設置芯片各部分中 (如時鐘、總線和外設)的所有寄存器。提供可輕松設置各個寄存器的函數(shù)調用,以助于開發(fā)人員專注于輸入應用程序所需的參數(shù)。函數(shù)負責將這些參數(shù)寫入相應的存儲器位置。通過使用固件庫中的函數(shù),開發(fā)人員不必了解所有寄存器及其位置便可使芯片正常運行。這樣可將節(jié)省下的時間集中在更特定于應用程序的任務上,例如為應用程序開發(fā)適當算法。
外設固件庫還包括用于控制外設 (也通過寄存器完成)的函數(shù)。同樣,開發(fā)人員無需關注寄存器的位和單元,只需為其代碼選擇正確的函數(shù)。抽象層可應用到外設固件庫以幫助簡化代碼開發(fā),這正是 CMSIS 發(fā)揮作用的地方。但還有一個疑問:這是否會產(chǎn)生代碼兼容性問題?
現(xiàn)在我們已清楚地了解各個單片機制造商都能提供什么,我們可以看一下抽象層能為設計人員做些什么(如果有的話)。首先,我們來看 CMSIS 聲稱所能提供的功能,同時應記住前文所述的系統(tǒng)架構、外設和固件庫。
對于CMSIS 版本 1.3
1. 內核外設訪問層:包含用于訪問內核寄存器和外設的名稱定義、地址定義和輔助函數(shù)。它還定義了一個用于 RTOS 內核的器件無關接口,其中包含調試通道定義。
2. 這些軟件層由芯片合作伙伴通過以下方式進行擴展:
a) 器件外設訪問層,提供所有器件外設的定義;
b) 用于外設的訪問函數(shù)(可選):提供用于外設的附加輔助函數(shù)。
仔細閱讀此說明后,我們可以看到 CMSIS 提供了一種通用語言,通過它可描述 MCU 的不同元件。接下來,我們看一下兩個不同的 “芯片合作伙伴”(使用 ARM Cortex-M 處理器內核的 MCU 制造商)所生產(chǎn)的 MCU 中包含的部分功能。
顯而易見的是,盡管這兩個 32 位 MCU 制造商都使用Cortex-M3 內核,但主要功能仍有區(qū)別。表中列出的功能是單片機最標準的功能,即便如此它們仍有不同。這意味著,即使這兩個制造商使用相同的內核,也需要對軟件進行調整才能運行最基本的程序,例如翻轉 I/O 或使用 UART。如果不進行一定程度的代碼重寫,而只是對基本參數(shù)進行調整,則無法在 A 和 B 之間移植軟件。
根據(jù)定義,CMSIS 提供了用于訪問內核元素的標準化語言,但芯片合作伙伴 /MCU 制造商必須提供自己的固件才能與器件外設進行交互。任何 MCU 的兩個最基本功能都會涉及 (1)如何使系統(tǒng)架構與外設相關聯(lián),(2)如何設計 MCU 外設的結構以實現(xiàn)所需控制和 / 或功能。這是制造商提供的固件庫能幫助解決的問題,也是代碼兼容性問題的核心所在。向這些庫添加抽象層有助于提高可移植性,但無法解決兩個MCU之間的所有功能差異。任何高級外設功能都無法移植到不存在該功能的另一MCU 上,無論是否有抽象層。單片機制造商實現(xiàn)的這些增強功能有助于使 MCU 從競爭對手中脫穎而出,并幫助設計人員改進解決方案。但這會導致代碼不兼容。
抽象層的概念與操作系統(tǒng)的設計有關。它創(chuàng)建了一種操作系統(tǒng)訪問處理器 (正在運行該操作系統(tǒng))的標準方式,并且可以簡化更改處理器的過程。必須知道的是,處理器(微處理器單元,MPU)是系統(tǒng)元件集成度最低的內核,這使得各制造商的處理器的相似度要遠大于MCU。此外,處理器上運行的代碼是軟件,而不是固件。也就是說,代碼通常不控制任何硬件。另一方面,單片機是片上系統(tǒng),這意味著內核與集成外設之間的聯(lián)系更為緊密。對于 MCU,如果要運行 RTOS,則抽象層的概念最有意義。另一方面,使用 RTOS 會使應用程序代碼與硬件分離,進而去除單片機應用中常見的嚴格控制。
如果某個應用程序正在RTOS上運行,則可將其移植到任何支持該特定 RTOS 的單片機。在運行 Micrium μCOS II 的 Cortex-M3 單片機上開發(fā)的代碼可移植到基于 MIPS M4K 的單片機,因為 μCOS II 在該平臺上也可以運行。應用程序與硬件隔離,并且只要代碼的新部分具有所有相關功能,移植就應該相對很容易。
但在另一方面,如果沒有 RTOS,情況就不是這樣了。如前文所述,每個制造商都會以自己的方式集成內核、存儲器和外設。其中一些差異使得創(chuàng)建一個適用于不同制造商的標準抽象層非常困難,并且還有一個問題:他們想讓這變得簡單嗎?
在大多數(shù)單片機應用程序中,在內核上運行的代碼與硬件外設之間的牢固連接非常關鍵。實際上,該連接使得創(chuàng)建任何種類的標準抽象層 (可在不同制造商的 MCU間轉換)都很困難。抽象層可以對標準功能(例如 UART或 SPI)有所幫助。但即使是 UART,如果原始代碼對9 位模式的 UART 使用了固件庫函數(shù),則在新 MCU 沒有 9 位模式的 UART (即沒有用于此用途的庫函數(shù))時,必須重寫代碼。更復雜的是,在大多數(shù)情況下設計人員不是通過標準函數(shù)來定義 MCU 的值,而是通過其獨特的外設開發(fā)最優(yōu)解決方案。例如,如果能以更高的精度和安全性控制電機,您將從競爭對手中脫穎而出。專用庫正是在這里起作用,而使事情變得更加復雜。
外設固件庫支持指定單片機上的所有外設,包括標準外設和專用外設。但為了更好地支持客戶,某些制造商還為特定應用(如電機控制、圖形和網(wǎng)絡等)提供專用固件庫。這些專用庫總是專有的,在許多情況下包含無法在制造商之間轉移的知識產(chǎn)權。在大多數(shù)情況下,所涉及的應用程序都很復雜,設計人員不會愿意從頭開發(fā)應用程序。此外,制造商通常將其外設支持的所有特殊功能都集成到庫中,在不對代碼進行較大修改的情況下無法移植到其他制造商的 MCU 上。
在我們的示例中,廠商 A 和 B 的單片機都使用了ARM Cortex-M3 內核,并且都具有符合 CMSIS 標準的固件庫。這是否意味著他們的庫(例如電機控制庫)可以互相移植?其實不見得。這兩個制造商對外設和固件采用了完全不同的方法。廠商 A 使用專用算法庫 (可能由多人經(jīng)過數(shù)年開發(fā)而成)來最高效地利用其單片機上的專用外設。而廠商 B 則專注于使用更通用的外設并構建通用外設庫,對于特定應用則使用示例代碼和應用筆記進行說明。這兩種完全不同的方法使得在這兩個制造商的 MCU 之間移植程序(例如電機控制子程序)非常困難,盡管它們使用了相同的內核。此外,庫函數(shù)的命名也不相同,這意味著用戶必須重寫代碼中的所有庫函數(shù)調用,并且要弄清將哪些變量和值提交給函數(shù)。這完全不是所謂的可移植性。
設計人員關注的重點是開發(fā)特定最終用途代碼時的速度、效率和可靠性。廠商 A 和 B 采用不同的方法來達到這些目標。廠商 A 使用基于專用硬件的方法,而廠商 B的方法更加專注于通用硬件。廠商 A 針對特定應用提供了經(jīng)過潛心開發(fā)的專用庫,以最大限度地利用其單片機的功能。而廠商 B 只提供基本構件,讓開發(fā)人員構建自己的解決方案。在速度和可靠性方面,廠商 A 的方法占據(jù)優(yōu)勢,因為很大一部分的應用程序開發(fā)工作已經(jīng)完成且經(jīng)過測試,并
集成在其固件庫中。至于效率方面,廠商 A 也有明顯優(yōu)勢,因為其軟件專為其硬件進行了優(yōu)化。但是,這些優(yōu)勢沒有一項與 CMSIS 或可移植性有關。對兩個廠商的MCU 所進行的比較不應基于抽象層,而應該著重于使用某個 MCU 實現(xiàn)其預期最終用途的順利程度。那些針對特定單片機開發(fā)了定制固件庫的制造商具有明顯優(yōu)勢。正在尋找控制器的設計人員可將精力放在比較特定算法對其需求的適用程度上。盡管 CMSIS 這樣的 API對于隱藏硬件復雜性(例如針對 RTOS)很有用,并在二者之間形成無縫接口,但無法保證軟件在各個制造商間的可移植性。
要考慮的最后一點是單片機的基本宗旨。開發(fā) MCU 的目的是為日常設備的控制帶來可編程性和靈活性。通過集成 CPU、非易失性存儲器和外設(模擬和數(shù)字),這一目標已經(jīng)實現(xiàn)。無需那些使計算機變得通用的高級功能,單片機可充分利用少量硬件來實現(xiàn)所需功能。專用于 MCU 特定外設結構的固件庫大幅減少了開發(fā)應用程序所需的時間和工作量。如前文所述,向這些庫添加抽象層有助于改進開發(fā)過程,對于跨項目重用代碼也更為簡單,但要付出一定代價。使用抽象層時存在代碼變長和性能下降問題。添加抽象層使單片機更類似于計算機。這在某種程度上與形成單片機基本宗旨的特質相反。實際上,它使開發(fā)過程更為復雜,因為它要求應用程序遵守 CMSIS 的特定語言要求,而且無法保證代碼兼容性。
審核編輯:劉清
-
微控制器
+關注
關注
48文章
7467瀏覽量
150886 -
單片機
+關注
關注
6030文章
44500瀏覽量
632197 -
ARM
+關注
關注
134文章
9030瀏覽量
366548 -
Cortex
+關注
關注
2文章
202瀏覽量
46417
原文標題:32 位單片機的應用可移植性——現(xiàn)實還是神話?
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論