uC/OS II--与ECB操作相关的四个函数
對(duì)ECB的操作一般包括:
????* 初始化一個(gè)事件控制塊???????????????(void??OS_EventWaitListInit (OS_EVENT *pevent))
????* 使一個(gè)任務(wù)進(jìn)入就緒態(tài)???????????????(INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk))
????* 使一個(gè)任務(wù)進(jìn)入等待某事件的狀態(tài)?????(void??OS_EventTaskWait (OS_EVENT *pevent))
????* 因?yàn)榈却瑫r(shí)而使一個(gè)任務(wù)進(jìn)入就緒態(tài) (void??OS_EventTO (OS_EVENT *pevent))
????對(duì)OS_EventTaskRdy()函數(shù)和OS_EventTO函數(shù)的調(diào)用都需要關(guān)中斷。
1. OS_EventWaitListInit (OS_EVENT *pevent)
????此函數(shù)被與ECB建立相關(guān)的函數(shù)調(diào)用,如OSSemCreate()、OSMutexCreate()、OSQCreate()和OSMboxCreate()。函數(shù)功能就是對(duì)ECB中的等待任務(wù)列表進(jìn)行初始化,函數(shù)創(chuàng)建時(shí),等待任務(wù)列表初始化為空。這個(gè)函數(shù)是對(duì)內(nèi)的,即此函數(shù)可以被uC/OS II調(diào)用,用戶應(yīng)用程序不可以直接調(diào)用此函數(shù)。代碼如下:
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
void??OS_EventWaitListInit (OS_EVENT *pevent)
{
????INT8U??*ptbl;
????pevent->OSEventGrp = 0x00;??????????????????
????ptbl???????????????= &pevent->OSEventTbl[0];
#if OS_EVENT_TBL_SIZE > 0
????*ptbl++????????????= 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 1
????*ptbl++????????????= 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 2
????*ptbl++????????????= 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 3
????*ptbl++????????????= 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 4
????*ptbl++????????????= 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 5
????*ptbl++????????????= 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 6
????*ptbl++????????????= 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 7
????*ptbl??????????????= 0x00;
#endif
}
#endif
????上面的代碼功能比較簡(jiǎn)單,唯一需要注意的是,Labrosse先生使用條件編譯代替了for循環(huán),這樣做的目的是減少編譯時(shí)間(具體的效率,暫不清楚)。
2. INT8U OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
????當(dāng)某事件發(fā)生時(shí),要將等待該事件任務(wù)列表中優(yōu)先級(jí)最高的的任務(wù)置于就緒態(tài),信號(hào)量、互斥型信號(hào)量、消息郵箱、消息隊(duì)列所對(duì)應(yīng)的POST函數(shù)都會(huì)調(diào)用OS_EventTaskRdy()。這個(gè)函數(shù)是對(duì)內(nèi)的,即此函數(shù)可以被uC/OS II調(diào)用,用戶應(yīng)用程序不可以直接調(diào)用此函數(shù)。源碼如下:
#if OS_EVENT_EN > 0
INT8U??OS_EventTaskRdy?(OS_EVENT *pevent, void *msg, INT8U msk)
{
????OS_TCB *ptcb;
????INT8U???x;
????INT8U???y;
????INT8U???bitx;
????INT8U???bity;
????INT8U???prio;
????y????= OSUnMapTbl[pevent->OSEventGrp];???????????
????bity = OSMapTbl[y];
????x????= OSUnMapTbl[pevent->OSEventTbl[y]];
????bitx = OSMapTbl[x];
????prio = (INT8U)((y << 3) + x);????????????????????
????if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) {??
????????pevent->OSEventGrp &= ~bity;??????????????????
????}
????ptcb?????????????????=??OSTCBPrioTbl[prio];??????
????ptcb->OSTCBDly???????=??0;???????????????????????
????ptcb->OSTCBEventPtr??= (OS_EVENT *)0;????????????
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
????ptcb->OSTCBMsg???????= msg;??????????????????????
#else
????msg??????????????????= msg;??????????????????????
#endif
????ptcb->OSTCBStat?????&= ~msk;?????????????????????
????if (ptcb->OSTCBStat == OS_STAT_RDY) {????????????
????????OSRdyGrp????????|=??bity;????????????????????
????????OSRdyTbl[y]?????|=??bitx;
????}
????return (prio);
}
#endif
????需要注意的是if (ptcb->OSTCBStat == OS_STAT_RDY),這說(shuō)明最高優(yōu)先級(jí)任務(wù)得到該事件后不一定就能進(jìn)入就緒態(tài),也許該任務(wù)由于其他原因“suspend”了。
3. void??OS_EventTaskWait (OS_EVENT *pevent)
????當(dāng)某任務(wù)等待某事件的發(fā)生時(shí),信號(hào)量、互斥型信號(hào)量、消息郵箱、消息隊(duì)列所對(duì)應(yīng)的PEND函數(shù)就會(huì)調(diào)用OS_EventTaskWait(),是當(dāng)前任務(wù)脫離就緒態(tài),并放到相應(yīng)的ECB的任務(wù)等待表中。這個(gè)函數(shù)是對(duì)內(nèi)的,即此函數(shù)可以被uC/OS II調(diào)用,用戶應(yīng)用程序不可以直接調(diào)用此函數(shù)。源碼如下:
#if OS_EVENT_EN > 0
void??OS_EventTaskWait (OS_EVENT *pevent)
{
????OSTCBCur->OSTCBEventPtr = pevent;???????????
????if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {??
????????OSRdyGrp &= ~OSTCBCur->OSTCBBitY;???????
????}
????pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;
????pevent->OSEventGrp???????????????????|= OSTCBCur->OSTCBBitY;
}
#endif
4. void??OS_EventTO (OS_EVENT *pevent)
????這個(gè)函數(shù)牽涉到任務(wù)等待超時(shí)問(wèn)題,uC/OS II中可以為任務(wù)等待設(shè)置一個(gè)等待時(shí)間,如果在規(guī)定的時(shí)間內(nèi)任務(wù)等待的事件得不到相應(yīng)(沒(méi)有發(fā)生),那么OSTimeTick()函數(shù)會(huì)因?yàn)榈却瑫r(shí)而將任務(wù)置為就緒態(tài)。信號(hào)量、互斥型信號(hào)量、消息郵箱、消息隊(duì)列所對(duì)應(yīng)的PEND函數(shù)就會(huì)調(diào)用OS_EventTO()函數(shù),完成上述工作。這個(gè)函數(shù)是對(duì)內(nèi)的,即此函數(shù)可以被uC/OS II調(diào)用,用戶應(yīng)用程序不可以直接調(diào)用此函數(shù)。源碼如下:
#if OS_EVENT_EN > 0
void??OS_EventTO (OS_EVENT *pevent)
{
????if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
????????pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
????}
????OSTCBCur->OSTCBStat?????= OS_STAT_RDY;??????
????OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;????
}
#endif
總結(jié)
以上是生活随笔為你收集整理的uC/OS II--与ECB操作相关的四个函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++堆 和 栈 空间的区别
- 下一篇: “真三”中的人生哲理