日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

uC/OS II--与ECB操作相关的四个函数

發(fā)布時(shí)間:2024/4/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uC/OS II--与ECB操作相关的四个函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

對(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

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的uC/OS II--与ECB操作相关的四个函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。