分析uC/OS-II在MSP430單片機芯片上實現RTOS的問題
單片機作為嵌入式信息產品的一個重要應用方面,其使用、設計面臨著全新的挑戰。一方面,人們對嵌入式產品的要求越來越高,穩定可靠、功能豐富、物美價廉的信息產品將成為人們的首選。另一方面,隨著微電子工藝水平的發展,單片機處理器的能力不斷提高,從最初的8位單片機到16位,進而32位單片機,功能越來越強大,執行速度越來越快,集成度、精確度也越來越高,應用領域進一步拓寬??梢哉f,單片機芯片的性能已經能夠滿足現代人們對嵌入式信息產品的更高要求。為了能將二者有效地結合起來,嵌入式RTOS的軟件設計方法也取代了以前的前后臺(超循環)設計方法,越來越受到重視和應用。
本文引用地址:http://www.ex-cimer.com/article/201809/389175.htm正如分時操作系統中Linux的出現打破了Windows一統天下的局面一樣,由美國Jean J.Labrosse先生設計和編寫的uC/OS-II(Micro C OS 2)的出現也給國內的RTOS應用者帶來了驚喜。uC/OS-II的最大優點與Linux相同,即其源代碼全部公開,使人們在應用它的同時能清楚地了解內部的實現細節,并且能夠根據自己的需求進行移植和修改。特別重要的是uC/OS-II經過8年的發展,已經成功地在多個行業得到應用,保證了實用性和可靠性。它的出現改變了以前人們在使用RTOS時的態度,減少了經濟上的顧慮,對于國內RTOS的研究、推廣、應用將起到重要的推動作用。uC/OS-II采用微內核設計,使用C語言編寫,追求靈活性,可配置、可裁剪、可擴充、移植性強。需要強調的是 uC/OS-II嚴格采用優先級搶占式調度方案。在創建任務時,根據任務的重要性給每個任務分配不同的優先級。任務調度時,先執行高優先級的任務,然后按照優先級由高到低執行任務。如果在某個任務執行中,激發了一個優先級更高的任務,那么在該任務執行結束后,將由任務調度器調度去執行所激發的高優先級任務,而不是順序執行。
下面就uC/OS-II在TI公司生產的MSP430F148芯片上的移植和應用來探討在單片機上實現RTOS可能遇到的一些問題。
1 MSP430系列單片機簡介
MSP430系列單片機是由TI公司開發的16位單片機。其突出特點是超低功耗,非常適合于各種功率要求低的場合。有多個系列和型號,分別由一些基本功能模塊按不同的應用目標組合而成。典型應用是流量計、智能儀表、醫療設備和保安系統等方面。由于其較高的性能價格比,應用已日趨廣泛。
MSP430F148是TI新近推出的MSP430F14x/13x系列單片機中的一款。相對MSP430系列的其它芯片,主要特點如下:
超低功耗。由于內置了功耗極低的快速閃存,因此,MSP430F14x/13x系列在待機模式下所消耗的電能還少于電池未使用時的自然損耗。在正常的工作狀態下,如果工作電壓為2.2 V,其典型消耗電流僅為250uA/MIPS,而待機模式下工作電流降至僅1uA以下。
執行速度快。MSP430F13x/14x系列的工作電壓范圍為1.8~3.6 V,性能可達8 MIPS。
存儲容量大。MSP430F148片內內置了48 KB Flash ROM和2 KB RAM。RAM空間是MSP430系列中最大的,基本符合運行RTOS的需要。
高性能A/D。包含了1個具有8個外部通道的12位高性能A/D轉換器。利用芯片內置的自動掃描功能,A/D轉換器可以不需要中央處理器的協助而獨立工作。
集成度高。該器件還包括1個獨立的看門狗、2個脈寬調制定時器(PWM)、1個比較器、2個USART口以及48個輸入/輸出引腳等部件。
在線支持強。MSP430F13x/14x系列均可由MSP-FET430P140閃速仿真工具(FET)提供支持。該FET是一種完整的集成開發環境,包括源代碼級調試器、仿真器、匯編/連接器、C編譯器、2種*估芯片、目標板、JTAG接口以及編程單元等。
由以上介紹可以看出,MSP430F148屬于一種中低端的單片機,只具備運行RTOS的基本條件,所以在它上面運行RTOS所遇見的一些問題,對于一般的單片機而言是具有代表性的。
2 中斷堆棧的結構設計
在uC/OS-II中,任務切換分為任務級切換和中斷級切換。其中任務級切換是通過發軟中斷指令或依靠處理器執行陷阱指令來完成的。軟中斷指令會強制將一些處理器寄存器保存到當前任務的堆棧中,并執行任務調度。其目的是使處于就緒態的任務的堆棧結構看起來就像剛發生過中斷并將全部寄存器保存在堆棧的情形一樣。如MCS-5l以及x86芯片都有類似的指令,但問題出在有一些單片機芯片中沒有軟中斷指令,并且在發生中斷時保存寄存器的情況根據單片機芯片和所使用的編譯器的不同而有很大區別。
MSP430F148中就沒有軟中斷指令,所使用的IAR編譯器在發生中斷時也不保存所有的寄存器,而是只保存幾個在中斷中使用到的寄存器。所有這些都是不符合uC/OS-II的移植條件的。我們的解決方法是根據具體情況來自己定義一個中斷結構,不論是在任務級調度還是中斷發生或調度以及任務堆棧的初始化時,都要按照這個結構來執行。代價是必須對所編寫的中斷程序的匯編代碼進行人工修改,使之符合這個中斷結構。
為設計一個符合要求的中斷堆棧結構,首先必須清楚所使用的單片機在發生中斷時執行了哪些操作,即向堆棧中保存了哪些寄存器以及它們的順序。當MSP430單片機發生中斷時,只進行2條基本操作,先將SR(狀態寄存器)壓入堆棧中保存,然后將中斷發生時要執行的下一條指令的PC值壓入堆棧保存。其次,要清楚所使用的C編譯器在編譯C語言編寫的中斷程序時,進行了哪些默認的操作。通過對所使用的IAR V2.13編譯器編譯產生的匯編程序進行分析,可以發現,除了以上的2條基本操作以外,在中斷程序的開頭,還自動保存了 R12~R15四個寄存器,余下的R4~Rll八個寄存器中只保存在中斷程序中用到的個別寄存器,而不是全部保存。但在RTOS中必須保存所有的寄存器,這樣才能正確保存該任務的狀態。通過以上分析,我們定義了MSP430運行uC/OS-II時的中斷堆棧結構,如圖1所示。
圖1 MSP430F的自定義中斷堆棧結構
評論