欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4785|回復(fù): 0
收起左側(cè)

uC/OS-II學(xué)習(xí)筆記—事件管理程序

[復(fù)制鏈接]
ID:51773 發(fā)表于 2013-8-1 16:18 | 顯示全部樓層 |閱讀模式
事件控制塊的初始化代碼應(yīng)在操作系統(tǒng)初始化函數(shù)OS_Init中被調(diào)用,實(shí)際上也是如此。

50.png 事件控制塊的初始化函數(shù)是OS_InitEventList,在內(nèi)核代碼os_core.c中。該代碼如下所示:

51.png 可見(jiàn),ECB初始化函數(shù)OS_InitEventList首先清空了所有的ECB,也就是清空了事件表。然后從0到(OS_MAX_EVENTS-1u)循環(huán)對(duì)除最后一個(gè)ECB之外的所有ECB進(jìn)行初始化,并順便構(gòu)建了單項(xiàng)的鏈表。循環(huán)結(jié)束后最后一個(gè)ECB的OSEventTbl[OS_MAX_EVENTS-1]的OSEventPtr域指向空地址0,構(gòu)建完成了空閑事件鏈表,然后將ECB空閑鏈表的表頭地址給OSEventFreeList,初始化完成。
當(dāng)建立一個(gè)事件或消息(如信號(hào)量、郵箱、消息隊(duì)列)時(shí),如信號(hào)量的建立函數(shù)OSSemCreate等,需要對(duì)事件等代表進(jìn)行初始化。因?yàn)殡m然事件等待表在操作系統(tǒng)初始化時(shí)調(diào)用OS_InitEventList已經(jīng)被初始化了,但很可能在操作系統(tǒng)的運(yùn)行過(guò)程中被使用過(guò),因此不能保證是被清零的。事件等待表初始化函數(shù)實(shí)現(xiàn)對(duì)指定事件控制塊中事件等待表和事件等待組清零,可被操作系統(tǒng)的其他函數(shù)調(diào)用。
事件等待表初始化函數(shù)為OS_EventWaitListInit,代碼在內(nèi)核os_core.c中,參數(shù)是ECB的地址,程序如下所示:

52.png 可見(jiàn),事件等代表初始化函數(shù)為OS_EventWaitListInit所做的工作就是對(duì)指定ECB清空任務(wù)等待組和任務(wù)等待表。
當(dāng)任務(wù)等待事件發(fā)生,并獲得ECB后,需要在ECB中標(biāo)記任務(wù)在等待事件的發(fā)生,才可以在事件發(fā)生時(shí)取消任務(wù)的阻塞。將任務(wù)在ECB中進(jìn)行登記的函數(shù)是OS_EventTaskWait,參數(shù)是事件控制塊的指針。與OS_EventWaitListInit類(lèi)似,OS_EventTaskWait在任務(wù)調(diào)用信號(hào)量、郵箱等事件等待函數(shù)時(shí)被對(duì)應(yīng)的函數(shù)調(diào)用。因?yàn)槿蝿?wù)的優(yōu)先級(jí)可以通過(guò)當(dāng)前的TCB指針OSTCBCur得到,因此沒(méi)有作為參數(shù)傳遞。
設(shè)置事件等待的函數(shù)OS_EventTaskWait的代碼如下所示:

53.png 由代碼的分析可見(jiàn),事件等待的函數(shù)OS_EventTaskWait只做以下兩件事情:
(1)標(biāo)記。在ECB中登記本任務(wù),即在ECB的事件等待表中對(duì)應(yīng)優(yōu)先級(jí)處標(biāo)記為1,事件等待組中對(duì)應(yīng)位標(biāo)記為1.
(2)取消標(biāo)記。在就緒表和就緒組中取消對(duì)該事件的就緒的標(biāo)記,將就緒表中對(duì)應(yīng)優(yōu)先級(jí)處標(biāo)記為0,如果就緒表中該任務(wù)所在的一組沒(méi)有任務(wù)就緒,將就緒組中的對(duì)應(yīng)位標(biāo)記為0。
OS_EventTaskRemove是與OS_EventTaskWait相反的操作,當(dāng)一個(gè)事件由于某種原因不再需要等待事件(如任務(wù)被刪除)時(shí),就需要在該事件的等待表中取消該事件的等待標(biāo)志,否則會(huì)引起嚴(yán)重的后果,例如,去運(yùn)行一個(gè)已經(jīng)被刪除的任務(wù)。事件等待組中的一位表示事件等待表中一行8個(gè)任務(wù)是否有任務(wù)在等待事件,因此只是一個(gè)任務(wù)不再等待不一定要?jiǎng)h除事件等待組中的對(duì)應(yīng)標(biāo)志,需要進(jìn)行判斷。OS_EventTaskRemove的代碼如下所示:

54.png 由代碼可知,OS_EventTaskRemove執(zhí)行了一項(xiàng)操作,就是取消事件等待表和事件等待組中的任務(wù)等待標(biāo)志。
任務(wù)因?yàn)榈却录贓CB中登記自己的等待,當(dāng)時(shí)間發(fā)生時(shí),如果該任務(wù)是事件等待表中優(yōu)先級(jí)最高的任務(wù),任務(wù)唄取消等待而回到就緒態(tài)。等待的事件發(fā)生的函數(shù)為OS_EventTaskRdy,從函數(shù)名來(lái)看,含義為將等待事件的任務(wù)就緒。該函數(shù)的聲明如下所示:

55.png 56.png
參數(shù)解析如下:
(^_^) prevent:對(duì)應(yīng)的ECB指針
(^_^) pmsg:消息指針。當(dāng)使用諸如消息隊(duì)列或消息郵箱的消息服務(wù)的時(shí)候使用該指針。當(dāng)是信號(hào)量或其他事件的時(shí)候不使用該指針。
(^_^) msk:清除狀態(tài)位的掩碼。例如,使用OSSemPost()提交信號(hào)量時(shí)OS_STAT_SEM,使用OSMboxPost()提交消息的時(shí)候使用OS_STAT_MBOX,以清除TCB中的對(duì)應(yīng)狀態(tài)位。使用該參數(shù)的目的是不需要操作系統(tǒng)判定是何種事件發(fā)生而增加運(yùn)行成本。
(^_^) pend_stat:表示等待(pend) 結(jié)束,任務(wù)就緒的原因,可以是下面的值:
        》》》 OS_STAT_PEND_OK:任務(wù)就緒的原因是等待正常結(jié)束,諸如事件發(fā)生、超時(shí)。
        》》》 OS_STAT_PEND_ABORT:因?yàn)楫惓!?br /> 返回值:任務(wù)優(yōu)先級(jí)。
總結(jié)一下,OS_EventTaskRdy的流程如下:
(1) 在事件等待表和事件等待組中找到最高優(yōu)先級(jí)的等待任務(wù)的優(yōu)先級(jí)。
(2) 根據(jù)優(yōu)先級(jí)查任務(wù)優(yōu)先級(jí)指針表,找到該任務(wù)的TCB指針。
(3) 對(duì)任務(wù)控制塊的相關(guān)參數(shù)進(jìn)行賦值。
(4) 判斷任務(wù)是否被掛起,如果未被掛起就將任務(wù)就緒。完成從阻塞態(tài)到就緒態(tài)的轉(zhuǎn)換。
(5) 調(diào)用OS_EventTaskRemove在ECB的事件等待表中刪除該任務(wù)。
(6) 返回任務(wù)的優(yōu)先級(jí)。

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表