久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > μC/OS-II的任務管理

μC/OS-II的任務管理

作者: 時間:2016-10-08 來源:網絡 收藏

要調用OSTaskQuery(),如程序清單L4.18中所示的那樣,用戶的應用程序必須要為OS_TCB分配存儲空間。這個OS_TCB與μC/OS-Ⅱ分配的OS_TCB是完全不同的數據空間。在調用了OSTaskQuery()后,這個OS_TCB包含了對應任務的OS_TCB的副本。用戶必須十分小心地處理OS_TCB中指向其它OS_TCB的指針(即OSTCBNext與OSTCBPrev);用戶不要試圖去改變這些指針! 一般來說, 本函數只用來了解任務正在干什么——本函數是有用的調試工具。

程序清單 L4.18 得到任務的信息

OS_TCBMyTaskData;

voidMyTask(void*pdata)

{

pdata=pdata;

for(;;){

/* 用戶代碼 */

err=OSTaskQuery(10,MyTaskData);

/*Examineerrorcode..*/

/* 用戶代碼 */

}

}

OSTaskQuery()的代碼如程序清單L4.19所示。注意,筆者允許用戶查詢所有的任務,包括空閑任務[L4.19(1)]。 用戶尤其需要注意的是不要改變OSTCBNext與OSTCBPrev的指向。

通常,OSTaskQuery()需要檢驗用戶是否想知道當前任務的有關信息[L4.19(2)]以及該任務是否已經建立了[L4.19(3)]。 所有的域是通過賦值語句一次性復制的而不是一個域一個域地復制的[L4.19(4)]。這樣復制會比較快一點,因為編譯器大多都能夠產生內存拷貝指令。

程序清單 L4.19 OSTaskQuery().

INT8UOSTaskQuery(INT8Uprio,OS_TCB*pdata)

{

OS_TCB*ptcb;

if(prio>OS_LOWEST_PRIOprio!=OS_PRIO_SELF){(1)

return(OS_PRIO_INVALID);

}

OS_ENTER_CRITICAL();

if(prio==OS_PRIO_SELF){(2)

prio=OSTCBCur->OSTCBPrio;

}

if((ptcb=OSTCBPrioTbl[prio])==(OS_TCB*)0){(3)

OS_EXIT_CRITICAL();

return(OS_PRIO_ERR);

}

*pdata=*ptcb;(4)

OS_EXIT_CRITICAL();

return(OS_NO_ERR);

}


上一頁 1 2 3 4 5 6 7 8 9 下一頁

關鍵詞:

評論


相關推薦

技術專區

關閉