專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

ucosii中的systick和OSTimeDly

作者:lskybs   來源:lskybs   點(diǎn)擊數(shù):  更新時(shí)間:2014年07月29日   【字體:

    OSTimeDly(x)函數(shù)和SYSTick系統(tǒng)時(shí)鐘,這兩個(gè)為整個(gè)系統(tǒng)的關(guān)鍵點(diǎn),同時(shí)也是我開始學(xué)習(xí)uC/OS-ii到現(xiàn)在碰到的最難理解的問題,可能是一直都處于裸機(jī)奔跑狀態(tài),對(duì)OS還是感覺到很陌生,一時(shí)間很難去接收這樣一個(gè)非常偉大的東西。

 

    首先是systick的介紹,systick為系統(tǒng)時(shí)鐘,作為uC/OS-ii的嘀嗒時(shí)鐘,也許有人會(huì)問什么是嘀嗒時(shí)鐘?就是這個(gè)時(shí)鐘不會(huì)停止,一直在運(yùn)行,它好像是uC/OS-ii的心臟一樣,保證它不會(huì)死掉,可能又有人問,一般的單片機(jī)不是有時(shí)鐘嘛,代碼一樣在運(yùn)行,為什么要要這么個(gè)玩意---嘀嗒時(shí)鐘!我開始學(xué)習(xí)uC/OS-ii的時(shí)候也是這種感覺,當(dāng)時(shí)沒有人去講解,自己不停的在那里想,看書啥的,后來通過寫一個(gè)2個(gè)任務(wù)的代碼就明白了這個(gè)嘀嗒時(shí)鐘的重要性,如果系統(tǒng)中移植了OS,那么就得把OS和用戶應(yīng)用程序代碼(也就是任務(wù))作為2個(gè)部分看待,所以我們可以看作系統(tǒng)需要兩個(gè)時(shí)鐘,我是這么理解的,具體是怎么樣的,在以后的博文中會(huì)細(xì)細(xì)說來!

    假如我們將systick設(shè)置為10ms(根據(jù)處理器的clock而定),也就是每10ms的時(shí)候會(huì)進(jìn)入systick中斷,systick這個(gè)功能可由一般的定時(shí)器取代,在這個(gè)中斷服務(wù)程序中會(huì)執(zhí)行OSTimeTick和OSIntExit兩個(gè)函數(shù)(可能結(jié)合源代碼看)。

    在介紹這兩個(gè)函數(shù)之前需要先對(duì)OSTimeDly(x)進(jìn)行相應(yīng)的說明,OSTimeDly(x)為系統(tǒng)延時(shí),假如在某個(gè)任務(wù)中對(duì)其進(jìn)行調(diào)用,表示這個(gè)任務(wù)已經(jīng)由運(yùn)行狀態(tài)轉(zhuǎn)換到等待狀態(tài)了(任務(wù)比較常規(guī)的狀態(tài)為等待、就緒和運(yùn)行這3個(gè),另外2個(gè):休眠和中斷相對(duì)那3個(gè)狀態(tài)而言顯得就不是這么突出了),并且會(huì)做一次任務(wù)調(diào)度(什么是調(diào)度?不用糾結(jié)很多,就是把處于就緒態(tài)的任務(wù)通過某一算法轉(zhuǎn)移到運(yùn)行態(tài)),使就緒態(tài)中(所有的任務(wù)通過OSTaskCreate()函數(shù)使其處于就緒狀態(tài))最高優(yōu)先級(jí)的任務(wù)處于運(yùn)行狀態(tài),同時(shí)會(huì)將該任務(wù)TCB中的OSTCBDly參數(shù)設(shè)置為x(注意是全局變量),系統(tǒng)任務(wù)的狀態(tài)轉(zhuǎn)移如下圖1所示,這個(gè)轉(zhuǎn)移圖非常重要,如果還沒有意識(shí)到它的重要性,那么表示看書看的還不夠,還得繼續(xù):



圖1:uC/OS-ii狀態(tài)轉(zhuǎn)移圖

前面提到了systick中斷服務(wù)程序中的兩個(gè)函數(shù)OSTimeTickOSIntExit,每次進(jìn)入systick中斷都會(huì)在函數(shù)OSTimeTick中對(duì)OSTCBDly(OSTCBDly為任務(wù)調(diào)用OSTimeDly(x)函數(shù)中的x)進(jìn)行減1操作,當(dāng)這個(gè)值減到0的時(shí)候,uC/OS-ii會(huì)將該任務(wù)由等待狀態(tài)PUSH到就緒狀態(tài)(注意這里不是任務(wù)切換),OSIntExit函數(shù)會(huì)獲得就緒表中優(yōu)先級(jí)較高的任務(wù)的prio值,并且判斷具有這個(gè)prio值的任務(wù)是不是當(dāng)初那個(gè)被中斷了的任務(wù),如果不是則需要獲得這個(gè)新任務(wù)的TCB指針并且執(zhí)行中斷級(jí)的任務(wù)切換使其處于運(yùn)行狀態(tài),如果是當(dāng)初那個(gè)給中斷了的任務(wù),則需要繼續(xù)執(zhí)行這個(gè)任務(wù),不會(huì)進(jìn)行任務(wù)切換。

關(guān)閉窗口

相關(guān)文章