隨著嵌入式系統應用的日益廣泛,RTOS越來越受到嵌入式系統開發人員的青睞,特別是進入20世紀90年代后,RTOS更是逐步確立了在嵌入式系統設計中的主導地位。使用RTOS所帶來的好處是可提高嵌入式系統的可靠性,同時也提高了軟件的開發效率,縮短了開發周期。由于商業化RTOS軟件較高的價格和使用成本(版權費、維護費等)的限制,RTOS在國內的應用并不普遍。
μC/OS-II是一個的源碼免費的嵌入式RTOS,具有源碼公開、可移植、可固化、可裁減、穩定性和可靠性高的特點。μC/OS-II是基于優先級的占先式(Preemptive)實時多任務內核,多可支持64個任務(其中系統保留8個自用)。由于μC/OS-II是為嵌入式應用編寫的通用軟件,故在具體應用時需根據不同單片機的特點進行移植。μC/OS-II的大部分代碼是用ANSI C編寫的,只有與處理器相關的一部分代碼用匯編語言編寫,所以具有很強的可移植性,可以在大多數8位、16位、32位單片機及數字信號處理器上運行。本文介紹μC/OS-II在Infineon C167CR單片機上的移植技術。
1 Infineon C167CR單片機簡介
C167CR單片機是Infineon公司80C166系列單片機中的一款高性能16位微處理器,其時鐘頻率可達25 MHz,片內ROM多達128K,尋址能力16M。C167CR單片機集成度高,具有豐富的片內資源:111個I/O引腳、16級56個中斷、32個捕捉/比較通道、16個A/D轉換通道、4個PMW通道、兩組通用定時器單元、8通道外圍事件控制器、同步/異步串行接口和高速同步串行接口、CAN模塊等。C167CR單片機的內部資源及其C編譯器滿足μC/OS-II的移植條件。
2 μC/OS-II在C167CR單片機上的移植
在μC/OS-II的移植中需要修改五個文件:主頭文件INCLUDES.H、系統配置文件OS_CFG.H以及與CPU相關的三個文件(OS_CPU.H、OS_CPU_A.ASM以及OS_CPU_C.C)。移植中使用的編譯器是Keil公司的Keil C166編譯器。五個文件具體內容請見本刊網絡補充版(http://www.dpj.com.cn)。
3 移植示例
示例中,共創建了二個任務,其中發送任務SenderTask()以發送消息的形式連續地向發送郵箱中傳送0~9這10個數,當收到接收郵箱的消息之后,就開始發送下一個數字;接收任務ReceiverTask()從發送郵箱中取出數字,從P2口輸出,再延時5 s,而后向接收信箱回送消息。程序清單如下:
#include "includes.h""
#define TASK_STK_SIZE 512 /*任務堆棧為1KB*/
#define N_TASKS 2 /*任務數*/
OS_STK TaskStk[N_TASKS][TASK_STK_SIZE];
/*任務堆棧*/
OS_EVENT pReceiverMailBox; /*接收郵箱*/
OS_EVENT pSenderMailBox; /*發送郵箱*/
void ReceiverTask(void *data);
void SenderTask(void *data);
/*主程序*/
void main (void){
DP2 = 0xffff; /*設置P2口為輸出*/
OSInit(); /*系統初始化*/
pReceiverMailBox = OSMboxCreate((void*)0);
/*創建接收郵箱*/
pSenderMailBox = OSMboxCreate((void*)0);
/*創建發送郵箱*/
OSTaskCreate(ReceiverTask, (void *)0, (void *)&TaskStk[0][TASK_STK_SIZE - 1], 3); /*創建接收任務*/
OSTaskCreate(SenderTask, (void *)0, (void *)&TaskStk[1][TASK_STK_SIZE - 1], 4); /*創建發送任務*/
OSStart(); /*啟動系統*/
}
/*發送任務*/
void SenderTask (void *data){
INT8U count = 0;
INT8U error;
data = data;
while (1){
for (count=0;count<10;count++){
OSMboxPost(pSenderMailBox, (void*)&count);
OSMboxPend(pReceiverMailBox, 0, &error);
}
}
}
/*接收任務*/
void ReceiverTask (void *data){
INT8U *count;
INT8U error;
data = data;
OSTickISRInit();
while (1) {
count = (INT8U*)OSMboxPend(pSenderMailBox, 0, &error);
P2 = *count;
OSTimeDlyHMSM(0, 0, 5, 0);
OSMboxPost(pReceiverMailBox, (void*)1);
}
}
uC/OS-Ⅱ在C167CR單片機上的移植
更新時間: 2006-02-15 19:17:55來源: 粵嵌教育瀏覽量:3285