一個uCOS ARM系統(tǒng)的啟動過程分析及系統(tǒng)構(gòu)架
/****************************************************
*一個uCOS ARM系統(tǒng)的啟動過程分析及系統(tǒng)構(gòu)架。 *
*Main 函數(shù)的代碼如下: *
*****************************************************/
int Main(int argc, char **argv)
{
ARMTargetInit() // 系統(tǒng)硬件初始化
OSInit() //初始化操作系統(tǒng)
uHALr_ResetMMU() //復(fù)位MMU
LCD_Init() //初始化LCD 模塊
LCD_printf("LCD initialization is OK\n") //顯示液晶屏信息
LCD_printf("240 x 128 Text Mode\n")
LoadFont() //裝載系統(tǒng)字體
LCD_printf("Create task on uCOS-II...\n") //顯示液晶屏信息
//創(chuàng)建系統(tǒng)的任務(wù)
OSTaskCreate(Main_Task, (void *)0,
(OS_STK *)& Main_Stack[STACKSIZE*8-1], Main_Task_Prio)
OSTaskCreate(Led_Flash_Task, (void *)0,
(OS_STK *)& Led_Flash_Stack[STACKSIZE-1], Led_Flash_Prio )
OSTaskCreate(Lcd_Fresh_Task, (void *)0,
(OS_STK *)& Lcd_Fresh_Stack[STACKSIZE-1], Lcd_Fresh_prio )
OSTaskCreate(Key_Scan_Task, (void *)0,
(OS_STK *)& Key_Scan_Stack[STACKSIZE-1], Key_Scan_Task_Prio )
LCD_printf("Starting uCOS-II...\n")
LCD_printf("Entering graph mode...\n")
LCD_ChangeMode(DspGraMode) //設(shè)置液晶屏顯示為圖形模式
initOSGUI() //初始化圖形用戶界面
InitRtc() //初始化系統(tǒng)時鐘
LCDFresh_MBox=OSMboxCreate(NULL) //創(chuàng)建LCD 刷新郵箱
Lcd_Disp_Sem=OSSemCreate(1) //創(chuàng)建LCD 緩沖區(qū)控制權(quán)旗語,初值為1 滿足互斥條件
Nand_Rw_Sem=OSSemCreate(1) //創(chuàng)建Nand-Flash 讀寫控制權(quán)旗語,初值為1 滿足互斥條件
ARMTargetStart() //啟動操作系統(tǒng)的硬件定時器等中斷
OSStart() // 啟動操作系統(tǒng)
//程序不會運(yùn)行至此
return 0
}//main end
/****************************************************
*系統(tǒng)啟動的時候創(chuàng)建了4 個系統(tǒng)任務(wù),其中Main_Task 為系統(tǒng)的主任務(wù),用戶的應(yīng) *
*用程序就是從Main_Task 任務(wù)開始的。其代碼如下: *
*****************************************************/
void Main_Task(void *Id) //Main_Test_Task
{
POSMSG pMsg=0
ClearScreen() //清除屏幕
for( )
OSTimeDly(1000)
//消息循環(huán)
/* for( ){
pMsg=WaitMessage(0)
tch(pMsg-> Message){
case OSM_KEY:
onKey(pMsg-> WParam,pMsg-> LParam)
break
}
DeleteMessage(pMsg)
}*/
}
/**************************************************
通常多操作系統(tǒng)中的任務(wù)是一個無限循環(huán),同樣,Main_Task 也要陷入一個無限循環(huán)。
因為uCOS-II 是占先式多任務(wù)操作系統(tǒng),如果沒有比Main_Task 任務(wù)更高優(yōu)先級的任務(wù)
進(jìn)入就緒狀態(tài),Main_Task 任務(wù)是不會放棄CPU 的控制權(quán)的。通過調(diào)用OSTimeDly(INT16U
ticks)函數(shù),可以使操作系統(tǒng)進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下一個優(yōu)先級最高的就緒狀態(tài)的
任務(wù)。參數(shù)Ticks 表示任務(wù)延時的節(jié)拍數(shù),一旦規(guī)定的時間期滿,該任務(wù)馬上又會重新進(jìn)入
就緒狀態(tài)。
****************************************************/