新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > UCOSII在運行時進入了OS_TaskIdle的問題

UCOSII在運行時進入了OS_TaskIdle的問題

作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
目前正在用ucosii跑幾個小任務(wù),還算穩(wěn)定。由于接觸ucosii時間并不太長,所以出了問題還是會在系統(tǒng)上找問題。

int main(void)

本文引用地址:http://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)先級最高


OSStart(); //開始任務(wù)調(diào)度
return 0;
}
void MY_TASK()
{
OSStatInit(); //統(tǒng)計任務(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ù)。
實際上,每個任務(wù)都是一個死循環(huán)。循環(huán)里邊是要處理的代碼。
循環(huán)的最后是一個ostimedly();函數(shù)用于延時,在延時的時候,將該循環(huán)里的任務(wù)掛起,執(zhí)行下一個優(yōu)先級任務(wù)。當(dāng)延時到了,又會跑到優(yōu)

先級最高里了。
在我加了ds18b20的函數(shù)后,發(fā)現(xiàn)程序進入OS_TaskIdle();內(nèi)出不來了,以為延時時間少,然后加到10-100,可還是不行。去掉ds18b20

程序后就可以了,查找后發(fā)現(xiàn),原來delay_us利用的時系統(tǒng)滴答做的延時,延時完后將滴答關(guān)掉了,而ucosii的心臟也是系統(tǒng)滴答產(chǎn)生的,

這樣就會,卡在空閑任務(wù)里了。
void SysTick_Handler(void)
{
OSIntEnter();

OSTimeTick();
OSIntExit();
}
void delay_usinds(u32 Nus)
{
SysTick->LOAD=Nus*9; //時間加載
SysTick->CTRL|=0x01; //開始倒數(shù)
while(!(SysTick->CTRL&(1<<16))); //等待時間到達
SysTick->CTRL=0X00000000; //關(guān)閉計數(shù)器
SysTick->VAL=0X00000000; //清空計數(shù)器
} 所以終于找到 進入空閑任務(wù)OS_TaskIdle()的原因了。



關(guān)鍵詞: UCOSIIOS_TaskIdl

評論


技術(shù)專區(qū)

關(guān)閉