UCOSII在運(yùn)行時(shí)進(jìn)入了OS_TaskIdle的問題
int main(void)
本文引用地址:http://m.butianyuan.cn/article/201611/322262.htm{
INT8U ret = 0;
IOInit(); //外設(shè)功能初始化
OSInit(); //uCOS-II系統(tǒng)初始化
ret = OSTaskCreate( MY_Task, //初始化任務(wù)
(void*)0, //無參數(shù)
&Start_TaskStk[APP_TASK_STK_SIZE-1], //任務(wù)堆棧大小為128*4Byte
PRIO_START_TASK); //優(yōu)先級(jí)最高
OSStart(); //開始任務(wù)調(diào)度
return 0;
}
void MY_TASK()
{
OSStatInit(); //統(tǒng)計(jì)任務(wù)初始化
ret = OSTaskCreate(tasksd,
NULL,
&GuiTaskStk[APP_TASK_STK_SIZE-1],
PRIO_SD_HANDLE_TASK);
ret = OSTaskCreate(Web_TASK,
NULL,
&KeyTaskStk[APP_TASK_STK_SIZE-1],
PRIO_TEMP_TASK);
ret = OSTaskCreate(TemCheckTask,
NULL, &TempTaskStk[APP_TASK_STK_SIZE-1],
PRIO_WEB_TASK);
}
這是我建的任務(wù)。
實(shí)際上,每個(gè)任務(wù)都是一個(gè)死循環(huán)。循環(huán)里邊是要處理的代碼。
循環(huán)的最后是一個(gè)ostimedly();函數(shù)用于延時(shí),在延時(shí)的時(shí)候,將該循環(huán)里的任務(wù)掛起,執(zhí)行下一個(gè)優(yōu)先級(jí)任務(wù)。當(dāng)延時(shí)到了,又會(huì)跑到優(yōu)
先級(jí)最高里了。
在我加了ds18b20的函數(shù)后,發(fā)現(xiàn)程序進(jìn)入OS_TaskIdle();內(nèi)出不來了,以為延時(shí)時(shí)間少,然后加到10-100,可還是不行。去掉ds18b20
程序后就可以了,查找后發(fā)現(xiàn),原來delay_us利用的時(shí)系統(tǒng)滴答做的延時(shí),延時(shí)完后將滴答關(guān)掉了,而ucosii的心臟也是系統(tǒng)滴答產(chǎn)生的,
這樣就會(huì),卡在空閑任務(wù)里了。
void SysTick_Handler(void)
{
OSIntEnter();
OSTimeTick();
OSIntExit();
}
void delay_usinds(u32 Nus)
{
SysTick->LOAD=Nus*9; //時(shí)間加載
SysTick->CTRL|=0x01; //開始倒數(shù)
while(!(SysTick->CTRL&(1<<16))); //等待時(shí)間到達(dá)
SysTick->CTRL=0X00000000; //關(guān)閉計(jì)數(shù)器
SysTick->VAL=0X00000000; //清空計(jì)數(shù)器
} 所以終于找到 進(jìn)入空閑任務(wù)OS_TaskIdle()的原因了。
評(píng)論