色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

          淺析μC/OS-ⅡAPI的設(shè)計(jì)思想及實(shí)現(xiàn)機(jī)制

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

          3.5查詢一個(gè)信號(hào)量的當(dāng)前狀態(tài), OSSemQuery()

          INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata)

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

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

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

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

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

          void OSTimeDly (INT16U ticks)

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

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

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

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

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

          INT8U OSTimeDlyResume (INT8U prio)

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

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

          INT32U OSTimeGet (void)

          void OSTimeSet (INT32U ticks)

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

          5. 臨界區(qū)類API的設(shè)計(jì)思路和

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

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

          5.1 OS_ENTER_CRITICAL宏

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

          5.2 OS_EXIT_CRITICAL宏

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

          6. 結(jié)束語(yǔ)

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


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

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉