TinyOS51嵌入式操作系統(tǒng)微小內(nèi)核課件_第1頁
TinyOS51嵌入式操作系統(tǒng)微小內(nèi)核課件_第2頁
TinyOS51嵌入式操作系統(tǒng)微小內(nèi)核課件_第3頁
TinyOS51嵌入式操作系統(tǒng)微小內(nèi)核課件_第4頁
TinyOS51嵌入式操作系統(tǒng)微小內(nèi)核課件_第5頁
已閱讀5頁,還剩89頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第5章TinyOS51嵌入式操作系統(tǒng)微小內(nèi)核5.1基礎(chǔ)知識5.2最簡單的多任務(wù)模型5.3協(xié)作式多任務(wù)操作系統(tǒng)5.4時(shí)間片輪詢多任務(wù)操作系統(tǒng)5.5信號量5.6消息郵箱第5章TinyOS51嵌入式操作系統(tǒng)微小內(nèi)核5.1第5章TinyOS51嵌入式操作系統(tǒng)本章說明:

操作系統(tǒng)(OS)是計(jì)算機(jī)專業(yè)的一門專業(yè)基礎(chǔ)課,理論教材比較抽象。本章所學(xué)內(nèi)容是從80C51單片機(jī)應(yīng)用出發(fā),主要介紹一個(gè)基于80C51系列單片機(jī),且全部使用C語言編寫的開源操作系統(tǒng)微小內(nèi)核——TinyOS51,其目的是幫助大家建立與操作系統(tǒng)有關(guān)的基本概念,如:任務(wù),上下文與可重入性,任務(wù)的并發(fā)性與調(diào)度,以及信號量與消息郵箱的實(shí)現(xiàn)機(jī)理與程序設(shè)計(jì)基礎(chǔ),為今后深入學(xué)習(xí)專業(yè)級的操作系統(tǒng)與應(yīng)用技術(shù)做好鋪墊。2第5章TinyOS51嵌入式操作系統(tǒng)本章說明:2第5章TinyOS51嵌入式操作系統(tǒng)5.1基礎(chǔ)知識5.1.1概述(介紹以下幾個(gè)基本概念)1、協(xié)作式與搶占式OS2、用戶任務(wù)(UserTask)與系統(tǒng)任務(wù)(SystemTask)

3、并發(fā)性(Concurrent)與調(diào)度(Scheduling)4、任務(wù)狀態(tài)5、任務(wù)之間的關(guān)系6、臨界資源(CriticalResources)與臨界區(qū)(CriticalSection)7、上下文切換(ContextSwitch)8、可重入性(Reentrant)

3第5章TinyOS51嵌入式操作系統(tǒng)5.1基礎(chǔ)知識第5章TinyOS51嵌入式操作系統(tǒng)1、協(xié)作式與搶占式OS

在操作系統(tǒng)的發(fā)展過程中,先后有2種形式的多任務(wù)管理機(jī)制,即協(xié)作式與搶占式。

協(xié)作式:如果任務(wù)切換的時(shí)機(jī)完全取決于正在運(yùn)行的任務(wù),那么這樣的操作系統(tǒng)就是協(xié)作式多任務(wù)操作系統(tǒng)。即任務(wù)執(zhí)行時(shí)的權(quán)利比操作系統(tǒng)還大,只有等正在運(yùn)行的任務(wù)完成后,才會(huì)將控制權(quán)交給操作系統(tǒng),此時(shí)才能執(zhí)行下一個(gè)任務(wù)。一旦某個(gè)任務(wù)運(yùn)行出錯(cuò),則導(dǎo)致整個(gè)系統(tǒng)掛起(Pending)。搶占式:如果任務(wù)優(yōu)先運(yùn)行的決定權(quán)取決于操作系統(tǒng),而且即使有一個(gè)任務(wù)死掉,而系統(tǒng)仍能正常工作,那么這樣的操作系統(tǒng)就是搶占式多任務(wù)操作系統(tǒng)。4第5章TinyOS51嵌入式操作系統(tǒng)1、協(xié)作式與搶占式O第5章TinyOS51嵌入式操作系統(tǒng)2、用戶任務(wù)(UserTask)與系統(tǒng)任務(wù)(SystemTask)

在單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)中,為了提高系統(tǒng)的透明性、可移植性和強(qiáng)壯性,常將一個(gè)應(yīng)用程序分解為許多“可執(zhí)行的程序單元”。在監(jiān)控模塊的管理下,以“實(shí)參”和“形參”形式完成各模塊之間的調(diào)用和返回。

當(dāng)使用操作系統(tǒng)時(shí),如果將這些“可執(zhí)行的程序單元”進(jìn)行分類,即可得到在操作系統(tǒng)調(diào)度下的“用戶任務(wù)”。此時(shí),任務(wù)之間的信息傳遞是通過“異步”的方式來完成,即由操作系統(tǒng)的各種“通信”機(jī)制來實(shí)現(xiàn),比如,信息量與消息郵箱等。

與上述任務(wù)不同,操作系統(tǒng)有自己的“系統(tǒng)任務(wù)”,比如,空閑任務(wù)等。5第5章TinyOS51嵌入式操作系統(tǒng)2、用戶任務(wù)(Use第5章TinyOS51嵌入式操作系統(tǒng)3、并發(fā)性(Concurrent)與調(diào)度(Scheduling)調(diào)度器是每個(gè)內(nèi)核的心臟,調(diào)度器提供決定何時(shí)執(zhí)行何任務(wù)的算法。為了滿足實(shí)時(shí)性要求,當(dāng)有多個(gè)任務(wù)均處于就緒狀態(tài)時(shí),嵌入式實(shí)時(shí)操作系統(tǒng)可以讓“一個(gè)已經(jīng)就緒的高優(yōu)先級任務(wù)”搶占另一個(gè)“正在運(yùn)行的低優(yōu)先級任務(wù)”的運(yùn)行權(quán)而進(jìn)入運(yùn)行狀態(tài)。如下圖所示,任務(wù)A運(yùn)行中,被任務(wù)B搶占而進(jìn)入執(zhí)行狀態(tài)。它們的運(yùn)行時(shí)間有重疊部分,這種運(yùn)行方式稱之為“并發(fā)運(yùn)行”。6第5章TinyOS51嵌入式操作系統(tǒng)3、并發(fā)性(Conc第5章TinyOS51嵌入式操作系統(tǒng)在實(shí)際的應(yīng)用中,大多數(shù)嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)內(nèi)核支持兩種普遍的調(diào)度算法:基于優(yōu)先級的搶占式調(diào)度和時(shí)間輪詢式調(diào)度。7第5章TinyOS51嵌入式操作系統(tǒng)在實(shí)第5章TinyOS51嵌入式操作系統(tǒng)采用基于優(yōu)先級“搶占式”的調(diào)度算法,就意味著一個(gè)“已經(jīng)就緒的高優(yōu)先級任務(wù)”可以剝奪另一個(gè)“正在運(yùn)行的低優(yōu)先級任務(wù)”的運(yùn)行權(quán)而進(jìn)入運(yùn)行狀態(tài)。

如下圖所示:8第5章TinyOS51嵌入式操作系統(tǒng)采用第5章TinyOS51嵌入式操作系統(tǒng)

時(shí)間輪詢調(diào)度為每個(gè)任務(wù)提供同份額的cpu執(zhí)行時(shí)間。由于純粹的時(shí)間輪詢調(diào)度不能滿足實(shí)時(shí)性系統(tǒng)要求,取而代之的是基于優(yōu)先級搶占式調(diào)度擴(kuò)充時(shí)間輪詢調(diào)度,即對同樣優(yōu)先級的任務(wù)使用時(shí)間片獲得相等的cpu分配時(shí)間,不同優(yōu)先級的具有搶占權(quán)。9第5章TinyOS51嵌入式操作系統(tǒng)時(shí)間第5章TinyOS51嵌入式操作系統(tǒng)4、任務(wù)狀態(tài)無論用戶任務(wù)還是系統(tǒng)任務(wù),在如何時(shí)候,每個(gè)任務(wù)至少包含:就緒(ready)、運(yùn)行(running)、阻塞(blocked)在內(nèi)的狀態(tài)。隨著實(shí)時(shí)系統(tǒng)的運(yùn)行,每個(gè)任務(wù)根據(jù)簡單的有限狀態(tài)自動(dòng)機(jī)(FSM)邏輯,從一個(gè)狀態(tài)遷移到另一個(gè)狀態(tài)。雖然內(nèi)核可以定義多個(gè)任務(wù)狀態(tài)組,但典型的OS中至少有3個(gè)主要的狀態(tài):就緒狀態(tài);運(yùn)行狀態(tài);阻塞狀態(tài)10第5章TinyOS51嵌入式操作系統(tǒng)4、任務(wù)狀態(tài)10第5章TinyOS51嵌入式操作系統(tǒng)就緒狀態(tài):當(dāng)一個(gè)任務(wù)創(chuàng)立并準(zhǔn)備運(yùn)行時(shí),內(nèi)核將其放入就緒狀態(tài)。但不能運(yùn)行,因?yàn)橛幸粋€(gè)更高優(yōu)先級的任務(wù)在執(zhí)行,內(nèi)核調(diào)度器根據(jù)優(yōu)先級決定哪個(gè)任務(wù)先遷移到運(yùn)行狀態(tài),但處于就緒狀態(tài)的任務(wù)不能直接遷移到阻塞狀態(tài)。運(yùn)行狀態(tài):操作系統(tǒng)可讓處于運(yùn)行狀態(tài)的低優(yōu)先級任務(wù)暫停運(yùn)行,轉(zhuǎn)而執(zhí)行另一個(gè)處于就緒狀態(tài)的高優(yōu)先級任務(wù),這樣正運(yùn)行的任務(wù)就從運(yùn)行狀態(tài)遷移到了就緒狀態(tài)。阻塞狀態(tài):當(dāng)任務(wù)已經(jīng)請求一個(gè)還不能用的資源,或已經(jīng)請求等待某些事件的發(fā)生,或自身要延時(shí)一段時(shí)間,則任務(wù)都從運(yùn)行狀態(tài)遷移到阻塞狀態(tài)。如果沒有阻塞狀態(tài),那么較低優(yōu)先級的任務(wù)將不能運(yùn)行;如果更高優(yōu)先級的任務(wù)沒有設(shè)置成阻塞狀態(tài),則可能導(dǎo)致cpu處于饑餓狀態(tài)。11第5章TinyOS51嵌入式操作系統(tǒng)就緒狀態(tài):當(dāng)一個(gè)任務(wù)第5章TinyOS51嵌入式操作系統(tǒng)圖5.4任務(wù)執(zhí)行狀態(tài)圖12第5章TinyOS51嵌入式操作系統(tǒng)圖5.4任務(wù)執(zhí)行第5章TinyOS51嵌入式操作系統(tǒng)5、任務(wù)之間的關(guān)系由于內(nèi)存中可同時(shí)存在多個(gè)任務(wù),且任務(wù)之間可能存在直接和間接的相互作用關(guān)系。直接作用只發(fā)生在相關(guān)任務(wù)之間,其相互之間的聯(lián)系是有意安排的,它們需要相互協(xié)作來共同完成一個(gè)任務(wù)。間接作用是指任務(wù)之間因?yàn)槟撤N中介(如共同使用同一設(shè)備)而發(fā)生了一定的關(guān)系,也就是說,它可以發(fā)生在相關(guān)任務(wù)之間,也可以發(fā)生在無關(guān)任務(wù)之間。從另一個(gè)角度來看任務(wù)間的相關(guān)關(guān)系,可以將任務(wù)之間的關(guān)系提煉為同步(Synchronization)與互斥(Exclusion)兩種。13第5章TinyOS51嵌入式操作系統(tǒng)5、任務(wù)之間的關(guān)系1第5章TinyOS51嵌入式操作系統(tǒng)任務(wù)同步:任務(wù)間的同步是一種直接作用,任務(wù)同步是指系統(tǒng)中的多個(gè)任務(wù)之間存在某種時(shí)序關(guān)系,需要相互協(xié)作才能共同完成一個(gè)任務(wù)。比如,一個(gè)任務(wù)運(yùn)行到某個(gè)時(shí)間點(diǎn)時(shí),需要另一個(gè)任務(wù)為它提供消息,在未獲得消息之前,該任務(wù)處于阻塞狀態(tài),獲得消息后被喚醒進(jìn)入就緒狀態(tài)。

任務(wù)互斥:任務(wù)間的互斥是一種間接作用,由于內(nèi)存中的多個(gè)任務(wù)要求共享某一資源,而有些資源必須互斥,因此各任務(wù)之間只能競爭使用這些資源。14第5章TinyOS51嵌入式操作系統(tǒng)任務(wù)同步:14第5章TinyOS51嵌入式操作系統(tǒng)6、臨界資源(CriticalResources)與臨界區(qū)(CriticalSection)從上面的分析可以看出,任務(wù)間的互斥涉及到共享資源的競爭使用,因此競爭使用這些資源的任務(wù)在執(zhí)行使用這些資源的程序時(shí)也會(huì)受到一定的限制,從而也就引出了臨界資源與臨界區(qū)的概念。(1)臨界資源在操作系統(tǒng)中,將一次只允許一個(gè)任務(wù)(中斷)使用的資源稱之為臨界資源。(2)臨界區(qū)在操作系統(tǒng)中將并發(fā)任務(wù)中訪問臨界資源的程序稱之為臨界區(qū),臨界區(qū)也常叫做互斥區(qū)。15第5章TinyOS51嵌入式操作系統(tǒng)6、臨界資源(Cri第5章TinyOS51嵌入式操作系統(tǒng)7、上下文切換(ContextSwitch)當(dāng)硬件機(jī)制決定接受哪個(gè)中斷時(shí),則當(dāng)前指令流暫停,轉(zhuǎn)而執(zhí)行一個(gè)上下文切換,而后cpu從執(zhí)行當(dāng)前指令流轉(zhuǎn)換到執(zhí)行另外的指令流。這種在中斷發(fā)生時(shí)執(zhí)行的替換指令集就是中斷服務(wù)程序。將被中止的任務(wù)的“上下文信息”保存到“堆?!敝校?dāng)任務(wù)在重新運(yùn)行時(shí),則要將堆棧中的“上下文信息”在恢復(fù)到cpu的各個(gè)寄存器中,通過這樣的上下文切換,可實(shí)現(xiàn)cpu的“無縫”接續(xù)運(yùn)行。調(diào)度器從一個(gè)任務(wù)切換到另一個(gè)任務(wù)所開銷的時(shí)間則稱之為上下文切換時(shí)間。16第5章TinyOS51嵌入式操作系統(tǒng)7、上下文切換(Co第5章TinyOS51嵌入式操作系統(tǒng)圖5.5上下文切換示意圖17第5章TinyOS51嵌入式操作系統(tǒng)圖5.5上下文切第5章TinyOS51嵌入式操作系統(tǒng)8、可重入性(Reentrant)

由于任務(wù)的并發(fā)性,因此經(jīng)常會(huì)出現(xiàn)調(diào)用同一個(gè)函數(shù)的情況,如果一段程序可以被多個(gè)任務(wù)同時(shí)調(diào)用,而不必?fù)?dān)心數(shù)據(jù)被破壞,那么這樣的程序就是可重入的程序。一般來說具有可重入性的函數(shù)應(yīng)該只使用局部變量,因?yàn)楹瘮?shù)的局部變量保存在cpu內(nèi)部的寄存器或堆棧中,這樣調(diào)用同一個(gè)函數(shù)時(shí)不會(huì)發(fā)生沖突。如果函數(shù)一定要使用全局變量,那么必須對使用的全局變量進(jìn)行必要的保護(hù)。由此可見,C編譯器也應(yīng)該具有產(chǎn)生可重入代碼的能力。18第5章TinyOS51嵌入式操作系統(tǒng)8、可重入性(Ree第5章TinyOS51嵌入式操作系統(tǒng)5.1.2

<setjmp.h>頭文件與中止函數(shù)about()和退出函數(shù)exit()相比,初看起來,goto語句處理異常更可行,但是,goto語句只能在函數(shù)內(nèi)部跳轉(zhuǎn),即不能從一個(gè)函數(shù)直接跳轉(zhuǎn)到另一個(gè)函數(shù)。為此,標(biāo)準(zhǔn)C函數(shù)庫提供了setjmp()和longjmp()函數(shù),setjmp()函數(shù)相當(dāng)于非局部標(biāo)號,longjmp()函數(shù)相當(dāng)于goto的作用,從而解決了從一個(gè)函數(shù)直接跳轉(zhuǎn)到另一個(gè)函數(shù)的問題,即非局部跳轉(zhuǎn)。頭文件<setjmp.h>申明了這些函數(shù)及同時(shí)所需的jmp_buf數(shù)據(jù)類型。19第5章TinyOS51嵌入式操作系統(tǒng)5.1.2<s第5章TinyOS51嵌入式操作系統(tǒng)1、非局部遠(yuǎn)程跳轉(zhuǎn)要實(shí)現(xiàn)非局部跳轉(zhuǎn),都可以使用<setjmp.h>,該頭文件提供了以下必須的機(jī)制:jmp_buf是一個(gè)數(shù)組類型變量,可將它當(dāng)做“標(biāo)號”數(shù)據(jù)對象類型來看待,用于存放恢復(fù)調(diào)用環(huán)境所需要的上下文信息。

setjmp將程序的上下文信息保存到跳轉(zhuǎn)“緩沖區(qū)(jmp_buf類型的數(shù)組)”,當(dāng)稍后調(diào)用longjmp時(shí),將保存在緩沖區(qū)中的上下文信息作為返回地點(diǎn)標(biāo)記;無論在何地調(diào)用longjmp,將恢復(fù)最后一次由setjmp調(diào)用保存在“緩沖區(qū)”中的上下文信息,實(shí)現(xiàn)非局部遠(yuǎn)程跳轉(zhuǎn)。20第5章TinyOS51嵌入式操作系統(tǒng)1、非局部遠(yuǎn)程跳轉(zhuǎn)2第5章TinyOS51嵌入式操作系統(tǒng)2、保存調(diào)用環(huán)境

下表所示的setjmp是C標(biāo)準(zhǔn)庫中的一個(gè)函數(shù),setjmp使用jmp_buf類型數(shù)組environment變量來記錄現(xiàn)在的位置,即變量bp的當(dāng)前值、堆棧指針值(SP)和函數(shù)的返回地址addr15~addr0,供以后longjmp恢復(fù)該環(huán)境時(shí)使用。bp是在SDCC中定義的一個(gè)虛擬寄存器,用于簡化重入操作。21第5章TinyOS51嵌入式操作系統(tǒng)2、保存調(diào)用環(huán)境第5章TinyOS51嵌入式操作系統(tǒng)bp是在SDCC中定義的一個(gè)虛擬寄存器,用于簡化重入操作。書P186,對局部變量與bp做了描述說明以及在堆棧中的變化如下圖所示,可參考。22第5章TinyOS51嵌入式操作系統(tǒng)bp是第5章TinyOS51嵌入式操作系統(tǒng)3、jmp_buf由于jmp_buf主要用于保存當(dāng)前調(diào)用的上下文信息,為相應(yīng)的longjmp調(diào)用作為返回地點(diǎn)標(biāo)記,因此保存在緩沖區(qū)jmp_buf中的上下文信息,至少包括變量bp的當(dāng)前值、堆棧指針的當(dāng)前值(sp)、高8位和低8位返回地址addr15~addr0。其中的bp是在SDCC51中定義的一個(gè)虛擬寄存器,用戶不必關(guān)心變量bp的變化。23第5章TinyOS51嵌入式操作系統(tǒng)3、jmp_buf第5章TinyOS51嵌入式操作系統(tǒng)4、恢復(fù)調(diào)用環(huán)境longjmp也是C標(biāo)準(zhǔn)庫中的一個(gè)函數(shù),longjmp表示回到跳轉(zhuǎn)緩沖區(qū)jmp_buf類型數(shù)組environment變量記錄的位置,恢復(fù)setjmp調(diào)用所保存的變量bp的當(dāng)前值、堆棧指針值

和函數(shù)的返回地址addr15~addr0,轉(zhuǎn)移到setjmp調(diào)用處繼續(xù)執(zhí)行。24第5章TinyOS51嵌入式操作系統(tǒng)4、恢復(fù)調(diào)用環(huán)境第5章TinyOS51嵌入式操作系統(tǒng)

盡管longjmp會(huì)導(dǎo)致程序轉(zhuǎn)移,但它和goto有所不同,其區(qū)別如下:

goto語句不能跳出C語言的當(dāng)前函數(shù);

longjmp只能跳回曾經(jīng)到過的地方。與此同時(shí),setjmp與longjmp必須協(xié)同工作,它們有嚴(yán)格的執(zhí)行順序,必須先調(diào)用setjmp,然后再調(diào)用longjmp,以恢復(fù)到先前被保存的“程序執(zhí)行點(diǎn)”。如果setjmp調(diào)用之前執(zhí)行了longjmp,則程序的執(zhí)行流程變得不可預(yù)見,從而導(dǎo)致程序崩潰而退出。25第5章TinyOS51嵌入式操作系統(tǒng)盡管lo第5章TinyOS51嵌入式操作系統(tǒng)5.1.3變量命名規(guī)則1、概述

變量命名使用類匈牙利命名法:變量名最多由三部分組成:作用域,類型,描述。作用域:變量的作用范圍,確定管理的有效范圍是在函數(shù)體外還是在函數(shù)體內(nèi)。類型:該變量的類型,使用小寫字母。如:整型等描述:完全準(zhǔn)確地描述出該變量所代表的事物。如:Max,Error,New等。26第5章TinyOS51嵌入式操作系統(tǒng)5.1.3變量命第5章TinyOS51嵌入式操作系統(tǒng)2、作用域

作用域是變量名字的第一部分,只有三種情況:局部變量、模塊內(nèi)全局變量、應(yīng)用程序全局變量,其定義見下表。27第5章TinyOS51嵌入式操作系統(tǒng)2、作用域27第5章TinyOS51嵌入式操作系統(tǒng)3、類型縮寫

類型是變量名字第二部分,使用縮寫形式,見表5.44、變量描述5、變量類型縮寫TinyOS51中定義了一些變量類型,見表5.5

28第5章TinyOS51嵌入式操作系統(tǒng)3、類型縮寫28第5章TinyOS51嵌入式操作系統(tǒng)5.1.4范例分析非局部跳轉(zhuǎn)控制范例——程序清單5.5(P190),說明了setjmp函數(shù)和longjmp函數(shù)的具體作用。

29第5章TinyOS51嵌入式操作系統(tǒng)5.1.4范例分第5章TinyOS51嵌入式操作系統(tǒng)5.1.5setjmp與longjmp的實(shí)現(xiàn)setjmp和longjmp是標(biāo)準(zhǔn)庫函數(shù),其具體實(shí)現(xiàn)與編譯器有很大關(guān)聯(lián),且與硬件有密切的關(guān)系,所以它們往往都是由匯編語言編寫的。本書實(shí)例中,為了簡化這兩個(gè)函數(shù),約定以下規(guī)則:限定SDCC51為小模式;限定SDCC51的integer和long庫被編譯成可重入的;限定SDCC51所有函數(shù)被編譯成可重入的;修改setjmp和longjmp的返回值為char;取消longjmp的第二參數(shù),當(dāng)調(diào)用longjmp時(shí),則讓setjmp的返回值始終為1;30第5章TinyOS51嵌入式操作系統(tǒng)5.1.5se第5章TinyOS51嵌入式操作系統(tǒng)1、jmp_buf(TinyOS51中定義的變量類型,見表5.5)jmp_buf定義程序清單(setjmp.h)

30#define_SP_SIZE1//堆棧指針長度31#define_BP_SIZE_SP_SIZE//編譯器虛擬寄存器,用于重入32#define_RET_SIZE2//返回地址長度33typedefunsignedcharjmp_buf[_RET_SIZE+_SP_SIZE+_BP_SIZE];31第5章TinyOS51嵌入式操作系統(tǒng)1、jmp_buf第5章TinyOS51嵌入式操作系統(tǒng)2、setjmp的實(shí)現(xiàn)

setjmp就是將相應(yīng)的寄存器和返回地址保存到j(luò)mp_buf數(shù)組類型的jbBuf變量中,即保存的寄存器為變量bp的當(dāng)前值、堆棧指針的當(dāng)前值、高8位和低8位返回地址值。對于80C51單片機(jī)來說,由于調(diào)用函數(shù)是使用ACALL或LCALL指令來實(shí)現(xiàn)的,因此這些指令會(huì)將函數(shù)的返回地址保存在堆棧中。setjmp()定義詳見如下程序清單。32第5章TinyOS51嵌入式操作系統(tǒng)2、setjmp的實(shí)第5章TinyOS51嵌入式操作系統(tǒng)

setjmp()定義(_setjmp.c)程序清單30externunsignedcharbp;//編譯器為簡化重入操作而定義的變量39charsetjmp(jmp_bufjbBuf)40{dataunsignedchar*pucBuf=(datavoid*)0;//指向上下文信息存儲(chǔ)位置的指針

pubBuf=(dataunsignedchar*)jbBuf;//將jbBuf數(shù)組的首地址賦給pucBuf*pucBuf++=bp//保存bp的當(dāng)前值*pucBuf++=SP//保存SP的當(dāng)前值*pucBuf++=*((dataunsignedcahr*)SP);//保存返回地址高8位*pucBuf=*((dataunsignedcahr*)((char)(SP-1)));//保存返回地址低8位

return()}33第5章TinyOS51嵌入式操作系統(tǒng)第5章TinyOS51嵌入式操作系統(tǒng)見P192,下圖是setjmp()的執(zhí)行過程說明。34第5章TinyOS51嵌入式操作系統(tǒng)見P192,下圖是s第5章TinyOS51嵌入式操作系統(tǒng)3、longjmp的實(shí)現(xiàn)在setjmp()定義中,其存儲(chǔ)順序依次是bp、SP、返回地址高8位、低8位。,那么,longjmp()的定義就是按照上述順序恢復(fù)即可,最后函數(shù)返回1。

longjmp()定義(_longjmp.c)的程序清單見書P193.

35第5章TinyOS51嵌入式操作系統(tǒng)3、longjmp的第5章TinyOS51嵌入式操作系統(tǒng)見P193,下圖是longjmp()執(zhí)行過程說明。36第5章TinyOS51嵌入式操作系統(tǒng)見P193,下圖是l第5章TinyOS51嵌入式操作系統(tǒng)5.2最簡單的多任務(wù)模型5.2.1兩任務(wù)切換模型兩任務(wù)是多任務(wù)最簡單的典型情況,而任務(wù)切換是學(xué)習(xí)多任務(wù)操作系統(tǒng)的重點(diǎn)和難點(diǎn)。如果搞清楚了兩個(gè)任務(wù)間的任務(wù)切換,那么也就搞清楚了多任務(wù)操作系統(tǒng)核心的基本原理。在源代碼層次,“任務(wù)”也是函數(shù),所以很自然想到,可以使用setjmp()和longjmp()函數(shù)實(shí)現(xiàn)任務(wù)間的切換。假設(shè)兩個(gè)任務(wù)已運(yùn)行起來,則任務(wù)間的切換模型見下圖,其切換程序流向及狀態(tài)機(jī)見下程序清單。37第5章TinyOS51嵌入式操作系統(tǒng)5.2最簡單的第5章TinyOS51嵌入式操作系統(tǒng)兩任務(wù)切換模型圖示:38第5章TinyOS51嵌入式操作系統(tǒng)兩任務(wù)切換模型圖示:第5章TinyOS51嵌入式操作系統(tǒng)5.939第5章TinyOS51嵌入式操作系統(tǒng)5.939第5章TinyOS51嵌入式操作系統(tǒng)5.2.2待解決的問題1、如何讓任務(wù)互不干擾地運(yùn)行?

函數(shù)在運(yùn)行期間可能被中斷打斷,轉(zhuǎn)而執(zhí)行中斷服務(wù)程序。中斷服務(wù)程序不改變80C51的內(nèi)部寄存器值,所以,中斷不會(huì)干擾任務(wù)的運(yùn)行。在源代碼層次,任務(wù)也是一個(gè)函數(shù),任務(wù)正確運(yùn)行的條件與函數(shù)一致。2、如何讓任務(wù)運(yùn)行?兩個(gè)任務(wù)切換,必須要先執(zhí)行一個(gè)setjmp()函數(shù),系統(tǒng)在啟動(dòng)時(shí)沒有任務(wù)存在,即先前也沒有執(zhí)行過一個(gè)setjmp(),即無法切換。為解決此矛盾,可在創(chuàng)建任務(wù)task1時(shí),系統(tǒng)用另一個(gè)函數(shù)(假設(shè)為setTaskJmp())模擬任務(wù)task1調(diào)用setjmp()函數(shù),而事實(shí)上只要兩者執(zhí)行效果一致,即可。40第5章TinyOS51嵌入式操作系統(tǒng)5.2.2待解決第5章TinyOS51嵌入式操作系統(tǒng)5.2.3setTaskJmp()的實(shí)現(xiàn)任務(wù)調(diào)用setjmp()所做的工作如下:將返回地址壓人“任務(wù)堆棧”(即使用ACALL或LCALL指令),此時(shí)堆棧指針SP的值增加2;保存bp到任務(wù)上下文中;保存堆棧指針SP(指向任務(wù)堆棧)到任務(wù)上下文中;保存“返回地址”到任務(wù)上下文中。搞清楚任務(wù)調(diào)用setjmp()的工作,用setTaskJmp()來模擬實(shí)現(xiàn)setjmp(),其程序清單見P197-5.10。41第5章TinyOS51嵌入式操作系統(tǒng)5.2.3set第5章TinyOS51嵌入式操作系統(tǒng)5.2.4任務(wù)切換模型范例分析1、模型范例根據(jù)上面的分析,可以寫出任務(wù)切換模型的范例,詳見程序清單P197-5.11。2、堆棧分配每個(gè)任務(wù)都有獨(dú)立的堆棧,80C51的堆棧為idataunsignedchar類型數(shù)組。因此可通過定義對應(yīng)的全局變量來分配任務(wù)堆棧,程序5.11-29就是為兩個(gè)任務(wù)分配了堆棧空間。同時(shí),在系統(tǒng)調(diào)用setTaskJmp()函數(shù)時(shí),還需要指定對應(yīng)任務(wù)的堆棧。42第5章TinyOS51嵌入式操作系統(tǒng)5.2.4任務(wù)切第5章TinyOS51嵌入式操作系統(tǒng)3、切換任務(wù)

通過上述分析,可以畫出完整的兩任務(wù)切換圖如下,程序清單5.11的切換程序流向及狀態(tài)詳見程序清單5.12

.43第5章TinyOS51嵌入式操作系統(tǒng)3、切換任務(wù)43第5章TinyOS51嵌入式操作系統(tǒng)5.1244第5章TinyOS51嵌入式操作系統(tǒng)5.1244第5章TinyOS51嵌入式操作系統(tǒng)5.3協(xié)作式多任務(wù)操作系統(tǒng)(TinyOS51V1.0)5.3.1整體規(guī)劃1、內(nèi)核API現(xiàn)代操作系統(tǒng)不再使用協(xié)作式多任務(wù)管理機(jī)制,但作為學(xué)習(xí)還是有意義的,下面通過調(diào)用SDCC編譯器提供的setjmp()和longjmp()函數(shù),來編寫一個(gè)能夠?qū)崿F(xiàn)多任務(wù)切換的協(xié)作式操作系統(tǒng)——TinyOS51V1.0,以此介紹協(xié)作式多任務(wù)操作系統(tǒng)的設(shè)計(jì)思想。45第5章TinyOS51嵌入式操作系統(tǒng)5.3協(xié)作式多第5章TinyOS51嵌入式操作系統(tǒng)操作系統(tǒng)僅有內(nèi)核是不夠的,還需要各種應(yīng)用程序才能完成相應(yīng)的功能,所以TinyOS51必須具備創(chuàng)建任務(wù)的功能,tnOsTaskCreate()的作用就是創(chuàng)建任務(wù),該函數(shù)可以在調(diào)用tnOsInit()函數(shù)后任何時(shí)候調(diào)用,但在調(diào)用tnOsStart()函數(shù)之前至少調(diào)用一次,見下表。46第5章TinyOS51嵌入式操作系統(tǒng)操作第5章TinyOS51嵌入式操作系統(tǒng)任務(wù)退出運(yùn)行狀態(tài)時(shí),則必須釋放占有的資源,以便讓其他任務(wù)使用。因此,TinyOS51必須具備刪除自身任務(wù)和其他任務(wù)的功能,tnOsTaskDel()函數(shù)的作用就是刪除任務(wù),見下表。47第5章TinyOS51嵌入式操作系統(tǒng)任務(wù)第5章TinyOS51嵌入式操作系統(tǒng)當(dāng)任務(wù)運(yùn)行一段時(shí)間后,可以主動(dòng)放棄控制權(quán),讓下一個(gè)任務(wù)運(yùn)行,這是通過調(diào)度程序來實(shí)現(xiàn)的,TinyOS51必須具備任務(wù)切換功能,tnOsSched()函數(shù)的作用就是實(shí)現(xiàn)任務(wù)切換,執(zhí)行下一個(gè)任務(wù),該函數(shù)必須在任務(wù)中調(diào)用,而且每個(gè)任務(wù)都必須周期性的調(diào)用它,見下表。48第5章TinyOS51嵌入式操作系統(tǒng)當(dāng)任第5章TinyOS51嵌入式操作系統(tǒng)系統(tǒng)從驅(qū)動(dòng)到創(chuàng)建任務(wù)的過程中,操作系統(tǒng)需要做很多的準(zhǔn)備工作,這些都是由初始化引導(dǎo)程序完成的,在嵌入式系統(tǒng)中,這些工作可以由main()函數(shù)來完成。在TinyOS51中提供了2個(gè)供用戶調(diào)用的函數(shù),一個(gè)是初始化TinyOS51內(nèi)部變量的函數(shù)tnOsInit(),這個(gè)函數(shù)必須在其他函數(shù)之前調(diào)用,并只能調(diào)用一次,見下表。另一個(gè)是啟動(dòng)多任務(wù)環(huán)境的函數(shù)tnOsStart(),并執(zhí)行第一個(gè)任務(wù)。在調(diào)用此函數(shù)之前必須創(chuàng)建至少一個(gè)任務(wù),該函數(shù)不能重復(fù)調(diào)用,且該函數(shù)不返回,見下表。49第5章TinyOS51嵌入式操作系統(tǒng)系統(tǒng)第5章TinyOS51嵌入式操作系統(tǒng)2、資源配置與示例

TinyOS51對任務(wù)最大數(shù)沒有限制,但由于任務(wù)需要占用內(nèi)部有限的idata資源,同時(shí)為了保護(hù)可重入函數(shù)的變量,還將占用更多的堆棧,所以可支持的任務(wù)數(shù)目實(shí)現(xiàn)上是有限的。根據(jù)實(shí)現(xiàn)情況,TinyOS51的最大任務(wù)數(shù)以3~4最為合適,OS資源配置代碼如下:

程序清單(tiny_os_51_cfg.h)

37#defineTN_OS_MAX_TASKS2//最大任務(wù)數(shù)目一個(gè)簡單的測試用例的程序清單見5.14(P202)。50第5章TinyOS51嵌入式操作系統(tǒng)2、資源配置與示例5第5章TinyOS51嵌入式操作系統(tǒng)5.3.2任務(wù)控制塊TCB(TaskControlBlock)1、任務(wù)的識別

對于RTOS來說,它為每一個(gè)任務(wù)分配一個(gè)稱為“任務(wù)控制塊的結(jié)構(gòu)體變量”來管理任務(wù)的,即使用“任務(wù)控制塊結(jié)構(gòu)體變量的指針”來識別任務(wù)。每個(gè)指針占用3個(gè)字節(jié),開銷較大。

任務(wù)控制塊是多任務(wù)操作系統(tǒng)的核心數(shù)據(jù),為了避免用戶任務(wù)“意外”修改任務(wù)控制塊,則這個(gè)指針不應(yīng)當(dāng)提供給用戶程序。TinyOS51不使用任務(wù)控制塊結(jié)構(gòu)體指針方法來識別任務(wù),主要是為了節(jié)省MCU內(nèi)的RAM。51第5章TinyOS51嵌入式操作系統(tǒng)5.3.2任務(wù)控第5章TinyOS51嵌入式操作系統(tǒng)最好的方法,為每個(gè)任務(wù)建立一個(gè)“任務(wù)控制塊結(jié)構(gòu)體類型數(shù)組”,將任務(wù)的完整信息保存到這個(gè)數(shù)組中,然后通過數(shù)組_GtcbTasks[]的下標(biāo)來識別任務(wù)。由此可見,下標(biāo)就是識別任務(wù)的字符型整數(shù),下標(biāo)又俗稱為句柄(Handle),任務(wù)句柄的定義如下:程序清單5.15任務(wù)句柄的定義(tiny_os_51.h)31typedefcharTN_OS_TASK_HANDLE;52第5章TinyOS51嵌入式操作系統(tǒng)最好第5章TinyOS51嵌入式操作系統(tǒng)2、任務(wù)控制塊

當(dāng)一個(gè)任務(wù)創(chuàng)立并準(zhǔn)備運(yùn)行時(shí),內(nèi)核將其放入就緒狀態(tài)。任務(wù)一旦運(yùn)行完畢,則立即刪除,從而釋放內(nèi)存資源。因此要設(shè)立一個(gè)任務(wù)狀態(tài)字“ucTaskStat”來管理任務(wù)所處狀態(tài),如圖。任務(wù)狀態(tài)字的定義如下:

程序清單5.16任務(wù)狀態(tài)字(tiny_os_51_core.c)31#define_TN_TASK_FLG_DEL0X00//任務(wù)被刪除32#define_TN_TASK_FLG_RDY0X01//任務(wù)就緒53第5章TinyOS51嵌入式操作系統(tǒng)2、任務(wù)控制塊第5章TinyOS51嵌入式操作系統(tǒng)上下文信息:當(dāng)一個(gè)任務(wù)主動(dòng)放棄CPU的控制權(quán),從而允許下一個(gè)任務(wù)運(yùn)行時(shí),則此時(shí)必須保存該任務(wù)的上下文信息,當(dāng)操作系統(tǒng)決定再次運(yùn)行該任務(wù)時(shí),可通過釋放上下文信息就可以讓該任務(wù)再次運(yùn)行。在TinyOS51中,上下文信息保存在jmp_buf數(shù)組類型的jbTaskContext變量中,而jmp_buf是在<setjmp.h>C語言標(biāo)準(zhǔn)頭文件中定義的。一個(gè)示例見程序清單5.17(P204)54第5章TinyOS51嵌入式操作系統(tǒng)上下文信息:54第5章TinyOS51嵌入式操作系統(tǒng)5.3.3內(nèi)部變量初始化我們知道單片機(jī)需要初始化,其實(shí),TinyOS51也需要初始化,當(dāng)初始化時(shí)還沒有任務(wù)存在,因此必須將所有的任務(wù)控制塊初始化為一個(gè)“空白表”。因?yàn)門inyOS51只有知道當(dāng)前運(yùn)行的是哪個(gè)任務(wù),才能在任務(wù)切換時(shí)決定下一個(gè)將要運(yùn)行的任務(wù)。由于用戶創(chuàng)建的第一個(gè)任務(wù)的句柄為0,所以系統(tǒng)開始運(yùn)行句柄為0的任務(wù),因此,必須將用于追蹤當(dāng)前正在運(yùn)行的任務(wù)的句柄_GthTaskCur變量初始化為0。見程序清單5.18(P204)55第5章TinyOS51嵌入式操作系統(tǒng)5.3.3內(nèi)部變第5章TinyOS51嵌入式操作系統(tǒng)5.3.4創(chuàng)建任務(wù)(TaskCreate)

如果一個(gè)程序需要運(yùn)行,必須要?jiǎng)?chuàng)建一個(gè)與之對應(yīng)的任務(wù),才能在內(nèi)存中運(yùn)行。一個(gè)任務(wù)可以在操作系統(tǒng)啟動(dòng)前(即調(diào)用tnOsStart())創(chuàng)建,也可以在其他任務(wù)的執(zhí)行過程中創(chuàng)建,但任務(wù)不能由中斷程序來創(chuàng)建,創(chuàng)建任務(wù)函數(shù)原型為:TN_OS_TASK_HANDLEtnOsTaskCreate(void(*pfuncTask)(void),idataunsignedchar*pucStk)舉例:unOsTaskCreate(task0,_GuctaskStks[0]);其中,task0為任務(wù)函數(shù)的入口地址,_GucTaskStks[0]為任務(wù)堆棧的位置。56第5章TinyOS51嵌入式操作系統(tǒng)5.3.4創(chuàng)建任第5章TinyOS51嵌入式操作系統(tǒng)針對任務(wù)的三種狀態(tài)模型,創(chuàng)建任務(wù)函數(shù)源代碼見程序清單5.19(P206),其創(chuàng)建任務(wù)的過程包括:(1)申請一個(gè)空白TCB:搜索一個(gè)空閑的TCB項(xiàng),并分配給新任務(wù),同時(shí)系統(tǒng)賦予它唯一的任務(wù)句柄thRt。(2)填充TCB:先保存新任務(wù)的上下文,將搜索到的TCB設(shè)置為就緒狀態(tài),其返回值為就緒任務(wù)的任務(wù)句柄thRt。(3)空閑任務(wù)啟動(dòng)多任務(wù)環(huán)境之前,操作系統(tǒng)至少需創(chuàng)建一個(gè)用戶任務(wù)(低優(yōu)先級空閑任務(wù))。當(dāng)多任務(wù)環(huán)境啟動(dòng)后,則表明多任務(wù)環(huán)境已經(jīng)建立,此時(shí)可以創(chuàng)建新的任務(wù)了.57第5章TinyOS51嵌入式操作系統(tǒng)針第5章TinyOS51嵌入式操作系統(tǒng)5.3.5啟動(dòng)多任務(wù)環(huán)境在操作系統(tǒng)中運(yùn)行第一個(gè)用戶任務(wù)的過程被稱之為“啟動(dòng)多任務(wù)環(huán)境”,由于用戶創(chuàng)建的第一個(gè)任務(wù)的句柄是0,所以系統(tǒng)開始運(yùn)行句柄為0的任務(wù)。TinyOS51是通過調(diào)用tnOsStart()函數(shù)來實(shí)現(xiàn)的,由longjmp()函數(shù)執(zhí)行句柄為0的任務(wù),見程序清單5.20。

程序清單5.20啟動(dòng)OS(tiny_os_core.c)107voidtnOsStart(void)108{109longjmp(_GtcbTasks[0],jbTaskContext);//執(zhí)行0號任務(wù)110}58第5章TinyOS51嵌入式操作系統(tǒng)5.3.5啟動(dòng)多第5章TinyOS51嵌入式操作系統(tǒng)5.3.6任務(wù)切換(TaskSwitch)任務(wù)切換是指保存當(dāng)前任務(wù)的上下文,并恢復(fù)需要執(zhí)行任務(wù)的上下文的過程。當(dāng)任務(wù)發(fā)生切換時(shí),將當(dāng)前執(zhí)行任務(wù)的上下文保存到該任務(wù)的TCB中,然后從相應(yīng)的TCB中恢復(fù)下一個(gè)將要執(zhí)行的已就緒任務(wù)的上下文,若所有任務(wù)都處于未就緒狀態(tài),則等待本任務(wù)直到就緒為止,相當(dāng)于一般操作系統(tǒng)的空閑任務(wù)。這就是任務(wù)切換的設(shè)計(jì)思想。

TinyOS51的任務(wù)切換就是通過調(diào)用tnOsSched()函數(shù)來實(shí)現(xiàn)的。任務(wù)切換見程序清單5.21(P207)59第5章TinyOS51嵌入式操作系統(tǒng)5.3.6任務(wù)切第5章TinyOS51嵌入式操作系統(tǒng)5.3.7刪除任務(wù)(TaskDelete)

當(dāng)刪除任務(wù)時(shí),只需要將任務(wù)句柄告訴“刪除任務(wù)”函數(shù),即可將對應(yīng)的任務(wù)刪除。一個(gè)任務(wù)既可以刪除別的任務(wù),也可以刪除自身。刪除其他任務(wù),只要將任務(wù)設(shè)置為不可運(yùn)行狀態(tài)即可;如果刪除自身,則需要將任務(wù)設(shè)置為不可運(yùn)行狀態(tài),還要將CPU控制權(quán)交給另一個(gè)可運(yùn)行的任務(wù),即進(jìn)行任務(wù)切換。

TinyOS51刪除任務(wù)的是通過調(diào)用tnOsTaskDel()函數(shù)來實(shí)現(xiàn)的,見刪除任務(wù)程序清單5.22(P208)60第5章TinyOS51嵌入式操作系統(tǒng)5.3.7刪除任第5章TinyOS51嵌入式操作系統(tǒng)5.3.8小結(jié)

5.3節(jié)介紹的協(xié)作式多任務(wù)操作系統(tǒng)僅僅是為了入門學(xué)習(xí)之用,實(shí)際上,搶占式實(shí)時(shí)多任務(wù)操作系統(tǒng)已經(jīng)成為商業(yè)化實(shí)時(shí)多任務(wù)操作系統(tǒng)的主流。在嵌入式應(yīng)用系統(tǒng)中,并非選用最好的操作系統(tǒng),而恰到好處的、性價(jià)比高的操作系統(tǒng)才是最佳選擇。下節(jié)5.4將介紹“TinyOS51V1.1時(shí)間片輪詢多任務(wù)操作系統(tǒng)”。61第5章TinyOS51嵌入式操作系統(tǒng)5.3.8小結(jié)6第5章TinyOS51嵌入式操作系統(tǒng)5.4時(shí)間片輪詢多任務(wù)操作系統(tǒng)(TinyOS51V1.1)5.4.1概述不同的操作系統(tǒng)內(nèi)核使用了不同“調(diào)度算法”來決定什么時(shí)候運(yùn)行那個(gè)任務(wù)(即調(diào)度),而事實(shí)上協(xié)作式多任務(wù)操作系統(tǒng)時(shí)沒有調(diào)度算法的,它由任務(wù)自己來決定何時(shí)調(diào)度。一般來說,操作系統(tǒng)的單獨(dú)算法主要有3類:時(shí)間片輪詢(Time-slicePolling)優(yōu)先級(Priority)帶優(yōu)先級的時(shí)間片輪詢調(diào)度算法62第5章TinyOS51嵌入式操作系統(tǒng)5.4時(shí)間片輪第5章TinyOS51嵌入式操作系統(tǒng)時(shí)間片輪詢調(diào)度算法:在分時(shí)系統(tǒng)中,一般采用“時(shí)間片輪詢”調(diào)度算法,這是一種絕對公平的思想策略。首先將MCU的執(zhí)行時(shí)間劃分為若干個(gè)時(shí)間片,然后讓處于就緒狀態(tài)的任務(wù),按順序輪流占有MCU。當(dāng)時(shí)間片用完時(shí),即使任務(wù)沒有執(zhí)行完畢,則系統(tǒng)也會(huì)無情地剝奪該任務(wù)使用MCU的權(quán)利。63第5章TinyOS51嵌入式操作系統(tǒng)時(shí)間片輪詢調(diào)度算法:第5章TinyOS51嵌入式操作系統(tǒng)優(yōu)先級調(diào)度算法:

為了滿足任務(wù)的緊迫性和重要性,將任務(wù)劃分為不同等級區(qū)別對待,優(yōu)先級高的先執(zhí)行,優(yōu)先級低的后執(zhí)行,且優(yōu)先級高的任務(wù)可以暫停正在執(zhí)行的優(yōu)先級低的任務(wù),當(dāng)優(yōu)先級高的任務(wù)執(zhí)行完畢后,在繼續(xù)執(zhí)行暫停的優(yōu)先級低的任務(wù)。對于同優(yōu)先級的任務(wù),則使用時(shí)間片輪詢調(diào)度算法。如果要求所有任務(wù)的優(yōu)先級必須不同,這就是“完全基于優(yōu)先級的調(diào)度算法”。64第5章TinyOS51嵌入式操作系統(tǒng)優(yōu)先級調(diào)度算法:64第5章TinyOS51嵌入式操作系統(tǒng)帶優(yōu)先級的時(shí)間片輪詢調(diào)度算法:

當(dāng)今的商業(yè)社會(huì),企業(yè)為了實(shí)現(xiàn)利益的最大化,常常為優(yōu)先級高的客戶提供更多的服務(wù),為優(yōu)先級低的客戶提供相對較少的服務(wù)。。

帶優(yōu)先級的時(shí)間片輪詢調(diào)度算法就像企業(yè)對待客戶一樣,將任務(wù)劃分為優(yōu)先級(等級),對優(yōu)先級高的任務(wù)可以分配更大的時(shí)間片,對優(yōu)先級低的任務(wù)則分配較少的時(shí)間片,同時(shí)也讓所有任務(wù)都得到執(zhí)行。

此算法的操作系統(tǒng)中,有2種情況下進(jìn)行任務(wù)切換:任務(wù)主動(dòng)請求調(diào)度分配給任務(wù)的時(shí)間片已到65第5章TinyOS51嵌入式操作系統(tǒng)帶優(yōu)先級的時(shí)間片輪詢第5章TinyOS51嵌入式操作系統(tǒng)任務(wù)時(shí)間片的切換:對于不是任務(wù)主動(dòng)放棄CPU控制權(quán)而進(jìn)行的任務(wù)調(diào)度,就是搶占式任務(wù)調(diào)度。事實(shí)上,所有的操作系統(tǒng)都是使用一個(gè)周期性的中斷來管理時(shí)間片的,在這個(gè)中斷服務(wù)程序中判斷任務(wù)是否用完自己的時(shí)間片。除了協(xié)作式多任務(wù)操作系統(tǒng)外,其他的多任務(wù)操作系統(tǒng)都只在2個(gè)時(shí)刻進(jìn)行任務(wù)切換,即任務(wù)主動(dòng)調(diào)用OS提供的函數(shù)時(shí),或中斷服務(wù)程序結(jié)束時(shí)。66第5章TinyOS51嵌入式操作系統(tǒng)任務(wù)時(shí)間片的切換:6第5章TinyOS51嵌入式操作系統(tǒng)5.4.2整體規(guī)則1、內(nèi)核API

在協(xié)作式多任務(wù)操作系統(tǒng)中,如果其中一個(gè)任務(wù)死掉,則可能造成整個(gè)系統(tǒng)崩潰。為了克服TinyOS51V1.0這個(gè)缺點(diǎn),在TinyOS51V1.1上添加了最簡單的時(shí)間片輪詢多任務(wù)調(diào)度算法,“在每個(gè)時(shí)鐘節(jié)拍中斷時(shí)調(diào)度”,即每次分配給任務(wù)的時(shí)鐘節(jié)拍數(shù)都是一個(gè)時(shí)鐘節(jié)拍。TinyOS51V1.1為時(shí)間片輪詢多任務(wù)操作系統(tǒng),因此用戶不在使用任務(wù)切換函數(shù),它僅提供給內(nèi)核使用,并更換為_tnOsSched()。下表為新增的延時(shí)函數(shù)和用戶中斷函數(shù)。程序范例見5.23(P211)67第5章TinyOS51嵌入式操作系統(tǒng)5.4.2整體規(guī)第5章TinyOS51嵌入式操作系統(tǒng)68第5章TinyOS51嵌入式操作系統(tǒng)68第5章TinyOS51嵌入式操作系統(tǒng)5.4.3任務(wù)控制塊由于TinyOS51V1.1新增了任務(wù)延時(shí)服務(wù)功能,因此,必須在TCB中增加一個(gè)記錄任務(wù)延時(shí)時(shí)間的成員uiTicks,新的TCB關(guān)聯(lián)圖見下5.13,如果uiTicks為0,說明任務(wù)已經(jīng)完成延時(shí),則任務(wù)不需要等待。同時(shí),在任務(wù)狀態(tài)字中也需要增加一個(gè)用于指示當(dāng)前任務(wù)處于延時(shí)狀態(tài)的標(biāo)志_TN_TASK_FLG_DLY,

詳見程序清單5.24(P212)69第5章TinyOS51嵌入式操作系統(tǒng)5.4.3任務(wù)控第5章TinyOS51嵌入式操作系統(tǒng)5.4.4內(nèi)部變量初始化由于TCB增加了一個(gè)uiTicks,因此必須初始化,詳見程序清單5.25(P212)。5.4.5創(chuàng)建任務(wù)

對于時(shí)間片輪詢多任務(wù)操作系統(tǒng)來說,在時(shí)鐘節(jié)拍中斷服務(wù)的最后,可能會(huì)發(fā)生任務(wù)切換。而時(shí)鐘節(jié)拍中斷可能發(fā)生在如何時(shí)候,而此時(shí)系統(tǒng)切換到另一個(gè)任務(wù)也想創(chuàng)建一個(gè)新任務(wù),此時(shí)兩個(gè)任務(wù)的句柄是一樣的,且占用一個(gè)任務(wù)控制塊,勢必引起系統(tǒng)混亂,因此在創(chuàng)建任務(wù)的過程中必須禁止任務(wù)切換,那么最簡單的方法就是“先禁止中斷,然后再允許中斷”。創(chuàng)建任務(wù)程序清單5.26(P231)。70第5章TinyOS51嵌入式操作系統(tǒng)5.4.4內(nèi)部變第5章TinyOS51嵌入式操作系統(tǒng)5.4.6啟動(dòng)多任務(wù)環(huán)境在TinyOS51V1.1中,如果不允許中斷,則時(shí)鐘節(jié)拍中斷服務(wù)程序不會(huì)運(yùn)行,因此在啟動(dòng)操作系統(tǒng)時(shí),必須增加允許中斷的代碼,見程序清單5.27(P214)。5.4.7任務(wù)調(diào)度與V1.0版本比較,TinyOS51V1.1版本將tnOsSched()函數(shù)更名為_tnOsSched(),增加了“禁止中斷和允許制度”代碼,并僅供內(nèi)核調(diào)用,詳見程序清單5.28(P214)。71第5章TinyOS51嵌入式操作系統(tǒng)5.4.6啟動(dòng)多第5章TinyOS51嵌入式操作系統(tǒng)5.4.8時(shí)鐘節(jié)拍中斷

大多數(shù)操作系統(tǒng)的“延時(shí)管理和在中斷服務(wù)程序中的任務(wù)切換”功能,分別是用兩個(gè)函數(shù)實(shí)現(xiàn)的。由于TinyOS51V1.1是純粹的時(shí)間片輪詢多任務(wù)操作系統(tǒng),除了在“timer0ISR()時(shí)鐘節(jié)拍中斷服務(wù)程序”中切換任務(wù)外,在其他的中斷服務(wù)程序中不作任務(wù)切換操作,所以將“延時(shí)管理(程序清單5.29(241~248))”與“在中斷服務(wù)程序中的任務(wù)切換(程序清單5.29(241~248))”功能,寫在tnOsTimeTick()時(shí)鐘節(jié)拍處理函數(shù)中,見程序清單5.29(P215)72第5章TinyOS51嵌入式操作系統(tǒng)5.4.8時(shí)鐘節(jié)第5章TinyOS51嵌入式操作系統(tǒng)5.4.9longjmplnlsr()

該函數(shù)原型為:longjmpInIsr(jmp_bufjbBuf)_nakedlongjmpInIsr()使用了關(guān)鍵字_naked,這是與longjmp的不同之處,在TinyOS51中則說明此函數(shù)是無保護(hù)函數(shù),即禁止編譯器為函數(shù)生成開始和結(jié)尾代碼。實(shí)際上它意味著函數(shù)的這部分代碼必須使用內(nèi)嵌匯編來寫,在這里主要是為“RETI”指令準(zhǔn)備的。由于longjmpInIsr()函數(shù)是無保護(hù)函數(shù),因此其返回值必須由用戶自己來處理,longjmpInIsr()定義詳見程序清單5.30(P217)。73第5章TinyOS51嵌入式操作系統(tǒng)5.4.9lon第5章TinyOS51嵌入式操作系統(tǒng)5.4.10任務(wù)延時(shí)在無操作系統(tǒng)的應(yīng)用系統(tǒng)中,常使用軟件的空循環(huán)來實(shí)現(xiàn)延時(shí),由于CPU完全處于空轉(zhuǎn)狀態(tài),因此大大降低了CPU的效率。為了提高CPU的使用效率,大部分操作系統(tǒng)都提供了延時(shí)服務(wù)。即當(dāng)任務(wù)處于延時(shí)期間,而其他的任務(wù)仍可繼續(xù)進(jìn)行,TinyOS51V1.1也提供了任務(wù)延時(shí)服務(wù)。詳見任務(wù)清單5.32(P218)最好的方法是設(shè)置一個(gè)“周期性的中斷”,然后用這個(gè)“中斷服務(wù)程序”來記錄當(dāng)前任務(wù)的剩余延時(shí)時(shí)間。

TinyOS51V1.1的時(shí)鐘節(jié)拍中斷timer0JSR()調(diào)用tnOsTimeTick()函數(shù)來記錄當(dāng)前任務(wù)的剩余時(shí)間。74第5章TinyOS51嵌入式操作系統(tǒng)5.4.10任務(wù)第5章TinyOS51嵌入式操作系統(tǒng)5.4.11刪除任務(wù)tnOsTaskDel()刪除任務(wù)函數(shù)詳見程序清單5.33,與V1.0版本比較,TinyOS51V1.1版本在tnOsTaskDel()函數(shù)中增加了2部分:由于TCB增加了一個(gè)uiTasks,所以必須初始化禁止中斷和允許中斷75第5章TinyOS51嵌入式操作系統(tǒng)5.4.11刪除第5章TinyOS51嵌入式操作系統(tǒng)5.5信號量(TinyOS51V1.2)5.5.1概述1、信號量(Semaphore)

在任務(wù)共享同一個(gè)地址空間的系統(tǒng)中,任務(wù)可以通過全局變量傳遞數(shù)據(jù)信息。而在一些多任務(wù)操作系統(tǒng)中,由于不同的任務(wù)可能占用不同的地址空間,所以一個(gè)任務(wù)不能直接訪問另一個(gè)任務(wù)定義的變量,因此也就不能使用全局變量了。

通常是采用鐵路信號燈控制機(jī)制的方法,即在多個(gè)相互合作的任務(wù)之間使用簡單的信號來同步,也就是通過簡單的信號量讓多個(gè)任務(wù)進(jìn)行某種形式的合作。

76第5章TinyOS51嵌入式操作系統(tǒng)5.5信號量第5章TinyOS51嵌入式操作系統(tǒng)2、計(jì)數(shù)型信號量

在嵌入式多任務(wù)系統(tǒng)中,為了使系統(tǒng)達(dá)到高效處理和快速響應(yīng)的目的,大量采用“事件驅(qū)動(dòng)”的方式來編寫任務(wù),而事件可能是外部的,也可能是內(nèi)部的比如:一個(gè)任務(wù)給另一個(gè)任務(wù)發(fā)送信號量或消息,于是將用于任務(wù)之間同步和通信的“信號量、信息郵箱”等稱之為“事件”。

信號量如同通行證,任務(wù)要運(yùn)行就必須先拿到通行證,如果信號量已被其他的任務(wù)所占用,那么,該任務(wù)只能被掛起,直到信號量被當(dāng)前使用者釋放為止。77第5章TinyOS51嵌入式操作系統(tǒng)2、計(jì)數(shù)型信號量7第5章TinyOS51嵌入式操作系統(tǒng)5.5.2整體規(guī)劃

1內(nèi)核API針對8051單片機(jī),在引入信號量后,規(guī)劃TinyOS51時(shí)必須節(jié)省RAM,具體如下:由用戶代碼來定義“信號量類型變量”,其定義在idata中,這樣無需刪除信號量函數(shù)。將任務(wù)本身等待的事件保存到TCB中,用指向等待事件的指針pvEvent來記錄。為了便于返回以負(fù)數(shù)表示的錯(cuò)誤狀態(tài),信號量計(jì)數(shù)值可保存在一個(gè)有符號數(shù)char類型字節(jié)變量中,其計(jì)數(shù)范圍為0~127。由于信號量屬于一種事件,因此TinyOS51規(guī)劃了事件的返回值,詳見程序清單5.34(P220)78第5章TinyOS51嵌入式操作系統(tǒng)5.5.2整體規(guī)第5章TinyOS51嵌入式操作系統(tǒng)信號量的標(biāo)準(zhǔn)操作包括創(chuàng)建信號量(初始化),獲取信號量和發(fā)送信號量,分別見下表。2資源配置與示例

使用信號量必須注意:先創(chuàng)建,后使用,使用范例獎(jiǎng)程序清單5.35(P221)79第5章TinyOS51嵌入式操作系統(tǒng)信號第5章TinyOS51嵌入式操作系統(tǒng)80第5章TinyOS51嵌入式操作系統(tǒng)80第5章TinyOS51嵌入式操作系統(tǒng)5.5.3任務(wù)控制塊任務(wù)在同一時(shí)刻只能等待一個(gè)事件,因此可以用指向等待事件的指針pvEvent指示任務(wù)正在等待那個(gè)具體的事件,并通過掃描所有TCB的pvEvent成員,即可獲得等待信號量的任務(wù)列表。任務(wù)控制塊成員結(jié)構(gòu)示意圖見5.15,相關(guān)程序清單5.36(P222)81第5章TinyOS51嵌入式操作系統(tǒng)5.5.3任務(wù)控第5章TinyOS51嵌入式操作系統(tǒng)5.5.4內(nèi)部變量初始化由于TCB增加了一個(gè)pvEvent,必須初始化,詳見程序清單5.37(P223)

5.5.5信號量的定義

信號量不在包含等待任務(wù)列表,只包含信號量的值,詳見信號量定義程序清單5.38(P224)5.5.6創(chuàng)建信號量

在使用一個(gè)信號量之前,必須先調(diào)用“創(chuàng)建信號量”函數(shù)來創(chuàng)建這個(gè)信號量,而信號量的建立實(shí)際上就是對信號量進(jìn)行初始化。見程序清單5.39(P225)82第5章TinyOS51嵌入式操作系統(tǒng)5.5.4內(nèi)部變第5章TinyOS51嵌入式操作系統(tǒng)5.5.7獲得信號量獲得信號量又稱等待信號量、請求信號量或接收信號量,是信號量的一種基本操作。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論