摘 要:μC/OS-Ⅱ是一種可移植應用于多種微處理器的實時內核,在此基礎上開發應用軟件,可分解多任務系統,簡化應用軟件的設計。為使某基于μC/OS-Ⅱ開發的實時軟件成功移植到TMS320F2812上,在分析μC/OS-Ⅱ的硬件/軟件結構特點的基礎上,首先對與TMS320F2812相關代碼和與應用軟件相關代碼移植問題分別討論研究。最后通過分析TMS320F2812堆棧空間的尋址方式,給出了擴展TMS320F2812堆棧空間的兩種方法。實驗證明移植成功。
關鍵詞:μC/OS-Ⅱ;TMS320F2812;堆棧空間;代碼移植
中圖分類號:TP311文獻標識碼:B
文章編號:1004-373X(2010)04-086-03
Transplantation of μC/OS- II on TMS320F2812
HE Xiangzhi,WU Hui,ZHOU Wei
(Beijing Aeronautical Technology Research Center,Beijing,100076,China)
Abstract:μC/OS-Ⅱ is a kind of real-time kernel which is transportable in various microprocessor.Application software is develpped,it can decompose multitasking system and simplify application software design.To make software based on μC/OS-Ⅱ successfully transplant to TMS320F2812,the hardware/software structure′s characteristics ofμC/OS-Ⅱ are analyzed firstly,then the code relevant with TMS320F2812 and application software are analyzed and researched respectively.Finally,two kinds of stack TMS320F2812 method are proposed through the analysis of stack TMS320F2812 addressing mode.Experiments prove the transplantation is successful.
Keywords:μC/OS-Ⅱ;TMS320F2812;stack;code transplantation
0 引 言
嵌入式實時控制軟件按是否采用操作系統分為兩類:前/后臺式系統(Foreground/Background)和使用實時操作系統(RTOS)[1]。其中,基于實時操作系統(RTOS)的控制軟件設計是在某一操作系統上進行二次開發,操作系統通過一個內核的調度來管理微控制器來保證所有關鍵的事件都能夠盡可能得有效運行。這是由于它允許系統被分成多個獨立的模塊稱之為任務,而且每個任務都可以認為CPU只屬于自己,而任務之間的調度則由內核完成,實現相對意義下的“并行”。同時采用基于優先級的可剝奪性調度算法來保證實時性。RTOS將應用分解成多任務,簡化了應用軟件的設計,同時使得控制的實時性得到保證,可以接近理論上能達到的最好水平[2]。這里主要對在TMS320F2812上移植使用μC/OS-Ⅱ操作系統展開研究與討論。
1 TMS320F2812
TMS320F2812(以下簡稱F2812)是TI公司最新一代的2000系列32位定點DSP控制器,支持PWM控制電機,是目前控制領域最先進的處理器之一。其頻率高達150 MHz,可以大大提高控制系統的控制精度和芯片的處理能力[3]。F2812提供浮點數學函數庫,可以實現浮點運算。F2812集成了128 KB的閃存,優化的事件管理器和可編程通用計數器,還包括了16通道的12 b ADC轉換器。片上集成了SCI,SPI,EV,URAT和eCAN等標準通信接口。
2 μC/OS-Ⅱ操作系統
μC/OS-Ⅱ意為“微控制器操作系統版本2”,它是一個完整的,可移植、可固化、可裁減及可剝奪的多任務實時內核,包含了多個相對獨立的,短小精悍的目標模塊。這些模塊分別提供任務管理,時間管理,任務間的通信和同步、內存管理等系統服務。至今,從8 b到64 b,μC/OS-Ⅱ已經超過在40種不同架構的微處理器上完成移植[4]。所謂移植,就是使一個實時內核能在其他的微處理器上運行,基本上就是編寫與處理器相關的代碼[5]。為了方便移植,大部分μC/OS-Ⅱ的代碼是用C語言編寫,只有與處理器硬件相關的代碼采用匯編語言編寫,因此μC/OS-Ⅱ可移植性強。
圖1為μC/OS-Ⅱ硬件/軟件體系結構圖[6]。
圖1 μC/OS-Ⅱ硬件/軟件體系結構
從圖1 可看出μC/OS-Ⅱ是由與處理器相關的代碼,與處理器無關的代碼及與應用程序相關的代碼組成。
3 與處理器相關代碼
在μC/OS-Ⅱ的移植中,主要是編寫與處理器相關的代碼,即主要是頭文件OSCPU.H,C文件OSCPUC.C,ASM文件OSCPUA.ASM。
3.1 OSCPU.H文件
OSCPU.H包括了用#defines定義的預處理器相關的常量,宏和類型定義。
(1) 與處理器相關的數據類型定義。因為不同的處理器有不同的字長,所以μC/OS-Ⅱ包括一系列的類型定義以確保其可移植性。對于F2812而言,所有的整數類型包括字符型,短整數和整數及其對應的無符號數類型都用16 b的二進制數表示;長整數和無符號的長整數用32 b的二進制數表示。
(2) 中斷處理方式。μC/OS-Ⅱ 定義了兩個宏來禁止和允許中斷: OSENTERCRITICAL() 和OSEXITCRITICAL()。實現中斷的方法有兩個:一是在OSENTERCRITICAL()中調用處理器指令來禁止中斷,以及在OSEXITCRITICAL()中調用允許中斷指令;二是先將中斷禁止狀態保存到堆棧中,然后禁止中斷。而執行OSEXITCRITICAL()時,只是從堆棧中恢復中斷狀態。對F2812移植采用第二種方法。代碼如下:
#define OSENTERCRITICAL() asm(\" SETC INTM \")
#define OSEXITCRITICAL()asm(\" CLRC INTM \")
(3) 堆棧增長方式。F2812堆棧的增長方式是從下往上,因此定義OSSTKGROWTH=0(OSSTKGROWTH=1表示堆棧從上往下)。
3.2 OSCPUC.C文件
μC/OS-Ⅱ的移植要求編寫6個C 函數:OSTaskStkInit(),OSTaskCreateHook(),OSTaskDelHook(),OSTaskSwHook(),OSTaskStatHook(),OSTimeTickHook()。函數OSTaskStkInit()是惟一必要的,其他5個函數必須聲明,但沒必要包含代碼[7]。OSTaskStk In it()是在用戶建立任務時系統內部自己調用的,對用戶任務的堆棧進行初始化,使建立好的進入就緒態任務的堆棧與系統發生中斷并且與環境變量保存完畢時的堆棧結構一致。
3.3 OSCPUA.ASM
在ASM 文件OSCPUA.ASM 中需要編寫4個匯編語言函數:OSStartHighRdy(),OSCtxSw(),OSIntCtxSw()和OSTickISR()。
(1) OSStartHighRdy():OSStartHighRdy() 在多任務系統啟動函數OSStart()中調用。實現的功能是:設置系統運行標志位OSRunning = TRUE,將就緒表中最高優先級任務的棧指針裝載到SP 中,并強制中斷返回。這樣就緒的最高優先級任務就如同從中斷里返回到運行態一樣,使得整個系統得以運轉。
(2) OSCtxSw():OSCtxSw()其功能是實現任務級的切換。任務級的切換是通過執行軟中斷指令,或者依據處理器的不同,執行TRAP(陷阱)指令來實現的。F2812中定義TRAP#31實現。
(3) OSIntCtxSw():OSIntCtxSw()完成退出中斷服務函數OSIntExit()通過調用OSIntCtxSw(),在ISR中執行任務切換功能。OSCtxSw()是任務間的切換,OSIntCtxSw()則是在中斷中發生的任務切換。OSIntCtxSw()函數中的絕大多數代碼同OSCtxSw()。區別只是因為ISR已經保存了CPU的寄存器,而不需要再在OSIntCtxSw()函數中保存CPU的寄存器[8]。
(4) OSTickISR():OSTickISR()實現時間的延時和期滿功能。該函數具體內容包括:保存寄存器,調用OSIntEnter(),調OSTimeTick(),調用OSIntExit(),恢復寄存器,中斷返回。
4 與應用相關代碼
與應用相關的代碼包括兩個文件: OSCFG.H和INCLUDES.H。OSCFG.H用來配置內核,用戶根據需要對內核進行定制,設置系統的基本情況。比如系統可提供的最大任務數量、是否定制郵箱服務、是否需要系統提供任務掛起功能、是否允許鉤子函數等。代碼的削減可以通過設置OSCFG.H中的#defines OS???EN 為0或1來實現,當設置為0時,該服務代碼就不會生成。INCLUDES.H是系統頭文件,包括了內核和用戶的頭文件。
5 用戶代碼
μC/OS-Ⅱ在F2812移植中必須使用SP寄存器,該寄存器是16位的,且不支持間接尋址,因此只能使用低64 KB存儲空間。這樣用戶創建任務的堆棧空間,也必須分配在SP能夠訪問的低64 KB空間里,而在低64 KB空間中只有10 KB空間可以分配給應用程序,具體地址空間地址為[9]:1 KB(M0)+1 KB(M1)+4 KB(L0)+4 KB(L1)=10 KB。這樣在碰到開發多任務應用軟件時可能就會遇到堆棧空間不夠用的問題。解決的辦法有兩個:一種方法是采用堆棧空間拷貝技術[10],即定義用戶堆棧空間,該空間不在低64 KB空間里。而在TCB 結構體中定義OSTCBStkPtr 總是指向用戶堆棧最低地址,用于存放系統堆棧映像。在進行任務切換時,首先保存當前任務系統堆棧內容的同時向用戶堆棧拷貝數據。其次恢復高優先級任務系統堆棧,方法是:獲得最高優先級任務用戶堆棧最低地址,以最高優先級任務用戶堆棧最低地址為起址,以OSStkStart 為系統堆棧起址,由用戶棧向系統棧拷貝數據。這種方法的優點是可使操作系統任務數及任務棧大小不受限制,缺點是過程復雜。第二種方法則比較簡單,即在進行每個任務定義時,盡量不定義局部變量,而將大的數組定義為全局變量,因為全局變量是可以不存放在低64 KB空間的。壓縮每個任務所需堆棧空間,同時對任務進行合理優化,減少任務數,這樣也可達到壓縮堆棧空間的目的。筆者在進行移植時,采用的是第二種方法。
6 結 語
至此,完整的移植過程就結束。經實際測試,各個功能部件都能很好的工作,移植工作是成功的。μC/OS-Ⅱ具有很高的可移植性,在TMS320F2812上應用μC/OS-Ⅱ嵌入式操作系統后,由操作系統來管理硬件和軟件資源,大大方便了應用程序的設計和擴展。
參考文獻
[1]王田苗.嵌入式系統設計與實例開發[M].北京:清華大學出版社,2002.
[2]田澤.嵌入式系統開發與應用教程[M].北京:北京航空航天大學出版社,2005.
[3]寧改娣.DSP控制器原理及應用[M].2版.北京:科學出版社,2009.
[4]王奕.基于μC/OS-Ⅱ的無人直升機飛行控制系統軟件設計[D].南京:南京航空航天大學,2008.
[5]魏洪興,周亦敏.嵌入式系統設計與實例開發實驗教材[M].北京:清華大學出版社,2005.
[6]Jean J Labrosse.嵌入式實時操作系統μC/OS-Ⅱ[M].邵貝貝,譯.北京:北京航空航天大學出版社,2003.
[7]秦紹華,陳滌.μC/OS-Ⅱ在80C51下的移植[J].信息技術與信息化,2005(2):39-40.
[8]田力,張小林,胡永紅.基于μC/OS-Ⅱ的無人機數據采集系統[J].計算機測量與控制,2009(17):237-239.
[9]孫麗明.TMS320F2812原理及其C語言程序開發[M].北京:清華大學出版社,2008.
[10]沈睿,許峰.μC/OS-Ⅱ在DSP2407上若干移植問題的研究 [J].中國水運,2007(5):175-176.