<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 淺析μC/OS-ⅡAPI的設計思想及實(shí)現機制

淺析μC/OS-ⅡAPI的設計思想及實(shí)現機制

作者: 時(shí)間:2012-08-24 來(lái)源:網(wǎng)絡(luò ) 收藏

3.5查詢(xún)一個(gè)信號量的當前狀態(tài), OSSemQuery()

INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata)

在應用程序中,用戶(hù)隨時(shí)可以調用函數OSSemQuery()來(lái)查詢(xún)一個(gè)信號量的當前狀態(tài)。該函數有兩個(gè)參數:一個(gè)是指向信號量對應事件控制塊的指針pevent。該指針是在生產(chǎn)信號量時(shí),由OSSemCreate()函數返回的;另一個(gè)是指向用于記錄信號量信息的數據結構OS_SEM_DATA(見(jiàn)uCOS_II.H)的指針pdata。因此,調用該函數前,用戶(hù)必須先定義該結構變量,用于存儲信號量的有關(guān)信息。在這里,之所以使用一個(gè)新的數據結構的原因在于,調用函數應該只關(guān)心那些和特定信號量有關(guān)的信息,而不是象OS_EVENT數據結構包含的很全面的信息。該數據結構只包含信號量計數值.OSCnt和等待任務(wù)列表.OSEventTbl[]、.OSEventGrp,而OS_EVENT中還包含了另外的兩個(gè)域.OSEventType和.OSEventPtr。

4. 時(shí)間類(lèi)的設計思路和

μⅡ(其它內核也一樣)要求用戶(hù)提供定時(shí)中斷來(lái)延時(shí)與超時(shí)控制等功能。這個(gè)定時(shí)中斷叫做時(shí)鐘節拍,它應該每秒發(fā)生10至100次。時(shí)鐘節拍的實(shí)際頻率是由用戶(hù)的應用程序決定的。時(shí)鐘節拍的頻率越高,系統的負荷就越重。

下面主要講述五個(gè)與時(shí)鐘節拍有關(guān)的函數。

4.1 任務(wù)延時(shí)函數,OSTimeDly()

void OSTimeDly (INT16U ticks)

這應該程序員們調用最多的一個(gè)函數了,這個(gè)函數完成功能很簡(jiǎn)單,就是先掛起當起當前任務(wù),然后進(jìn)行任務(wù)切換,在指定的時(shí)間到來(lái)之后,將當前任務(wù)恢復為就緒狀態(tài),但是并不一定運行,如果恢復后是優(yōu)先級最高就緒任務(wù)的話(huà),那么運行之。簡(jiǎn)單點(diǎn)說(shuō),就是可以任務(wù)延時(shí)一定時(shí)間后再次執行它,或者說(shuō),暫時(shí)放棄CPU的使用權。一個(gè)任務(wù)可以不顯式的調用這些可以導致放棄CPU使用權的,但那樣多任務(wù)性能會(huì )大大降低,因為此時(shí)僅僅依靠時(shí)鐘在進(jìn)行任務(wù)切換。一個(gè)好的任務(wù)應該在完成一些操作主動(dòng)放棄使用權。

4.2 按時(shí)分秒延時(shí)函數 OSTimeDlyHMSM()

INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)

OSTimeDly()雖然是一個(gè)非常有用的函數,但用戶(hù)的應用程序需要知道延時(shí)時(shí)間對應的時(shí)鐘節拍的數目。增加了OSTimeDlyHMSM()函數后,用戶(hù)就可以按小時(shí)(H)、分(M)、秒(S)和毫秒(m)來(lái)定義時(shí)間了,這樣會(huì )顯得更自然些。與OSTimeDly()一樣,調用OSTimeDlyHMSM()函數也會(huì )使μⅡ進(jìn)行一次任務(wù)調度,并且執行下一個(gè)優(yōu)先級最高的就緒態(tài)任務(wù)。任務(wù)調用OSTimeDlyHMSM()后,一旦規定的時(shí)間期滿(mǎn)或者有其它的任務(wù)通過(guò)調用OSTimeDlyResume()取消了延時(shí),它就會(huì )馬上處于就緒態(tài)。同樣,只有當該任務(wù)在所有就緒態(tài)任務(wù)中具有最高的優(yōu)先級時(shí),它才會(huì )立即運行。

4.3 讓處在延時(shí)期的任務(wù)結束延時(shí),OSTimeDlyResume()

INT8U OSTimeDlyResume (INT8U prio)

μⅡ允許用戶(hù)結束延時(shí)正處于延時(shí)期的任務(wù)。延時(shí)的任務(wù)可以不等待延時(shí)期滿(mǎn),而是通過(guò)其它任務(wù)取消延時(shí)來(lái)使自己處于就緒態(tài)。這可以通過(guò)調用OSTimeDlyResume()和指定要恢復的任務(wù)的優(yōu)先級來(lái)完成。實(shí)際上,OSTimeDlyResume()也可以喚醒正在等待事件的任務(wù),雖然這一點(diǎn)并沒(méi)有提到過(guò)。在這種情況下,等待事件發(fā)生的任務(wù)會(huì )考慮是否終止等待事件。

4.4 系統時(shí)間,OSTimeGet()和OSTimeSet()

INT32U OSTimeGet (void)

void OSTimeSet (INT32U ticks)

用戶(hù)可以通過(guò)調用OSTimeGet()來(lái)獲得該計數器的當前值。也可以通過(guò)調用OSTimeSet()來(lái)改變該計數器的值。注意,在訪(fǎng)問(wèn)OSTime的時(shí)候中斷是關(guān)掉的。這是因為在大多數8位處理器上增加和拷貝一個(gè)32位的數都需要數條指令,這些指令一般都需要一次執行完畢,而不能被中斷等因素打斷。

5. 臨界區類(lèi)API的設計思路和

和其它內核一樣,μC/OS-Ⅱ為了處理臨界段代碼需要關(guān)中斷,處理完畢后再開(kāi)中斷。這使得μC/OS-Ⅱ能夠避免同時(shí)有其它任務(wù)或中斷服務(wù)進(jìn)入臨界段代碼。

μC/OS-Ⅱ定義兩個(gè)宏(macros)來(lái)關(guān)中斷和開(kāi)中斷,以便避開(kāi)不同C編譯器廠(chǎng)商選擇不同的方法來(lái)處理關(guān)中斷和開(kāi)中斷。μC/OS-Ⅱ中的這兩個(gè)宏調用分別是:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。因為這兩個(gè)宏的定義取決于所用的微處理器,故在文件OS_CPU.H中可以找到相應宏定義。每種微處理器都有自己的OS_CPU.H文件。

5.1 OS_ENTER_CRITICAL宏

很多人都以為它是個(gè)函數,其實(shí)不然,仔細分析一下OS_CPU.H文件,它和下面馬上要談到的OS_EXIT_CRITICAL都是宏。他們都是涉及特定CPU的實(shí)現。一般都被替換為一條或者幾條嵌入式匯編代碼。由于系統希望向上層程序員隱藏內部實(shí)現,故而一般都宣稱(chēng)執行此條指令后系統進(jìn)入臨界區。其實(shí),它就是關(guān)個(gè)中斷而已。這樣,只要任務(wù)不主動(dòng)放棄CPU使用權,別的任務(wù)就沒(méi)有占用CPU的機會(huì )了,相對這個(gè)任務(wù)而言,它就是獨占了。所以說(shuō)進(jìn)入臨界區了。這個(gè)宏能少用還是少用,因為它會(huì )破壞系統的一些服務(wù),尤其是時(shí)間服務(wù)。并使系統對外界響應性能降低。

5.2 OS_EXIT_CRITICAL宏

這個(gè)是和上面介紹的宏配套使用另一個(gè)宏,它在系統手冊里的說(shuō)明是退出臨界區。其實(shí)它就是重新開(kāi)中斷。需要注意的是,它必須和上面的宏成對出現,否則會(huì )帶來(lái)意想不到的后果。最壞的情況下,系統會(huì )崩潰。我們推薦程序員們盡量少使用這兩個(gè)宏調用,因為他們的確會(huì )破壞系統的多任務(wù)性能。

6. 結束語(yǔ)

通過(guò)對μC/OS-II中這幾類(lèi)API的簡(jiǎn)單分析,我們可以看出μC/OS-II作為一個(gè)多任務(wù)、搶占式嵌入式操作系統,其API都是為多任務(wù)及其多任務(wù)之間的調度和通信的實(shí)現來(lái)設計的。μC/OS-II提供的API簡(jiǎn)潔而靈活,使用戶(hù)在設計實(shí)際應用時(shí)能夠很方便的利用系統提供的各種調用,充分發(fā)揮μC/OS-II實(shí)時(shí)、高效的優(yōu)點(diǎn)。


上一頁(yè) 1 2 3 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>