摘 要:μC/OS-Ⅱ是一種可移植應(yīng)用于多種微處理器的實(shí)時(shí)內(nèi)核,在此基礎(chǔ)上開發(fā)應(yīng)用軟件,可分解多任務(wù)系統(tǒng),簡化應(yīng)用軟件的設(shè)計(jì)。為使某基于μC/OS-Ⅱ開發(fā)的實(shí)時(shí)軟件成功移植到TMS320F2812上,在分析μC/OS-Ⅱ的硬件/軟件結(jié)構(gòu)特點(diǎn)的基礎(chǔ)上,首先對與TMS320F2812相關(guān)代碼和與應(yīng)用軟件相關(guān)代碼移植問題分別討論研究。最后通過分析TMS320F2812堆棧空間的尋址方式,給出了擴(kuò)展TMS320F2812堆??臻g的兩種方法。實(shí)驗(yàn)證明移植成功。
關(guān)鍵詞:μC/OS-Ⅱ;TMS320F2812;堆??臻g;代碼移植
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:B
文章編號(hào):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 引 言
嵌入式實(shí)時(shí)控制軟件按是否采用操作系統(tǒng)分為兩類:前/后臺(tái)式系統(tǒng)(Foreground/Background)和使用實(shí)時(shí)操作系統(tǒng)(RTOS)[1]。其中,基于實(shí)時(shí)操作系統(tǒng)(RTOS)的控制軟件設(shè)計(jì)是在某一操作系統(tǒng)上進(jìn)行二次開發(fā),操作系統(tǒng)通過一個(gè)內(nèi)核的調(diào)度來管理微控制器來保證所有關(guān)鍵的事件都能夠盡可能得有效運(yùn)行。這是由于它允許系統(tǒng)被分成多個(gè)獨(dú)立的模塊稱之為任務(wù),而且每個(gè)任務(wù)都可以認(rèn)為CPU只屬于自己,而任務(wù)之間的調(diào)度則由內(nèi)核完成,實(shí)現(xiàn)相對意義下的“并行”。同時(shí)采用基于優(yōu)先級(jí)的可剝奪性調(diào)度算法來保證實(shí)時(shí)性。RTOS將應(yīng)用分解成多任務(wù),簡化了應(yīng)用軟件的設(shè)計(jì),同時(shí)使得控制的實(shí)時(shí)性得到保證,可以接近理論上能達(dá)到的最好水平[2]。這里主要對在TMS320F2812上移植使用μC/OS-Ⅱ操作系統(tǒng)展開研究與討論。
1 TMS320F2812
TMS320F2812(以下簡稱F2812)是TI公司最新一代的2000系列32位定點(diǎn)DSP控制器,支持PWM控制電機(jī),是目前控制領(lǐng)域最先進(jìn)的處理器之一。其頻率高達(dá)150 MHz,可以大大提高控制系統(tǒng)的控制精度和芯片的處理能力[3]。F2812提供浮點(diǎn)數(shù)學(xué)函數(shù)庫,可以實(shí)現(xiàn)浮點(diǎn)運(yùn)算。F2812集成了128 KB的閃存,優(yōu)化的事件管理器和可編程通用計(jì)數(shù)器,還包括了16通道的12 b ADC轉(zhuǎn)換器。片上集成了SCI,SPI,EV,URAT和eCAN等標(biāo)準(zhǔn)通信接口。
2 μC/OS-Ⅱ操作系統(tǒng)
μC/OS-Ⅱ意為“微控制器操作系統(tǒng)版本2”,它是一個(gè)完整的,可移植、可固化、可裁減及可剝奪的多任務(wù)實(shí)時(shí)內(nèi)核,包含了多個(gè)相對獨(dú)立的,短小精悍的目標(biāo)模塊。這些模塊分別提供任務(wù)管理,時(shí)間管理,任務(wù)間的通信和同步、內(nèi)存管理等系統(tǒng)服務(wù)。至今,從8 b到64 b,μC/OS-Ⅱ已經(jīng)超過在40種不同架構(gòu)的微處理器上完成移植[4]。所謂移植,就是使一個(gè)實(shí)時(shí)內(nèi)核能在其他的微處理器上運(yùn)行,基本上就是編寫與處理器相關(guān)的代碼[5]。為了方便移植,大部分μC/OS-Ⅱ的代碼是用C語言編寫,只有與處理器硬件相關(guān)的代碼采用匯編語言編寫,因此μC/OS-Ⅱ可移植性強(qiáng)。
圖1為μC/OS-Ⅱ硬件/軟件體系結(jié)構(gòu)圖[6]。
圖1 μC/OS-Ⅱ硬件/軟件體系結(jié)構(gòu)
從圖1 可看出μC/OS-Ⅱ是由與處理器相關(guān)的代碼,與處理器無關(guān)的代碼及與應(yīng)用程序相關(guān)的代碼組成。
3 與處理器相關(guān)代碼
在μC/OS-Ⅱ的移植中,主要是編寫與處理器相關(guān)的代碼,即主要是頭文件OSCPU.H,C文件OSCPUC.C,ASM文件OSCPUA.ASM。
3.1 OSCPU.H文件
OSCPU.H包括了用#defines定義的預(yù)處理器相關(guān)的常量,宏和類型定義。
(1) 與處理器相關(guān)的數(shù)據(jù)類型定義。因?yàn)椴煌奶幚砥饔胁煌淖珠L,所以μC/OS-Ⅱ包括一系列的類型定義以確保其可移植性。對于F2812而言,所有的整數(shù)類型包括字符型,短整數(shù)和整數(shù)及其對應(yīng)的無符號(hào)數(shù)類型都用16 b的二進(jìn)制數(shù)表示;長整數(shù)和無符號(hào)的長整數(shù)用32 b的二進(jìn)制數(shù)表示。
(2) 中斷處理方式。μC/OS-Ⅱ 定義了兩個(gè)宏來禁止和允許中斷: OSENTERCRITICAL() 和OSEXITCRITICAL()。實(shí)現(xiàn)中斷的方法有兩個(gè):一是在OSENTERCRITICAL()中調(diào)用處理器指令來禁止中斷,以及在OSEXITCRITICAL()中調(diào)用允許中斷指令;二是先將中斷禁止?fàn)顟B(tài)保存到堆棧中,然后禁止中斷。而執(zhí)行OSEXITCRITICAL()時(shí),只是從堆棧中恢復(fù)中斷狀態(tài)。對F2812移植采用第二種方法。代碼如下:
#define OSENTERCRITICAL() asm(\" SETC INTM \")
#define OSEXITCRITICAL()asm(\" CLRC INTM \")
(3) 堆棧增長方式。F2812堆棧的增長方式是從下往上,因此定義OSSTKGROWTH=0(OSSTKGROWTH=1表示堆棧從上往下)。
3.2 OSCPUC.C文件
μC/OS-Ⅱ的移植要求編寫6個(gè)C 函數(shù):OSTaskStkInit(),OSTaskCreateHook(),OSTaskDelHook(),OSTaskSwHook(),OSTaskStatHook(),OSTimeTickHook()。函數(shù)OSTaskStkInit()是惟一必要的,其他5個(gè)函數(shù)必須聲明,但沒必要包含代碼[7]。OSTaskStk In it()是在用戶建立任務(wù)時(shí)系統(tǒng)內(nèi)部自己調(diào)用的,對用戶任務(wù)的堆棧進(jìn)行初始化,使建立好的進(jìn)入就緒態(tài)任務(wù)的堆棧與系統(tǒng)發(fā)生中斷并且與環(huán)境變量保存完畢時(shí)的堆棧結(jié)構(gòu)一致。
3.3 OSCPUA.ASM
在ASM 文件OSCPUA.ASM 中需要編寫4個(gè)匯編語言函數(shù):OSStartHighRdy(),OSCtxSw(),OSIntCtxSw()和OSTickISR()。
(1) OSStartHighRdy():OSStartHighRdy() 在多任務(wù)系統(tǒng)啟動(dòng)函數(shù)OSStart()中調(diào)用。實(shí)現(xiàn)的功能是:設(shè)置系統(tǒng)運(yùn)行標(biāo)志位OSRunning = TRUE,將就緒表中最高優(yōu)先級(jí)任務(wù)的棧指針裝載到SP 中,并強(qiáng)制中斷返回。這樣就緒的最高優(yōu)先級(jí)任務(wù)就如同從中斷里返回到運(yùn)行態(tài)一樣,使得整個(gè)系統(tǒng)得以運(yùn)轉(zhuǎn)。
(2) OSCtxSw():OSCtxSw()其功能是實(shí)現(xiàn)任務(wù)級(jí)的切換。任務(wù)級(jí)的切換是通過執(zhí)行軟中斷指令,或者依據(jù)處理器的不同,執(zhí)行TRAP(陷阱)指令來實(shí)現(xiàn)的。F2812中定義TRAP#31實(shí)現(xiàn)。
(3) OSIntCtxSw():OSIntCtxSw()完成退出中斷服務(wù)函數(shù)OSIntExit()通過調(diào)用OSIntCtxSw(),在ISR中執(zhí)行任務(wù)切換功能。OSCtxSw()是任務(wù)間的切換,OSIntCtxSw()則是在中斷中發(fā)生的任務(wù)切換。OSIntCtxSw()函數(shù)中的絕大多數(shù)代碼同OSCtxSw()。區(qū)別只是因?yàn)镮SR已經(jīng)保存了CPU的寄存器,而不需要再在OSIntCtxSw()函數(shù)中保存CPU的寄存器[8]。
(4) OSTickISR():OSTickISR()實(shí)現(xiàn)時(shí)間的延時(shí)和期滿功能。該函數(shù)具體內(nèi)容包括:保存寄存器,調(diào)用OSIntEnter(),調(diào)OSTimeTick(),調(diào)用OSIntExit(),恢復(fù)寄存器,中斷返回。
4 與應(yīng)用相關(guān)代碼
與應(yīng)用相關(guān)的代碼包括兩個(gè)文件: OSCFG.H和INCLUDES.H。OSCFG.H用來配置內(nèi)核,用戶根據(jù)需要對內(nèi)核進(jìn)行定制,設(shè)置系統(tǒng)的基本情況。比如系統(tǒng)可提供的最大任務(wù)數(shù)量、是否定制郵箱服務(wù)、是否需要系統(tǒng)提供任務(wù)掛起功能、是否允許鉤子函數(shù)等。代碼的削減可以通過設(shè)置OSCFG.H中的#defines OS???EN 為0或1來實(shí)現(xiàn),當(dāng)設(shè)置為0時(shí),該服務(wù)代碼就不會(huì)生成。INCLUDES.H是系統(tǒng)頭文件,包括了內(nèi)核和用戶的頭文件。
5 用戶代碼
μC/OS-Ⅱ在F2812移植中必須使用SP寄存器,該寄存器是16位的,且不支持間接尋址,因此只能使用低64 KB存儲(chǔ)空間。這樣用戶創(chuàng)建任務(wù)的堆??臻g,也必須分配在SP能夠訪問的低64 KB空間里,而在低64 KB空間中只有10 KB空間可以分配給應(yīng)用程序,具體地址空間地址為[9]:1 KB(M0)+1 KB(M1)+4 KB(L0)+4 KB(L1)=10 KB。這樣在碰到開發(fā)多任務(wù)應(yīng)用軟件時(shí)可能就會(huì)遇到堆棧空間不夠用的問題。解決的辦法有兩個(gè):一種方法是采用堆??臻g拷貝技術(shù)[10],即定義用戶堆??臻g,該空間不在低64 KB空間里。而在TCB 結(jié)構(gòu)體中定義OSTCBStkPtr 總是指向用戶堆棧最低地址,用于存放系統(tǒng)堆棧映像。在進(jìn)行任務(wù)切換時(shí),首先保存當(dāng)前任務(wù)系統(tǒng)堆棧內(nèi)容的同時(shí)向用戶堆??截悢?shù)據(jù)。其次恢復(fù)高優(yōu)先級(jí)任務(wù)系統(tǒng)堆棧,方法是:獲得最高優(yōu)先級(jí)任務(wù)用戶堆棧最低地址,以最高優(yōu)先級(jí)任務(wù)用戶堆棧最低地址為起址,以O(shè)SStkStart 為系統(tǒng)堆棧起址,由用戶棧向系統(tǒng)??截悢?shù)據(jù)。這種方法的優(yōu)點(diǎn)是可使操作系統(tǒng)任務(wù)數(shù)及任務(wù)棧大小不受限制,缺點(diǎn)是過程復(fù)雜。第二種方法則比較簡單,即在進(jìn)行每個(gè)任務(wù)定義時(shí),盡量不定義局部變量,而將大的數(shù)組定義為全局變量,因?yàn)槿肿兞渴强梢圆淮娣旁诘?4 KB空間的。壓縮每個(gè)任務(wù)所需堆??臻g,同時(shí)對任務(wù)進(jìn)行合理優(yōu)化,減少任務(wù)數(shù),這樣也可達(dá)到壓縮堆??臻g的目的。筆者在進(jìn)行移植時(shí),采用的是第二種方法。
6 結(jié) 語
至此,完整的移植過程就結(jié)束。經(jīng)實(shí)際測試,各個(gè)功能部件都能很好的工作,移植工作是成功的。μC/OS-Ⅱ具有很高的可移植性,在TMS320F2812上應(yīng)用μC/OS-Ⅱ嵌入式操作系統(tǒng)后,由操作系統(tǒng)來管理硬件和軟件資源,大大方便了應(yīng)用程序的設(shè)計(jì)和擴(kuò)展。
參考文獻(xiàn)
[1]王田苗.嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)[M].北京:清華大學(xué)出版社,2002.
[2]田澤.嵌入式系統(tǒng)開發(fā)與應(yīng)用教程[M].北京:北京航空航天大學(xué)出版社,2005.
[3]寧改娣.DSP控制器原理及應(yīng)用[M].2版.北京:科學(xué)出版社,2009.
[4]王奕.基于μC/OS-Ⅱ的無人直升機(jī)飛行控制系統(tǒng)軟件設(shè)計(jì)[D].南京:南京航空航天大學(xué),2008.
[5]魏洪興,周亦敏.嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)實(shí)驗(yàn)教材[M].北京:清華大學(xué)出版社,2005.
[6]Jean J Labrosse.嵌入式實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ[M].邵貝貝,譯.北京:北京航空航天大學(xué)出版社,2003.
[7]秦紹華,陳滌.μC/OS-Ⅱ在80C51下的移植[J].信息技術(shù)與信息化,2005(2):39-40.
[8]田力,張小林,胡永紅.基于μC/OS-Ⅱ的無人機(jī)數(shù)據(jù)采集系統(tǒng)[J].計(jì)算機(jī)測量與控制,2009(17):237-239.
[9]孫麗明.TMS320F2812原理及其C語言程序開發(fā)[M].北京:清華大學(xué)出版社,2008.
[10]沈睿,許峰.μC/OS-Ⅱ在DSP2407上若干移植問題的研究 [J].中國水運(yùn),2007(5):175-176.