www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 在 3.10節(jié)時鐘節(jié)拍中曾提到,μC/OS-Ⅱ(其它內(nèi)核也一樣)要求用戶提供定時中斷來實現(xiàn)延時與超時控制等功能。這個定時中斷叫做時鐘節(jié)拍,它應(yīng)該每秒發(fā)生10至100次。時鐘節(jié)

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

3.10 節(jié)討論了時鐘的中斷服務(wù)子程序和節(jié)時鐘節(jié)函數(shù) OSTimeTIck——該函數(shù)用于通知μC/OS-Ⅱ發(fā)生了時鐘節(jié)拍中斷。本章主要講述五個與時鐘節(jié)拍有關(guān)的系統(tǒng)服務(wù):

z OSTimeDly()

z OSTimeDlyHMSM()

z OSTimeDlyResume()

z OSTimeGet()

z OSTimeSet()

本章所提到的函數(shù)可以在OS_TIME.C文件中找到。

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

μC/OS-Ⅱ提供了這樣一個系統(tǒng)服務(wù):申請該服務(wù)的任務(wù)可以延時一段時間,這段時間的長短是用時鐘節(jié)拍的數(shù)目來確定的。實現(xiàn)這個系統(tǒng)服務(wù)的函數(shù)叫做OSTimeDly()。調(diào)用該函數(shù)會使μC/OS-Ⅱ進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下一個優(yōu)先級最高的就緒態(tài)任務(wù)。任務(wù)調(diào)用OSTimeDly()后,一旦規(guī)定的時間期滿或者有其它的任務(wù)通過調(diào)用OSTimeDlyResume()取消了延時,它就會馬上進(jìn)入就緒狀態(tài)。注意,只有當(dāng)該任務(wù)在所有就緒任務(wù)中具有最高的優(yōu)先級時,它才會立即運(yùn)行。

程序清單L5.1所示的是任務(wù)延時函數(shù)OSTimeDly()的代碼。用戶的應(yīng)用程序是通過提供延時的時鐘節(jié)拍數(shù)——一個1到65535之間的數(shù),來調(diào)用該函數(shù)的。如果用戶指定0值[L5.1(1)],則表明用戶不想延時任務(wù),函數(shù)會立即返回到調(diào)用者。非0值會使得任務(wù)延時函數(shù)OSTimeDly()將當(dāng)前任務(wù)從就緒表中移除[L5.1(2)]。接著,這個延時節(jié)拍數(shù)會被保存在當(dāng)前任務(wù)的OS_TCB中[L5.1(3)],并且通過OSTimeTick()每隔一個時鐘節(jié)拍就減少一個延時節(jié)拍數(shù)。最后,既然任務(wù)已經(jīng)不再處于就緒狀態(tài),任務(wù)調(diào)度程序會執(zhí)行下一個優(yōu)先級最高的就緒任務(wù)。

程序清單 L5.1 OSTimeDly().

voidOSTimeDly(INT16Uticks)

{

if(ticks>0){(1)

OS_ENTER_CRITICAL();

if((OSRdyTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0)

{(2)

OSRdyGrp&=~OSTCBCur->OSTCBBitY;

}

OSTCBCur->OSTCBDly=ticks;(3)

OS_EXIT_CRITICAL();

OSSched();(4)

}

}

清楚地認(rèn)識0到一個節(jié)拍之間的延時過程是非常重要的。換句話說,如果用戶只想延時一個時鐘節(jié)拍,而實際上是在0到一個節(jié)拍之間結(jié)束延時。即使用戶的處理器的負(fù)荷不是很重,這種情況依然是存在的。圖F5.1詳細(xì)說明了整個過程。系統(tǒng)每隔10ms發(fā)生一次時鐘節(jié)拍中斷[F5.1(1)]。假如用戶沒有執(zhí)行其它的中斷并且此時的中斷是開著的,時鐘節(jié)拍中斷服務(wù)就會發(fā)生[F5.1(2)]。也許用戶有好幾個高優(yōu)先級的任務(wù)(HPT)在等待延時期滿,它們會接著執(zhí)行[F5.1(3)]。接下來,圖5.1中所示的低優(yōu)先級任務(wù)(LPT)會得到執(zhí)行的機(jī)會,該任務(wù)在執(zhí)行完后馬上調(diào)用[F5.1(4)]所示的 OSTimeDly(1)。 μC/OS-Ⅱ會使該任務(wù)處于休眠狀態(tài)直至下一個節(jié)拍的到來。當(dāng)下一個節(jié)拍到來后,時鐘節(jié)拍中斷服務(wù)子程序會執(zhí)行[F5.1(5)],但是這一次由于沒有高優(yōu)先級的任務(wù)被執(zhí)行,μC/OS-Ⅱ會立即執(zhí)行申請延時一個時鐘節(jié)拍的任務(wù)[F5.1(6)]。正如用戶所看到的,該任務(wù)實際的延時少于一個節(jié)拍!在負(fù)荷很重的系統(tǒng)中,任務(wù)甚至有可能會在時鐘中斷即將發(fā)生時調(diào)用OSTimeDly(1),在這種情況下,任務(wù)幾乎就沒有得到任何延時,因為任務(wù)馬上又被重新調(diào)度了。如果用戶的應(yīng)用程序至少得延時一個節(jié)拍,必須要調(diào)用OSTimeDly(2),指定延時兩個節(jié)拍!

Figure5.1DelayresolutiON.

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

OSTimeDly()雖然是一個非常有用的函數(shù),但用戶的應(yīng)用程序需要知道延時時間對應(yīng)的時鐘節(jié)拍的數(shù)目。用戶可以使用定義全局常數(shù)OS_TICKS_PER_SEC(參看OS_CFG.H)的方法將時間轉(zhuǎn)換成時鐘段,但這種方法有時顯得比較愚笨。筆者增加了OSTimeDlyHMSM()函數(shù)后,用戶就可以按小時(H)、分(M)、秒(S)和毫秒(m)來定義時間了,這樣會顯得更自然些。與OSTimeDly()一樣,調(diào)用OSTimeDlyHMSM()函數(shù)也會使μC/OS-Ⅱ進(jìn)行一次任務(wù)調(diào)度,并且執(zhí)行下一個優(yōu)先級最高的就緒態(tài)任務(wù)。任務(wù)調(diào)用OSTimeDlyHMSM()后,一旦規(guī)定的時間期滿或者有其它的任務(wù)通過調(diào)用OSTimeDlyResume()取消了延時(參看5.02,恢復(fù)延時的任務(wù)OSTimeDlyResume()),它就會馬上處于就緒態(tài)。同樣,只有當(dāng)該任務(wù)在所有就緒態(tài)任務(wù)中具有最高的優(yōu)先級時,它才會立即運(yùn)行。

程序清單L5.2所示的是OSTimeDlyHMSM()的代碼。從中可以看出,應(yīng)用程序是通過用小時、分、秒和毫秒指定延時來調(diào)用該函數(shù)的。在實際應(yīng)用中,用戶應(yīng)避免使任務(wù)延時過長的時間, 因為從任務(wù)中獲得一些反饋行為(如減少計數(shù)器, 清除LED等等)經(jīng)常是很不錯的事。

但是,如果用戶確實需要延時長時間的話,μC/OS-Ⅱ可以將任務(wù)延時長達(dá)256個小時(接近11天)。

OSTimeDlyHMSM()一開始先要檢驗用戶是否為參數(shù)定義了有效的值[L5.2(1)]。與OSTimeDly()一樣,即使用戶沒有定義延時,OSTimeDlyHMSM()也是存在的[L5.2(9)]。因為μC/OS-Ⅱ只知道節(jié)拍,所以節(jié)拍總數(shù)是從指定的時間中計算出來的[L5.2(3)]。很明顯,程序清單L5.2中的程序并不是十分有效的。筆者只是用這種方法告訴大家一個公式,這樣用戶就可以知道怎樣計算總的節(jié)拍數(shù)了。真正有意義的只是OS_TICKS_PER_SEC。[L5.2(3)]決定了最接近需要延遲的時間的時鐘節(jié)拍總數(shù)。500/OS_TICKS_PER_SECOND的值基本上與0.5個節(jié)拍對應(yīng)的毫秒數(shù)相同。例如,若將時鐘頻率(OS_TICKS_PER_SEC)設(shè)置成100Hz(10ms),4ms的延時不會產(chǎn)生任何延時!而5ms的延時就等于延時10ms。

μC/OS-Ⅱ支持的延時最長為65,535個節(jié)拍。要想支持更長時間的延時,如L5.2(2)所示,OSTimeDlyHMSM()確定了用戶想延時多少次超過65,535個節(jié)拍的數(shù)目[L5.2(4)]和剩下的節(jié)拍數(shù)[L5.2(5)]。例如,若OS_TICKS_PER_SEC的值為100,用戶想延時15分鐘,則OSTimeDlyHMSM()會延時15x60x100=90,000個時鐘。這個延時會被分割成兩次32,768個節(jié)拍的延時(因為用戶只能延時65,535個節(jié)拍而不是65536個節(jié)拍)和一次24,464個節(jié)拍的延時。在這種情況下,OSTimeDlyHMSM()首先考慮剩下的節(jié)拍,然后是超過65,535的節(jié)拍數(shù)[L5.2(7)和(8)](即兩個32,768個節(jié)拍延時)。[!--empirenews.page--]

程序清單 L5.2 OSTimeDlyHMSM().

INT8UOSTimeDlyHMSM(INT8Uhours,INT8Uminutes,INT8Useconds,INT16U

milli)

{

INT32Uticks;

INT16Uloops;

if(hours>0|| minutes>0|| seconds>0|| milli>0){(1)

if(minutes>59){

return(OS_TIME_INVALID_MINUTES);

}

if(seconds>59){

return(OS_TIME_INVALID_SECONDS);

}

If(milli>999){

return(OS_TIME_INVALID_MILLI);

}

ticks=(INT32U)hours*3600L*OS_TICKS_PER_SEC(2)

+(INT32U)minutes*60L*OS_TICKS_PER_SEC

+(INT32U)seconds*OS_TICKS_PER_SEC

+OS_TICKS_PER_SEC*((INT32U)milli

+500L/OS_TICKS_PER_SEC)/1000L;(3)

loops=ticks/65536L;(4)

ticks=ticks%65536L;(5)

OSTimeDly(ticks);(6)

while(loops>0){(7)

OSTimeDly(32768);(8)

OSTimeDly(32768);

loops--;

}

return(OS_NO_ERR);

}else{

return(OS_TIME_ZERO_DLY);(9)

}

}

由于OSTimeDlyHMSM()的具體實現(xiàn)方法,用戶不能結(jié)束延時調(diào)用OSTimeDlyHMSM()要求延時超過65535個節(jié)拍的任務(wù)。換句話說,如果時鐘節(jié)拍的頻率是100Hz,用戶不能讓調(diào)用OSTimeDlyHMSM(0,10,55,350)或更長延遲時間的任務(wù)結(jié)束延時。

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

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

OSTimeDlyResume()的代碼如程序清單L5.3所示,它首先要確保指定的任務(wù)優(yōu)先級有效[L5.3(1)]。 接著, OSTimeDlyResume()要確認(rèn)要結(jié)束延時的任務(wù)是確實存在的[L5.3(2)]。

如果任務(wù)存在, OSTimeDlyResume()會檢驗任務(wù)是否在等待延時期滿[L5.3(3)]。 只要OS_TCB

域中的OSTCBDly包含非0值就表明任務(wù)正在等待延時期滿,因為任務(wù)調(diào)用了OSTimeDly(),OSTimeDlyHMSM()或其它在第六章中所描述的PEND函數(shù)。然后延時就可以通過強(qiáng)制命令OSTCBDly為0來取消[L5.3(4)]。延時的任務(wù)有可能已被掛起了,這樣的話,任務(wù)只有在沒有被掛起的情況下才能處于就緒狀態(tài)[L5.3(5)]。當(dāng)上面的條件都滿足后,任務(wù)就會被放在就緒表中[L5.3(6)]。這時,OSTimeDlyResume()會調(diào)用任務(wù)調(diào)度程序來看被恢復(fù)的任務(wù)是否擁有比當(dāng)前任務(wù)更高的優(yōu)先級[L5.3(7)]。這會導(dǎo)致任務(wù)的切換。

程序清單 L5.3 恢復(fù)正在延時的任務(wù)

INT8UOSTimeDlyResume(INT8Uprio)

{

OS_TCB*ptcb;

if(prio>=OS_LOWEST_PRIO){(1)

return(OS_PRIO_INVALID);

}

OS_ENTER_CRITICAL();

ptcb=(OS_TCB*)OSTCBPrioTbl[prio];

if(ptcb!=(OS_TCB*)0){(2)

if(ptcb->OSTCBDly!=0){(3)

ptcb->OSTCBDly=0;(4)

if(!(ptcb->OSTCBStat&OS_STAT_SUSPEND)){(5)

OSRdyGrp|=ptcb->OSTCBBitY;(6)

OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;

OS_EXIT_CRITICAL();

OSSched();(7)

}else{

OS_EXIT_CRITICAL();

}

return(OS_NO_ERR);

}else{

OS_EXIT_CRITICAL();

return(OS_TIME_NOT_DLY);

}

}else{

OS_EXIT_CRITICAL();

return(OS_TASK_NOT_EXIST);

}

}

注意,用戶的任務(wù)有可能是通過暫時等待信號量、郵箱或消息隊列來延時自己的(參看第六章)??梢院唵蔚赝ㄟ^控制信號量、郵箱或消息隊列來恢復(fù)這樣的任務(wù)。這種情況存在的唯一問題是它要求用戶分配事件控制塊(參看6.00),因此用戶的應(yīng)用程序會多占用一些RAM。

5.3系統(tǒng)時間,OSTimeGet()和 OSTimeSet()

無論時鐘節(jié)拍何時發(fā)生,μC/OS-Ⅱ都會將一個32位的計數(shù)器加1。這個計數(shù)器在用戶調(diào)用OSStart()初始化多任務(wù)和4,294,967,295個節(jié)拍執(zhí)行完一遍的時候從0開始計數(shù)。在時鐘節(jié)拍的頻率等于100Hz的時候,這個32位的計數(shù)器每隔497天就重新開始計數(shù)。用戶可以通過調(diào)用OSTimeGet()來獲得該計數(shù)器的當(dāng)前值。也可以通過調(diào)用OSTimeSet()來改變該計數(shù)器的值。OSTimeGet()和OSTimeSet()兩個函數(shù)的代碼如程序清單L5.4所示。注意,

在訪問OSTime的時候中斷是關(guān)掉的。這是因為在大多數(shù)8位處理器上增加和拷貝一個32位的數(shù)都需要數(shù)條指令,這些指令一般都需要一次執(zhí)行完畢,而不能被中斷等因素打斷。

程序清單 L5.4 得到和改變系統(tǒng)時間

INT32UOSTimeGet(void)

{

INT32Uticks;

OS_ENTER_CRITICAL();

ticks=OSTime;

OS_EXIT_CRITICAL();

return(ticks);

}

voidOSTimeSet(INT32Uticks)

{

OS_ENTER_CRITICAL();

OSTime=ticks;

OS_EXIT_CRITICAL();

}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉