當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]μC/OS-II在C8051F上的移植

在嵌入式應(yīng)用中,使用RTOS的最主要原因是提高系統(tǒng)的可靠性,其次是提高開發(fā)效率、縮短開發(fā)周期。μC/OS-II 是一個基于優(yōu)先級的搶占式實時內(nèi)核,支持56 個用戶任務(wù),90%的代碼使用標(biāo)準(zhǔn)的ANSI C語言書寫,程序可讀性強,移植性好,代碼可固化,可裁剪,非常靈活。C8051F是美國Cygnal公司生產(chǎn)的與51系列兼容的微控制器,流水線指令結(jié)構(gòu)70%的指令的執(zhí)行時間為1個或2個系統(tǒng)時鐘周期。當(dāng)時鐘頻率為25MHz時,速度可達25MIPS,是一款不錯的片上系統(tǒng)。

  1 開發(fā)工具和運行環(huán)境

  實現(xiàn)μC/OS-II的移植,要求所用的C編譯器支持混合編程。KEIL C51可為眾多的8051派生器件編程。我們選用的是KEIL7.02集成開發(fā)環(huán)境,仿真板基于C8051F015芯片。

2 移植中所需修改的文件

  和CPU相關(guān)的文件主要有三個,分別是匯編文件OS_CPU_A.ASM、C語言文件 OS_CPU_C.C和頭文件OS_CPU.H。

2.1 OS_CPU.H文件

  OS_CPU.H文件中定義了數(shù)據(jù)類型及與硬件相關(guān)的基本信息。其中改動部分如下:
typedef unsigned char OS_STK; /* 堆棧的寬度為8位 */
OS_CPU_EXT INT8U IE_SHADOW;
#define OS_ENTER_CRITICAL() IE_SHADOW = IE; IE &= 0x7F /* 關(guān)中斷 */
#define OS_EXIT_CRITICAL() IE = IE_SHADOW
/* 恢復(fù)中斷 */
#define OS_STK_GROWTH 0
#define OS_TASK_SW() OSCtxSw()

  在C8051F中,堆棧都是按字節(jié)操作的,故數(shù)據(jù)類型OS_STK聲明為8位。方向從低地址向高地址方向遞增,所以O(shè)S_STK_GROWTH設(shè)置為0。μC/OS-II在進入系統(tǒng)臨界代碼區(qū)之前要關(guān)中斷,等到退出臨界區(qū)后再打開,以保護核心數(shù)據(jù)不被多任務(wù)環(huán)境下的其它任務(wù)或中斷破壞。開、關(guān)中斷可通過設(shè)置SFR中的中斷屏蔽位實現(xiàn)。在關(guān)中斷時,先將IE的內(nèi)容保存在全局變量IE_ SHADOW中,然后關(guān)中斷;退出臨界區(qū)時,還原IE_SHADOW的值。OS_TASK_SW()用來實現(xiàn)任務(wù)切換。就緒任務(wù)的堆棧初始化應(yīng)該模擬一次中斷發(fā)生后的樣子,堆棧中應(yīng)該按入棧次序設(shè)置好各個寄存器。OS_TASK_SW()函數(shù)模擬一次中斷過程,在中斷返回的時候進行任務(wù)切換。由于C8051F015沒有軟中斷,故直接定義宏OS_TASK_SW()為函數(shù)OSCtxSw()。
//-------------------------------------------------
//-- www.icwin.net
//-------------------------------------------------
2.2 OS_CPU_A.ASM文件

  編譯器將每個文件作為一個模塊,編譯模塊以主名命名,稱為編譯模塊名,用NAME 來聲明。因此,應(yīng)在文件頭部聲明NAME OS_CPU_A。

  函數(shù)有程序部分和局部變量部分,它們分別放在獨立的段中。在大模式下,段名聲明的固定格式為 ?PR?函數(shù)名?模塊名 SEGMENT CODE。因此需要將OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR()用上面的格式一一聲明。如?PR?OSStartHighRdy?OS_CPU_A SEGMENT CODE,本模塊實現(xiàn)的函數(shù)需要用PUBLIC聲明,如PUBLIC OSStartHighRdy等。

  C51將所有定義說明的數(shù)據(jù)標(biāo)識符轉(zhuǎn)換為大寫字符,對函數(shù)則根據(jù)有無寄存器參數(shù)傳送和函數(shù)是否可重入進行換名,如:void OSIntEnter(void) reentrant函數(shù)的名字OSIntEnter換成_?OSIntEnter。這些規(guī)則可從編譯后的LST文件中看出。程序中聲明引用的五個全局變量為OSTCBCur、OSTCBHighRdy、OSRunning、OSPrioCur、OSPrioHighRdy,聲明格式是EXTRN IDATA (OSTCBCur)等。調(diào)用四個外部子程序OSTaskSwHook()、OSIntEnter()、OSIntExit()、OSTimeTick(),固定格式為:EXTRN CODE (_?OSTaskSwHook)等。

  由于C8051F的堆棧指針只有8位,只能指向內(nèi)部數(shù)據(jù)區(qū)的256個字節(jié),因此,當(dāng)前運行的任務(wù)的堆棧在IDATA區(qū),堆棧大小為40H(64字節(jié)),堆棧起點由KEIL決定。通過標(biāo)號可以獲得KEIL分配的SP起點,代碼如下:
?STACK SEGMENT IDATA
RSEG ?STACK
OSStack:
DS 40H
OSStkStart IDATA OSStack-1
為簡化子程序特定義壓棧出棧宏。壓棧的次序為PSW、ACC、B、DPL、DPH、R0~R7,出棧的次序與入棧相反。
·                           PUSHALL MACRO
IRP REG,
PUSH REG
ENDM
POPALL MACRO
IRP REG, <7, 6, 5, 4, 3, 2, 1, 0, DPH, DPL, B, ACC, PSW>
POP REG
ENDM
具體函數(shù)的修改部分見本刊網(wǎng)絡(luò)補充版(http://www.dpj.com.cn)。

2.3 OS_CPU_C.C文件

  移植μC/OS-II 需要在OS_CPU_C.C中定義六個函數(shù),而實際上需要定義的只有OSTaskStkInit()一個函數(shù)。該函數(shù)用來初始化任務(wù)的堆棧。初始狀態(tài)的堆棧只須初始化?C_XBP (仿真堆棧指針)、任務(wù)地址及堆棧的長度。由于只有INC DPTR指令,故返回棧的最低地址,且最低地址處存放棧的長度,方便用匯編語言實現(xiàn)任務(wù)的切換。堆的大小可根據(jù)任務(wù)的實際情況自行確定,由參數(shù)ppdata所指的值確定。
void *OSTaskStkInit (void (*task)(void *pd), void *ppdata,
void *ptos, INT16U opt) reentrant
{
OS_STK *stk;
INT8U HeapSize;
HeapSize=*(INT8U *)ppdata;
opt = opt;
stk = (OS_STK *)ptos+HeapSize+2;
*stk++ = 15;
*stk++ = (INT16U)task & 0xFF;
*stk++ = (INT16U)task >> 8;
stk = (OS_STK *)ptos+HeapSize+2;
*--stk = (INT16U) (ptos+HeapSize-1) >> 8;
*--stk = (INT16U) (ptos+HeapSize-1) & 0xFF;
return ((void *)stk);
}

3 可重入函數(shù)

  因為51系列堆??臻g的限制, KEIL編譯器沒有像大系統(tǒng)那樣使用調(diào)用堆棧。一般C語言調(diào)用過程中,會把過程的參數(shù)和使用的局部變量入棧。為了提高效率,編譯器沒有提供這種堆棧,而是提供一種壓縮棧,每個過程被給定一個空間用于存放局部變量。過程中的每個變量都放在這個空間的固定位置,當(dāng)遞歸調(diào)用這個過程時,會導(dǎo)致變量被覆蓋。編譯器允許將函數(shù)定義成可重入函數(shù),由reentrant關(guān)鍵字指定,可重入函數(shù)可被單獨保存。因為這些堆棧是模擬的,可重入函數(shù)一般都比較大,運行起來也比較慢。模擬棧不允許傳遞bit類型的變量,也不能定義局部位標(biāo)量。移植中最好是將可能被多個任務(wù)使用的函數(shù)定義成可重入函數(shù)。

                  參考文獻

1 Labrosse Jean J. μC/OS-II源碼公開的實時嵌入式操作系統(tǒng). 邵貝貝譯. 北京:中國電力出版社, 2001
本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉