摘 要:對實時嵌入式操作系統μC/OS-Ⅱ在TI公司的TMS320VC33芯片上的移植和應用做了具體的討論和研究。在數字信號處理器(Digital Signal Processor,DSP)芯片上移植實時操作系統,更加充分地發揮DSP的強大數字信號處理功能,并進一步降低DSP軟件開發難度,提高了軟件的可靠性。介紹實時嵌入式操作系統μC/OS-Ⅱ,分析他在TMS320VC33上移植的具體步驟,詳細討論了任務的劃分、管理和同步,對DSP的操作系統移植有實際的指導作用和參考價值。
關鍵詞:μC/OS-Ⅱ;TMS320VC33;嵌入式系統;導航
中圖分類號:TP368.1 文獻標識碼:B 文章編號:1004-373X(2008)02-022-03
Application and Transplant of μC/OS-Ⅱ on TMS320VC33
HUANG Yangming,LI Tao,WU Meiping
(College of Mechatronics Engineering and Automation,National University of Defense Technology,Changsha,410073,China)
Abstract:This paper gives a detail introduction and research of the transplant of real-time embedded operation system μC/OS-Ⅱ on digital signal processor TMS320VC33 which is produced by TI Company.The transplant of real-time embedded operation system on DSP(Digital Signal Processor) enables more powerful ability on digital signal processing.Moreover,it makes the software developing easier andraises the reliablity of software.It makes an analysis on the procedure of transplant of μC/OS-II on VC33 in detail and has a discussion of partition,management and synchronization of the tasks.It is of practical instruction and reference.
Keywords:μC/OS-Ⅱ;TMS320VC33;embedded system;navigation
1 引 言
嵌入式實時操作系統改變了以往嵌入式編程的模式,從編寫完整的系統到具體的每個任務,缺少實時操作系統支持的嵌入式編程是一種就事論事的行為,工作量繁雜且重復勞動多,可維護性差。嵌入式操作系統下的嵌入式軟件開發快速、高效、條理清晰,可靠性高。在這種模式下,編程人員編寫一個程序沒有必要訪問系統的硬件,實時嵌入式操作系統就像是Window操作系統一樣,對底層的硬件操作進行了完好的封裝,這對于程序的設計與實現帶來很大的好處。在某些特殊的場合,這種模式往往還是必須的,特別是大型的軍用軟件,更應該使用實時嵌入式操作系統下編程的模式。
2 μC/OS-Ⅱ介紹
μC/OS-Ⅱ是一個免費的源碼開放的實時多任務嵌入式操作系統,運行在嵌入式硬件平臺上,對整個系統及其所操作的部件、裝置等資源進行統一協調、指揮和控制。他的主要特點是微型化、可裁減性強、實時性強、可靠性高、移植性好。他能使嵌入式系統及時響應外部事件的請求,并能及時控制所有實時設備與實時任務協調運行,且能在一個規定的時間內完成對事件的處理。每個任務都有對應的惟一的優先級來表示他獲得CPU的權力。
為了保證可靠的實時性,作為任務切換的調度器在進行任務切換的時間是固定的,即調度器進行任務切換所用的時間不能受應用程序中其他因素的影響。
μC/OS-Ⅱ是用C語言和匯編語言編寫的,其中絕大部分代碼都是C語言編寫的,只有極少部分與處理器密切相關的代碼是用匯編語言編寫的。他構思巧妙、結構簡潔精煉、可讀性強,同時具備了實時操作系統的全部功能。他的體系結構為如圖1所示。
3 μC/OS-Ⅱ在VC33上的移植
采用TMS320VC33的高精度浮點DSP作為嵌入式導航系統的底層硬件能夠滿足導航任務的實時性,特別是實時的數據處理,大容量的數據輸入與輸出,參數解算和與外界的實時交互和通信。在移植的過程中需要修改與VC33處理器相關的操作系統文件代碼。
3.1 改寫文件OS_CPU.H
3.1.1 堆棧的增長方向
VC33的堆棧是從低地址向高地址增長的,所以堆棧增長方向的常數OS_STK_GROWTH應該為1。
#define OS_STK_GROWTH1
3.1.2 臨界段宏
設置臨界區的2個宏使用VC33的開中斷和關中斷來實現。設置臨界段的目的是在進入中斷程序之前的保護現場和退出中斷程序之后的恢復現場能夠安全可靠地進行,不受其他中斷和陷阱的干擾。
#define OS_ENTER_CRITICAL() ST=2880
#define OS_EXIT_CRITICAL()ST=0880
3.1.3 定義任務切換宏
任務切換由匯編語言編寫的函數OSCtxSW()實現,任務切換宏OS_TASK_SW()封裝了對任務切換函數OSCtxSw()的調用。
#define OS_TASK_SW()OSCtxSw()
3.1.4 定義數據類型
在VC33中,數據類型char,long,int,unsigned int,double,float都是32位數據,用一個機器字表示,long double是40位擴展精度的浮點數,為了能夠屏蔽底層硬件,定義應用程序中的數據類型。
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned int INT16U;
typedef signed int INT16S;
typedef unsigned long INT32U;
typedef signed long INT32S;
typedef float FLOAT
typedef double DOUBLE;
typedef long double LDOUBLE;
3.2 改寫文件OS_CPU.C
其主要是修改任務堆棧初始化程序OSTask-StkInit()。在函數中首先獲得堆棧的棧頂地址,然后按順序壓入初始數據值,任務的初始化參數值,任務的執行代碼地址,所有的VC33處理器的寄存器壓棧。寄存器的壓棧和出棧順序必須嚴格按照相應的順序。
void *OSTaskStkInit(
void(*task)(void*pd),void *pdata,
void *ptos,INT16U opt)
{
OS_STK *stk =(OS_STK *) ptos;
*stk = (OS_STK) pdata;
*++stk = (OS_STK) task;
*++stk = (OS_STK) 0x2000;
[XZ(90]…[XZ)]
}
3.3 任務設計
采用“分而治之”的方法,把大任務分成多個小任務,充分利用微處理器的運行時間,會大大提高系統的實時性,減少系統的等待時間。導航系統的任務可分為純慣導解算、組合導航解算、原始數據采集、衛星數據接收、數據發送、粗對準、精對準等。劃分任務的同時也為任務設置合適的優先級,關聯與任務相關的數據結構。因為全局變量多,因此需要設置事件同步各個任務。μC/OS-Ⅱ支持最多64個任務。
3.3.1 任務創建
創建任務的工作實質上是創建一個任務控制塊,創建的函數為OSTaskCreate()和OSTaskCreateExt(),但是必須保證在啟動任務函數OSStart()之前先創建一個任務。
3.3.2 任務管理
任務管理的主要工作是任務調度。根據任務就緒表中已經就緒的任務,查找出最高優先級的任務并獲取他的任務控制塊,獲取任務控制塊后進行舊任務堆棧保存和新任務堆棧初始化。為了正確可靠地切換任務需要把被中止任務的斷點指針保存到任務堆棧中,把通用寄存器的內容保存到任務堆棧中,把被中止任務的任務堆棧指針當前只保存到該任務的任務控制快的堆棧指針中,通過任務控制塊獲得待運行任務的任務堆棧指針,把待運行任務堆棧中通用寄存器的內容恢復到CPU的通用寄存器中,使CPU獲得待運行任務的斷點指針。
任務的刪除可以簡單地把要刪除的任務的任務控制塊返還給空任務控制塊列表。
3.4 任務間的同步
μC/OS-Ⅱ中任務的執行代碼、任務堆棧和任務控制塊的關系如圖2所示:
當前任務控制塊保存了任務的狀態,記錄任務的執行代碼地址和前后2個任務的執行代碼地址,要實現任務間的同步需要使用任務間的同步機制,如信號量、消息郵箱、消息隊列和信號量集。信號量用于對共享資源使用的維護,消息郵箱用于任務之間的數據傳送,消息隊列則是多個消息郵箱的集合,信號量集是多個信號量的與關系或者是或關系。在初始化階段,初始化定位完成后才執行初始化調平及其他對準工作,在初始化完成后才進行導航解算工作。導航解算需要接收到原始采樣數據的消息郵箱,即原始的慣性傳感器數據。導航系統的任務劃分如圖3所示。
3.5 容易疏忽的細節及處理
(1) 必須使用小模式;
(2) 參數傳遞采用堆棧方式;
(3) 注意VC33的2級中斷向量模式;
(4) 系統時鐘可以由定時器完成,也可以外接高精度的時鐘芯片如AT-51(12.000 MHz,HC49/4H的封裝)。允許內部鎖相環工作,系統時鐘為120 MHz,H1=60 MHz;
(5) μCOS-Ⅱ通過硬件中斷實現系統時鐘,并在時鐘中斷服務程序中處理與時間相關的問題。一般情況下使用硬件定時器作為時鐘中斷源,這個定時器可以是與微處理器集成的,也可以是分立的,定時中斷的頻率以10~100 Hz為宜。
4 VC33移植的步驟
如圖4所示,在VC33上的移植步驟為先在CCS4.1中建立VC33的工程,設置相關選項,采用RAM初始化方式,匯編語言和C語言混合編程模式;然后編寫源代碼或把已有的代碼加入到工程中,編譯、仿真;然后把.OUT文件導入到VC33中運行,確保程序正確無誤的前提下,執行燒寫。
5 結 語
本文簡單介紹了嵌入式實時操作系統μCOS-Ⅱ,分析了他的體系結構,對μCOS-Ⅱ在TI公司的TMS320VC33上的移植做了分析,對具體的問題做了概括。應該指出對于TI公司6000系列的DSP產品,他有自帶的RTOS,則沒有必要使用μCOS-Ⅱ。而VC33是TI公司的主流浮點微處理器,在他上面移植實時操作系統有實際意義,對于軍事應用的安全、可靠、保密、維護等都有很好的應用前景。
參 考 文 獻
[1]Jean J.Labrosseu.μCOS-Ⅱ[CD2]源碼公開的實時嵌入式操作系統[M].北京:中國電力出版社,2001.
[2]TMS320C3x User′s Guide.ITexas Instruments,1997.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。