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

新聞中心

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

μC/OS-II的任務管理

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

在前面的章節中,筆者曾說過任務可以是一個無限的循環,也可以是在一次執行完畢后被刪除掉。這里要注意的是,任務代碼并不是被真正的刪除了,而只是μC/OS-Ⅱ不再理會該任務代碼,所以該任務代碼不會再運行。任務看起來與任何C函數一樣,具有一個返回類型和一個參數,只是它從不返回。任務的返回類型必須被定義成void型。在本章中所提到的函數可以在OS_TASK文件中找到。如前所述,任務必須是以下兩種結構之一:

本文引用地址:http://cqxgywz.com/article/201610/305743.htm

voidYourTask(void*pdata)

{

for(;;){

/* 用戶代碼 */

調用μC/OS-Ⅱ的服務例程之一:

OSMboxPend();

OSQPend();

OSSemPend();

OSTaskDel(OS_PRIO_SELF);

OSTaskSuspend(OS_PRIO_SELF);

OSTImeDly();

OSTimeDlyHMSM();

/* 用戶代碼 */

}

}

voidYourTask(void*pdata)

{

/* 用戶代碼 */

OSTaskDel(OS_PRIO_SELF);

}

本章所講的內容包括如何在用戶的應用程序中建立任務、 刪除任務、 改變任務的優先級、掛起和恢復任務,以及獲得有關任務的信息。

μC/OS-Ⅱ可以管理多達64個任務,并從中保留了四個最高優先級和四個最低優先級的任務供自己使用,所以用戶可以使用的只有56個任務。任務的優先級越高,反映優先級的值則越低。在最新的μC/OS-Ⅱ版本中,任務的優先級數也可作為任務的標識符使用。

4.0 建立任務,OSTaskCreate()

想讓μC/OS-Ⅱ管理用戶的任務,用戶必須要先建立任務。用戶可以通過傳遞任務地址和其它參數到以下兩個函數之一來建立任務:OSTaskCreate()或OSTaskCreateExt()。

OSTaskCreate()與μC/OS是向下兼容的, OSTaskCreateExt()是 OSTaskCreate()的擴展版本,提供了一些附加的功能。用兩個函數中的任何一個都可以建立任務。任務可以在多任務調度開始前建立,也可以在其它任務的執行過程中被建立。在開始多任務調度(即調用OSStart())前,用戶必須建立至少一個任務。任務不能由中斷服務程序(ISR)來建立。

OSTaskCreate()的代碼如程序清單L4.1所述。從中可以知道,OSTaskCreate()需要四個參數: task是任務代碼的指針, pdata是當任務開始執行時傳遞給任務的參數的指針, ptos是分配給任務的堆棧的棧頂指針(參看4.02,任務堆棧),prio是分配給任務的優先級。

程序清單 L4.1 OSTaskCreate()

INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,

INT8Uprio)

{

void*psp;

INT8Uerr;

if(prio>OS_LOWEST_PRIO){(1)

return(OS_PRIO_INVALID);

}

OS_ENTER_CRITICAL();

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

OSTCBPrioTbl[prio]=(OS_TCB*)1;(3)

OS_EXIT_CRITICAL();(4)

psp=(void*)OSTaskStkInit(task,pdata,ptos,0);(5)

err=OSTCBInit(prio,psp,(void*)0,0,0,(void*)0,0);(6)

if(err==OS_NO_ERR){(7)

OS_ENTER_CRITICAL();

OSTaskCtr++;(8)

OSTaskCreateHook(OSTCBPrioTbl[prio]);(9)

OS_EXIT_CRITICAL();

if(OSRunning){(10)

OSSched();(11)

}

}else{

OS_ENTER_CRITICAL();

OSTCBPrioTbl[prio]=(OS_TCB*)0;(12)

OS_EXIT_CRITICAL();

}

return(err);

}else{

OS_EXIT_CRITICAL();

return(OS_PRIO_EXIST);

}

}

OSTaskCreate()一開始先檢測分配給任務的優先級是否有效[L4.1(1)]。任務的優先級必須在0到OS_LOWEST_PRIO之間。接著,OSTaskCreate()要確保在規定的優先級上還沒有建立任務[L4.1(2)]。在使用μC/OS-Ⅱ時,每個任務都有特定的優先級。如果某個優先級是空閑的,μC/OS-Ⅱ通過放置一個非空指針在OSTCBPrioTbl[]中來保留該優先級[L4.1(3)]。

這就使得OSTaskCreate()在設置任務數據結構的其他部分時能重新允許中斷[L4.1(4)]。然后,OSTaskCreate()調用OSTaskStkInit()[L4.1(5)],它負責建立任務的堆棧。該函數是與處理器的硬件體系相關的函數,可以在OS_CPU_C.C文件中找到。有關實現OSTaskStkInit()的細節可參看第8章——移植μC/OS-Ⅱ。如果已經有人在你用的處理器上成功地移植了μC/OS-Ⅱ,而你又得到了他的代碼,就不必考慮該函數的實現細節了。

OSTaskStkInit()函數返回新的堆棧棧頂(psp),并被保存在任務的0S_TCB中。 注意用戶得將傳遞給OSTaskStkInit()函數的第四個參數opt置0,因為OSTaskCreate()與OSTaskCreateExt()不同,它不支持用戶為任務的創建過程設置不同的選項,所以沒有任何選項可以通過opt參數傳遞給OSTaskStkInit()。

μC/OS-Ⅱ支持的處理器的堆棧既可以從上(高地址)往下(低地址)遞減也可以從下往上遞增。用戶在調用OSTaskCreate()的時候必須知道堆棧是遞增的還是遞減的(參看所用處理器的OS_CPU.H中的OS_STACK_GROWTH),因為用戶必須得把堆棧的棧頂傳遞給OSTaskCreate(), 而棧頂可能是堆棧的最高地址(堆棧從上往下遞減), 也可能是最低地址(堆棧從下往上長)。

一旦OSTaskStkInit()函數完成了建立堆棧的任務,OSTaskCreate()就調用OSTCBInit()[L4.1(6)],從空閑的OS_TCB池中獲得并初始化一個OS_TCB。OSTCBInit()的代碼如程序清單L4.2所示,它存在于0S_CORE.C文件中而不是OS_TASK.C文件中。

OSTCBInit()函數首先從OS_TCB緩沖池中獲得一個OS_TCB[L4.2(1)],如果OS_TCB池中有空閑的OS_TCB[L4.2(2)],它就被初始化[L4.2(3)]。注意一旦OS_TCB被分配,該任務的創建者就已經完全擁有它了,即使這時內核又創建了其它的任務,這些新任務也不可能對已分配的OS_TCB作任何操作,所以OSTCBInit()在這時就可以允許中斷,并繼續初始化OS_TCB的數據單元。

程序清單 L4.2 OSTCBInit()

INT8UOSTCBInit(INT8Uprio,OS_STK*ptos,OS_STK*pbos,INT16Uid,

INT16Ustk_size,void*pext,INT16Uopt)


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

關鍵詞:

評論


相關推薦

技術專區

關閉