時間片輪詢多任務(wù)操作系統(tǒng)課件_第1頁
時間片輪詢多任務(wù)操作系統(tǒng)課件_第2頁
時間片輪詢多任務(wù)操作系統(tǒng)課件_第3頁
時間片輪詢多任務(wù)操作系統(tǒng)課件_第4頁
時間片輪詢多任務(wù)操作系統(tǒng)課件_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

5.4時間片輪詢多任務(wù)操作系統(tǒng)5.4時間片輪詢多任務(wù)操作系統(tǒng)目錄1概述2整體規(guī)劃3任務(wù)控制塊4內(nèi)部變量初始化5創(chuàng)建任務(wù)6啟動多任務(wù)環(huán)境longjmpInIsr()

9任務(wù)調(diào)度7時鐘節(jié)拍中斷8任務(wù)延時10刪除任務(wù)11目錄1概述2整體規(guī)劃3任務(wù)控制塊4內(nèi)部變運(yùn)行的任務(wù)難以得知其他任務(wù)狀態(tài),任務(wù)切換時機(jī)難以把握。如果一個任務(wù)死掉,勢必造成整個系統(tǒng)死掉。協(xié)作式多任務(wù)系統(tǒng)任務(wù)協(xié)作式多任務(wù)系統(tǒng)的特點(diǎn)安全性復(fù)雜性協(xié)作式多任務(wù)系統(tǒng)中,任務(wù)切換需正在運(yùn)行的任務(wù)主動讓出CPU,這不僅帶來一些安全隱患,而且使程序設(shè)計(jì)相當(dāng)?shù)膹?fù)雜。任務(wù)調(diào)度任務(wù)調(diào)度交給操作系統(tǒng),引入調(diào)度算法運(yùn)行的任務(wù)難以得知其他任務(wù)狀態(tài),任務(wù)切換時機(jī)難以把握。如果一調(diào)度算法時間片輪詢1優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢3調(diào)度算法時間片輪詢1優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢調(diào)度算法時間片輪詢1tt任務(wù)的運(yùn)行時間時間片輪詢系統(tǒng)中任務(wù)運(yùn)行情況在時間片輪詢操作系統(tǒng)中,CPU的執(zhí)行時間被劃分為若干時間片,然后讓處于就緒狀態(tài)的任務(wù),按順序輪流占用CPU。當(dāng)時間片用完時,即使任務(wù)未執(zhí)行完,系統(tǒng)也剝奪此任務(wù)的CPU使用權(quán)力。時間片長度Δt一般為1~10ms

優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢3任務(wù)A

任務(wù)B任務(wù)C

所有任務(wù)相同對待,分時運(yùn)行。調(diào)度算法時間片輪詢1tt任務(wù)的運(yùn)行時間時間片輪詢系調(diào)度算法時間片輪詢1優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢3+

低優(yōu)先級+

中優(yōu)先級+

高優(yōu)先級任務(wù)A

任務(wù)B任務(wù)C

t高優(yōu)先級任務(wù)先運(yùn)行t高優(yōu)先級任務(wù)搶占低優(yōu)先級任務(wù)不同任務(wù)不同對待,優(yōu)先級高任務(wù)的先運(yùn)行。調(diào)度算法時間片輪詢1優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢調(diào)度算法時間片輪詢1優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢3這種調(diào)度算法情況較復(fù)雜,類型較多,自己去學(xué)習(xí)了解。調(diào)度算法時間片輪詢1優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢?nèi)蝿?wù)切換時機(jī)分配給任務(wù)的時間片已到任務(wù)主動請求調(diào)度12任務(wù)在調(diào)用操作系統(tǒng)提供的“管理”類服務(wù)(如刪除任務(wù)等)和“等待”類服務(wù)(如延時、獲取信號量、等待消息等)時,會主動請求調(diào)度。操作系統(tǒng)采用一個周期性的中斷來管理時間片,在這個中斷服務(wù)函數(shù)中,判斷運(yùn)行的任務(wù)是否用完了時間片。中斷中切換任務(wù)使用時間片輪詢調(diào)度的操作系統(tǒng)中,會在兩種下進(jìn)行任務(wù)切換。任務(wù)切換時機(jī)分配給任務(wù)的時間片已到任務(wù)主動請求調(diào)度12目錄2整體規(guī)劃1概述34任務(wù)控制塊內(nèi)部變量初始化目錄2整體規(guī)劃1概述34任務(wù)控制塊內(nèi)部變時間片輪詢操作系統(tǒng)規(guī)劃時間片輪詢調(diào)度算法時間片輪詢多任務(wù)操作系統(tǒng)協(xié)作式多任務(wù)系統(tǒng)TinyOS51V1.0TinyOS51V1.1

TinyOS51V1.1采用最簡單的時間片輪詢調(diào)度算法,在每個時鐘節(jié)拍中斷時調(diào)度,即分配給任務(wù)的時間片為一個時鐘節(jié)拍。

這樣,在任務(wù)控制塊中不僅不需要保存時鐘任務(wù)剩余的時鐘節(jié)拍,而且也不必編寫計(jì)算任務(wù)的剩余時間和設(shè)置任務(wù)時間片的代碼。時間片輪詢操作系統(tǒng)規(guī)劃時間片輪詢調(diào)度算法時間片輪詢多任務(wù)協(xié)TinyOS51從V1.0到V1.1的改變TinyOS51V1.0TinyOS51v1.1任務(wù)調(diào)度函數(shù)tnOsSched()__tnOsSched()任務(wù)延時函數(shù)無tnOsTimeDly()時鐘節(jié)拍處理函數(shù)無tnOsTimeTick()TinyOS51V1.0和TinyOS51V1.1的API不同點(diǎn)提供操作系統(tǒng)的一種基本服務(wù)——延時服務(wù),延時以時鐘節(jié)拍為單位。在TinyOS51中,時鐘節(jié)拍中斷由用戶實(shí)現(xiàn),在時鐘節(jié)拍中斷處理函數(shù)中調(diào)用tnOsTimeTick()。TinyOS51從V1.0到V1.1的改變TinyOS51voidtask0(void){TMOD=(TMOD&0xF0)|0x01;TL0=0x00;//TH0=0x00;//初始化timer0,即TR0=1;//初始化時鐘節(jié)拍ET0=1;//中斷。TF0=0;//while(1){__GucTask0++;}}/**一個簡單的任務(wù),無限循環(huán)中讓*__GucTask0++。*/voidtask1(void){while(1){__GucTask0++;}}/**用戶實(shí)現(xiàn)時鐘節(jié)拍中斷服務(wù)函數(shù),*并調(diào)用tnOsTimeTick()。*/voidtimer0ISR(void)__interrupt1{tnOsTimeTick();}/**1.初始化系統(tǒng)*2.創(chuàng)建任務(wù)*3.啟動系統(tǒng)*/void

main(void){tnOsInit();tnOsTaskCreate(task0,__GucTaskStks[0];tnOsTaskCreate(task1,__GucTaskStk[1]);tnOsStart();}資源配置與示例任務(wù)函數(shù)task0()和task1()時鐘節(jié)拍中斷服務(wù)函數(shù)timer0ISR()main函數(shù)main()staticidataunsignedchar__GucTaskStk[2][32];staticunsignedchar__GucTask0;staticunsignedchar__GucTask1;//分配任務(wù)堆棧//任務(wù)0測試變量//任務(wù)1測試變量全局變量定義函數(shù)實(shí)現(xiàn)voidtask0(void)/*/*資源配置與示例任務(wù)目錄3任務(wù)控制塊45內(nèi)部變量初始化創(chuàng)建任務(wù)12概述整體規(guī)劃目錄3任務(wù)控制塊45內(nèi)部變量初始化創(chuàng)建任務(wù)任務(wù)控制塊

TinyOS51V1.1增加了延時服務(wù)功能,因此,在TCB中增加了一個記錄時間的成員uiTicks。#define__TN_TASK_FLG_DEL

0x00

//任務(wù)被刪除#define__TN_TASK_FLG_RDY0x01

//任務(wù)就緒#define__TN_TASK_FLG_DLY0x02

//任務(wù)延時structtn_os_tcb{jmp_bufjbTaskContext;

//任務(wù)上下文unsignedcharucTaskStat;

//任務(wù)狀態(tài)unsignedintuiTicks;

//任務(wù)延時時間};typedefstructtn_os_tcbTN_OS_TCB;staticdataTN_OS_TCB__GtcbTasks[TN_OS_MAX_TASKS];

//任務(wù)控制塊數(shù)組與任務(wù)控制塊相關(guān)代碼:任務(wù)控制塊TinyOS51V1.1增加了延目錄4內(nèi)部變量初始化56創(chuàng)建任務(wù)啟動多任務(wù)環(huán)境23整體規(guī)劃任務(wù)控制塊目錄4內(nèi)部變量初始化56創(chuàng)建任務(wù)啟動多任務(wù)環(huán)tnOsInit()voidtnOsInit(void){TN_OS_TASK_HANDLEthTask;

//操作的任務(wù)for(thTask=0;thTask<TN_OS_MAX_TASKS;thTask++){__GtcbTasks[thTask].ucTaskStat=__TN_TASK_FLG_DEL;

//任務(wù)初始處于刪除狀態(tài)

__GtcbTasks[thTask].uiTicks=0;

//設(shè)置初值}

__GthTaskCur=0;

//初始運(yùn)行0號任務(wù)}由于TCB增加了一個uiTicks,則在tnOsInit()中進(jìn)行初始化。OS初始化函數(shù)代碼:tnOsInit()voidtnOsInit(voi目錄5創(chuàng)建任務(wù)67啟動多任務(wù)環(huán)境任務(wù)調(diào)度34任務(wù)控制塊內(nèi)部變量初始化目錄5創(chuàng)建任務(wù)67啟動多任務(wù)環(huán)境任務(wù)調(diào)度34通常,為了提高可移植性,采用一個宏或函數(shù)來編寫實(shí)現(xiàn)開中斷和關(guān)中斷程序。由于TinyOS51僅適合80C51系列單片機(jī),故直接使用“EA=0”和“EA=1”。創(chuàng)建任務(wù)函數(shù)tnOsTaskCreate()由于tnOsTaskCreate()要操作TCB,而時鐘節(jié)拍中斷中也要操作TCB,因此tnOsTaskCreate()中操作TCB的代碼為臨界區(qū)代碼,要避免被時鐘節(jié)拍中斷打斷。

TinyOS51中采用開/關(guān)中斷的方式解決此問題。TN_OS_TASK_HANDLEtnOsTaskCreate(void(*pfuncTask)(void), idataunsginedchar*pucStk){TN_OS_TASK_HANDLEthRt;for(thRt=0;thRt<TN_OS_MAX_TASKS;thRt++){

EA=0;

//禁止中斷 if(__GtcbTasks[thRt].ucTaskStat==__TN_TASK_FLG_DEL){

setTaskJmp(pfuncTask,pucStk,__GtcbTasks[thRt].jbTaskContext);__GtcbTask[thRt].ucTaskStat=__TN_TASK_FLG_RDY;

EA=1;

//允許中斷 returnthRt; }

EA=1;

//允許中斷}通常,為了提高可移植性,采用一個宏或函數(shù)來編目錄6啟動多任務(wù)環(huán)境78任務(wù)調(diào)度時鐘節(jié)拍中斷45內(nèi)部變量初始化創(chuàng)建任務(wù)目錄6啟動多任務(wù)環(huán)境78任務(wù)調(diào)度時鐘節(jié)拍中斷tnOsStart()

在TinyOS51V1.1中,如果不允許中斷,則時鐘節(jié)拍中斷服務(wù)程序不會運(yùn)行,因此,在tnOsStart()中增加允許中斷的代碼。voidtnOsStart(void){ EA=1;

//允許中斷 longjmp(__GtcbTask[0].jbTaskContext);

//執(zhí)行0號任務(wù)}tnOsInit()中__GthTaskCur

=

0,即當(dāng)前運(yùn)行任務(wù)為0號任務(wù)。

tnOsStart()在TinyOS51V目錄7任務(wù)調(diào)度89時鐘節(jié)拍中斷l(xiāng)ongjmpInIsr()

56創(chuàng)建任務(wù)啟動多任務(wù)環(huán)境目錄7任務(wù)調(diào)度89時鐘節(jié)拍中斷l(xiāng)ongjmp__tnOsSched()tnOsSched()開/關(guān)中斷代碼__tnOsSched()TinyOS51

V1.0

TinyOS51

V1.1

任務(wù)調(diào)度函數(shù)__tnOsSched()中也要操作TCB,因此也需要加入開/關(guān)中斷代碼包含臨界區(qū)。另外,__tnOsSched()不再提供給任務(wù)直接調(diào)用,僅供內(nèi)部調(diào)用,因此添加前綴“__”。保護(hù)臨界資源__tnOsSched()tnOsSched()開/關(guān)目錄8時鐘節(jié)拍中斷9longjmpInIsr()

任務(wù)延時67啟動多任務(wù)環(huán)境任務(wù)調(diào)度10目錄8時鐘節(jié)拍中斷9longjmpInIsr(如果uiTicks不為0,則uiTicks--,即縮短延時時間。未使用任務(wù)狀態(tài)標(biāo)志判斷任務(wù)是否處于延時狀態(tài)。這是因?yàn)門inyOS51更高的版本具有超時功能,需要使用uiTicks來判斷任務(wù)是否超時。如果uiTicks為0,則將任務(wù)設(shè)置為就緒狀態(tài)。為了向上兼容超時代碼,即區(qū)分系統(tǒng)服務(wù)是正常返回還是超時返回,未直接將任務(wù)設(shè)置為就緒狀態(tài),而使用“|=”操作。時鐘節(jié)拍中斷大多數(shù)操作系統(tǒng)中的延時管理和中斷服務(wù)程序中的任務(wù)切換功能,分別是用兩個函數(shù)實(shí)現(xiàn)的,由于TinyOS51

V1.1是純粹的時間片輪詢操作系統(tǒng),非時鐘節(jié)拍中斷的中斷服務(wù)程序不進(jìn)行任務(wù)切換操作,因此將二者合二為一。for(thTask=0;thTask<TN_OS_MAX_TASKS;thTask++){ if(__GtcbTasks[thTask].uiTicks!=0){ __GtcbTasks[thTask].uiTicks--;//縮短延時時間 if(__GtcbTasks[thTask].uiTicks==0){ __GtcbTasks[thTask].ucTaskStat

|=__TN_TASK_FLG_RDY;

//設(shè)置任務(wù)就緒狀態(tài)位 } }}}延時管理1任務(wù)切換2如果uiTicks不為0,則uiTicks--,即縮短延時時對于80C51來說,規(guī)定:一般函數(shù)返回使用RET指令,而中斷返回使用RETI指令。由于longjmp()函數(shù)是使用RET指令返回的,如果在時鐘節(jié)拍中斷中繼線使用longjmp(),則任務(wù)切換后CPU會認(rèn)為中斷仍未退出,同級中斷(包括自身)將被屏蔽,從而造成整個系統(tǒng)執(zhí)行錯誤。因此必須將longjmp()函數(shù)改為longjmpInIsr()。時鐘節(jié)拍中斷大多數(shù)操作系統(tǒng)中的延時管理和中斷服務(wù)程序中的任務(wù)切換功能,分別是用兩個函數(shù)實(shí)現(xiàn)的,由于TinyOS51

V1.1是純粹的時間片輪詢操作系統(tǒng),非時鐘節(jié)拍中斷的中斷服務(wù)程序不進(jìn)行任務(wù)切換操作,因此將二者合二為一。for(thTask=0;thTask<TN_OS_MAX_TASKS;thTask++){thTmp2++;if(thTmp2>=TN_OS_MAX_TASKS){thTmp2=0;}if((__GtcbTasks[thTmp2].ucTaskStat&__TN_TASK_FLG_RDY)!=0){cTmp1=setjump(__GtcbTask[__GthTaskCur].jbTaskContext);//保持上下文if(cTmep1==0){__GthTaskCur=thTmp2;longjmpInIsr(__GtcbTasks[thTmp2].jbTaskContext);//中斷中切換上下文}}}延時管理1任務(wù)切換2對于80C51來說,規(guī)定:一般函數(shù)返回使用R目錄9longjmpInIsr()

任務(wù)延時刪除任務(wù)78任務(wù)調(diào)度時鐘節(jié)拍中斷1110目錄9longjmpInIsr()任務(wù)延時刪中斷中切換任務(wù)

在中斷中切換任務(wù),不能再使用longjmp(),因?yàn)橹袛嘈枰褂脤S梅祷刂噶頡ETI,非RET指令。charlongjmpInIsr(jmp_bufBuf)__naked{unsignedcharucSpSave;//用于保存堆棧指針的變量dataunsignedchar*pucBuf=(datavoid*)0;//指向上下文信息存儲位置的指針pucBuf=(dataunsignedchar*)jbBuf;ucSpSave=*pucBuf++;bp=*pucBuf++;*((dataunsignedchar*)((char)(ucSpSave)))=*pucBuf++;*((dataunsignedchar*)((char)(ucSpSave–1)))=*pucBuf;SP=ucSpSave;DPL=1;_asmRETI_endasm;}將DPL設(shè)置為1,使返回值為1。因?yàn)镾DCC51規(guī)定:char類型返回值保存在DPL中。采用__naked修飾,表示此函數(shù)是無保護(hù)的,即編譯器不會生成此函數(shù)的起始和結(jié)尾代碼。使用者將完全控制這個過程,這里用于加入RETI指令。中斷中切換任務(wù)在中斷中切換任務(wù),不能再使用lo目錄任務(wù)延時刪除任務(wù)78時鐘節(jié)拍中斷l(xiāng)ongjmpInIsr()

1110目錄任務(wù)延時刪除任務(wù)78時鐘節(jié)拍中斷l(xiāng)on任務(wù)延時函數(shù)tnOsTimeDly()voiddelay(unsignedintuiDly){unsignedinti,

j;for(i=0;i<uiDly;i++){ for(j=0;j<1000;j++){ }}}CPU處于空轉(zhuǎn)狀態(tài),效率太低。傳統(tǒng)延時voidtnOsTimeDly(unsignedintuiTick){if(uiTick!=0){ EA=0; __GtcbTasks[__GthTaskCur].ucTaskStat

=__TN_TASK_FLG_DLY; __GtcbTasks[__GthTaskCur].uiTick=uiTick; EA=1;}__tnOsSched();__GtcbTasks[__GthTaskCur].ucTaskStat

=__TN_TASK_FLG_RDY;

//延時結(jié)束}任務(wù)延時切換到其他任務(wù)運(yùn)行設(shè)置延時時間,讓時鐘節(jié)拍處理函數(shù)tnOsTimeTick()更新剩余的延時時間。任務(wù)延時函數(shù)tnOsTimeDly()voiddela目錄刪除任務(wù)任務(wù)延時78時鐘節(jié)拍中斷l(xiāng)ongjmpInIsr()

1011目錄刪除任務(wù)任務(wù)延時78時鐘節(jié)拍中斷l(xiāng)on刪除任務(wù)函數(shù)tnOsTaskDel()與V1.0版本相比,TinyOS51V1.1版本在tnOsTaskDel()函數(shù)中增加了初始化uiTicks和開/關(guān)中斷代碼。voidtnOsTaskDel(TN_OS_TASK_HANDLEthTask){…….EA=0;__GtcbTasks[thTask].ucTaskStat=__TN_TASK_FLG_DEL;

__GtcbTasks[thTask].uiTicks=0;EA=1;if(thTask==__GthTaskCur){ __tnOsSched();}}刪除任務(wù)函數(shù)tnOsTaskDel()與V5.4時間片輪詢多任務(wù)操作系統(tǒng)5.4時間片輪詢多任務(wù)操作系統(tǒng)目錄1概述2整體規(guī)劃3任務(wù)控制塊4內(nèi)部變量初始化5創(chuàng)建任務(wù)6啟動多任務(wù)環(huán)境longjmpInIsr()

9任務(wù)調(diào)度7時鐘節(jié)拍中斷8任務(wù)延時10刪除任務(wù)11目錄1概述2整體規(guī)劃3任務(wù)控制塊4內(nèi)部變運(yùn)行的任務(wù)難以得知其他任務(wù)狀態(tài),任務(wù)切換時機(jī)難以把握。如果一個任務(wù)死掉,勢必造成整個系統(tǒng)死掉。協(xié)作式多任務(wù)系統(tǒng)任務(wù)協(xié)作式多任務(wù)系統(tǒng)的特點(diǎn)安全性復(fù)雜性協(xié)作式多任務(wù)系統(tǒng)中,任務(wù)切換需正在運(yùn)行的任務(wù)主動讓出CPU,這不僅帶來一些安全隱患,而且使程序設(shè)計(jì)相當(dāng)?shù)膹?fù)雜。任務(wù)調(diào)度任務(wù)調(diào)度交給操作系統(tǒng),引入調(diào)度算法運(yùn)行的任務(wù)難以得知其他任務(wù)狀態(tài),任務(wù)切換時機(jī)難以把握。如果一調(diào)度算法時間片輪詢1優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢3調(diào)度算法時間片輪詢1優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢調(diào)度算法時間片輪詢1tt任務(wù)的運(yùn)行時間時間片輪詢系統(tǒng)中任務(wù)運(yùn)行情況在時間片輪詢操作系統(tǒng)中,CPU的執(zhí)行時間被劃分為若干時間片,然后讓處于就緒狀態(tài)的任務(wù),按順序輪流占用CPU。當(dāng)時間片用完時,即使任務(wù)未執(zhí)行完,系統(tǒng)也剝奪此任務(wù)的CPU使用權(quán)力。時間片長度Δt一般為1~10ms

優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢3任務(wù)A

任務(wù)B任務(wù)C

所有任務(wù)相同對待,分時運(yùn)行。調(diào)度算法時間片輪詢1tt任務(wù)的運(yùn)行時間時間片輪詢系調(diào)度算法時間片輪詢1優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢3+

低優(yōu)先級+

中優(yōu)先級+

高優(yōu)先級任務(wù)A

任務(wù)B任務(wù)C

t高優(yōu)先級任務(wù)先運(yùn)行t高優(yōu)先級任務(wù)搶占低優(yōu)先級任務(wù)不同任務(wù)不同對待,優(yōu)先級高任務(wù)的先運(yùn)行。調(diào)度算法時間片輪詢1優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢調(diào)度算法時間片輪詢1優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢3這種調(diào)度算法情況較復(fù)雜,類型較多,自己去學(xué)習(xí)了解。調(diào)度算法時間片輪詢1優(yōu)先級調(diào)度2帶優(yōu)先級調(diào)度的時間片輪詢?nèi)蝿?wù)切換時機(jī)分配給任務(wù)的時間片已到任務(wù)主動請求調(diào)度12任務(wù)在調(diào)用操作系統(tǒng)提供的“管理”類服務(wù)(如刪除任務(wù)等)和“等待”類服務(wù)(如延時、獲取信號量、等待消息等)時,會主動請求調(diào)度。操作系統(tǒng)采用一個周期性的中斷來管理時間片,在這個中斷服務(wù)函數(shù)中,判斷運(yùn)行的任務(wù)是否用完了時間片。中斷中切換任務(wù)使用時間片輪詢調(diào)度的操作系統(tǒng)中,會在兩種下進(jìn)行任務(wù)切換。任務(wù)切換時機(jī)分配給任務(wù)的時間片已到任務(wù)主動請求調(diào)度12目錄2整體規(guī)劃1概述34任務(wù)控制塊內(nèi)部變量初始化目錄2整體規(guī)劃1概述34任務(wù)控制塊內(nèi)部變時間片輪詢操作系統(tǒng)規(guī)劃時間片輪詢調(diào)度算法時間片輪詢多任務(wù)操作系統(tǒng)協(xié)作式多任務(wù)系統(tǒng)TinyOS51V1.0TinyOS51V1.1

TinyOS51V1.1采用最簡單的時間片輪詢調(diào)度算法,在每個時鐘節(jié)拍中斷時調(diào)度,即分配給任務(wù)的時間片為一個時鐘節(jié)拍。

這樣,在任務(wù)控制塊中不僅不需要保存時鐘任務(wù)剩余的時鐘節(jié)拍,而且也不必編寫計(jì)算任務(wù)的剩余時間和設(shè)置任務(wù)時間片的代碼。時間片輪詢操作系統(tǒng)規(guī)劃時間片輪詢調(diào)度算法時間片輪詢多任務(wù)協(xié)TinyOS51從V1.0到V1.1的改變TinyOS51V1.0TinyOS51v1.1任務(wù)調(diào)度函數(shù)tnOsSched()__tnOsSched()任務(wù)延時函數(shù)無tnOsTimeDly()時鐘節(jié)拍處理函數(shù)無tnOsTimeTick()TinyOS51V1.0和TinyOS51V1.1的API不同點(diǎn)提供操作系統(tǒng)的一種基本服務(wù)——延時服務(wù),延時以時鐘節(jié)拍為單位。在TinyOS51中,時鐘節(jié)拍中斷由用戶實(shí)現(xiàn),在時鐘節(jié)拍中斷處理函數(shù)中調(diào)用tnOsTimeTick()。TinyOS51從V1.0到V1.1的改變TinyOS51voidtask0(void){TMOD=(TMOD&0xF0)|0x01;TL0=0x00;//TH0=0x00;//初始化timer0,即TR0=1;//初始化時鐘節(jié)拍ET0=1;//中斷。TF0=0;//while(1){__GucTask0++;}}/**一個簡單的任務(wù),無限循環(huán)中讓*__GucTask0++。*/voidtask1(void){while(1){__GucTask0++;}}/**用戶實(shí)現(xiàn)時鐘節(jié)拍中斷服務(wù)函數(shù),*并調(diào)用tnOsTimeTick()。*/voidtimer0ISR(void)__interrupt1{tnOsTimeTick();}/**1.初始化系統(tǒng)*2.創(chuàng)建任務(wù)*3.啟動系統(tǒng)*/void

main(void){tnOsInit();tnOsTaskCreate(task0,__GucTaskStks[0];tnOsTaskCreate(task1,__GucTaskStk[1]);tnOsStart();}資源配置與示例任務(wù)函數(shù)task0()和task1()時鐘節(jié)拍中斷服務(wù)函數(shù)timer0ISR()main函數(shù)main()staticidataunsignedchar__GucTaskStk[2][32];staticunsignedchar__GucTask0;staticunsignedchar__GucTask1;//分配任務(wù)堆棧//任務(wù)0測試變量//任務(wù)1測試變量全局變量定義函數(shù)實(shí)現(xiàn)voidtask0(void)/*/*資源配置與示例任務(wù)目錄3任務(wù)控制塊45內(nèi)部變量初始化創(chuàng)建任務(wù)12概述整體規(guī)劃目錄3任務(wù)控制塊45內(nèi)部變量初始化創(chuàng)建任務(wù)任務(wù)控制塊

TinyOS51V1.1增加了延時服務(wù)功能,因此,在TCB中增加了一個記錄時間的成員uiTicks。#define__TN_TASK_FLG_DEL

0x00

//任務(wù)被刪除#define__TN_TASK_FLG_RDY0x01

//任務(wù)就緒#define__TN_TASK_FLG_DLY0x02

//任務(wù)延時structtn_os_tcb{jmp_bufjbTaskContext;

//任務(wù)上下文unsignedcharucTaskStat;

//任務(wù)狀態(tài)unsignedintuiTicks;

//任務(wù)延時時間};typedefstructtn_os_tcbTN_OS_TCB;staticdataTN_OS_TCB__GtcbTasks[TN_OS_MAX_TASKS];

//任務(wù)控制塊數(shù)組與任務(wù)控制塊相關(guān)代碼:任務(wù)控制塊TinyOS51V1.1增加了延目錄4內(nèi)部變量初始化56創(chuàng)建任務(wù)啟動多任務(wù)環(huán)境23整體規(guī)劃任務(wù)控制塊目錄4內(nèi)部變量初始化56創(chuàng)建任務(wù)啟動多任務(wù)環(huán)tnOsInit()voidtnOsInit(void){TN_OS_TASK_HANDLEthTask;

//操作的任務(wù)for(thTask=0;thTask<TN_OS_MAX_TASKS;thTask++){__GtcbTasks[thTask].ucTaskStat=__TN_TASK_FLG_DEL;

//任務(wù)初始處于刪除狀態(tài)

__GtcbTasks[thTask].uiTicks=0;

//設(shè)置初值}

__GthTaskCur=0;

//初始運(yùn)行0號任務(wù)}由于TCB增加了一個uiTicks,則在tnOsInit()中進(jìn)行初始化。OS初始化函數(shù)代碼:tnOsInit()voidtnOsInit(voi目錄5創(chuàng)建任務(wù)67啟動多任務(wù)環(huán)境任務(wù)調(diào)度34任務(wù)控制塊內(nèi)部變量初始化目錄5創(chuàng)建任務(wù)67啟動多任務(wù)環(huán)境任務(wù)調(diào)度34通常,為了提高可移植性,采用一個宏或函數(shù)來編寫實(shí)現(xiàn)開中斷和關(guān)中斷程序。由于TinyOS51僅適合80C51系列單片機(jī),故直接使用“EA=0”和“EA=1”。創(chuàng)建任務(wù)函數(shù)tnOsTaskCreate()由于tnOsTaskCreate()要操作TCB,而時鐘節(jié)拍中斷中也要操作TCB,因此tnOsTaskCreate()中操作TCB的代碼為臨界區(qū)代碼,要避免被時鐘節(jié)拍中斷打斷。

TinyOS51中采用開/關(guān)中斷的方式解決此問題。TN_OS_TASK_HANDLEtnOsTaskCreate(void(*pfuncTask)(void), idataunsginedchar*pucStk){TN_OS_TASK_HANDLEthRt;for(thRt=0;thRt<TN_OS_MAX_TASKS;thRt++){

EA=0;

//禁止中斷 if(__GtcbTasks[thRt].ucTaskStat==__TN_TASK_FLG_DEL){

setTaskJmp(pfuncTask,pucStk,__GtcbTasks[thRt].jbTaskContext);__GtcbTask[thRt].ucTaskStat=__TN_TASK_FLG_RDY;

EA=1;

//允許中斷 returnthRt; }

EA=1;

//允許中斷}通常,為了提高可移植性,采用一個宏或函數(shù)來編目錄6啟動多任務(wù)環(huán)境78任務(wù)調(diào)度時鐘節(jié)拍中斷45內(nèi)部變量初始化創(chuàng)建任務(wù)目錄6啟動多任務(wù)環(huán)境78任務(wù)調(diào)度時鐘節(jié)拍中斷tnOsStart()

在TinyOS51V1.1中,如果不允許中斷,則時鐘節(jié)拍中斷服務(wù)程序不會運(yùn)行,因此,在tnOsStart()中增加允許中斷的代碼。voidtnOsStart(void){ EA=1;

//允許中斷 longjmp(__GtcbTask[0].jbTaskContext);

//執(zhí)行0號任務(wù)}tnOsInit()中__GthTaskCur

=

0,即當(dāng)前運(yùn)行任務(wù)為0號任務(wù)。

tnOsStart()在TinyOS51V目錄7任務(wù)調(diào)度89時鐘節(jié)拍中斷l(xiāng)ongjmpInIsr()

56創(chuàng)建任務(wù)啟動多任務(wù)環(huán)境目錄7任務(wù)調(diào)度89時鐘節(jié)拍中斷l(xiāng)ongjmp__tnOsSched()tnOsSched()開/關(guān)中斷代碼__tnOsSched()TinyOS51

V1.0

TinyOS51

V1.1

任務(wù)調(diào)度函數(shù)__tnOsSched()中也要操作TCB,因此也需要加入開/關(guān)中斷代碼包含臨界區(qū)。另外,__tnOsSched()不再提供給任務(wù)直接調(diào)用,僅供內(nèi)部調(diào)用,因此添加前綴“__”。保護(hù)臨界資源__tnOsSched()tnOsSched()開/關(guān)目錄8時鐘節(jié)拍中斷9longjmpInIsr()

任務(wù)延時67啟動多任務(wù)環(huán)境任務(wù)調(diào)度10目錄8時鐘節(jié)拍中斷9longjmpInIsr(如果uiTicks不為0,則uiTicks--,即縮短延時時間。未使用任務(wù)狀態(tài)標(biāo)志判斷任務(wù)是否處于延時狀態(tài)。這是因?yàn)門inyOS51更高的版本具有超時功能,需要使用uiTicks來判斷任務(wù)是否超時。如果uiTicks為0,則將任務(wù)設(shè)置為就緒狀態(tài)。為了向上兼容超時代碼,即區(qū)分系統(tǒng)服務(wù)是正常返回還是超時返回,未直接將任務(wù)設(shè)置為就緒狀態(tài),而使用“|=”操作。時鐘節(jié)拍中斷大多數(shù)操作系統(tǒng)中的延時管理和中斷服務(wù)程序中的任務(wù)切換功能,分別是用兩個函數(shù)實(shí)現(xiàn)的,由于TinyOS51

V1.1是純粹的時間片輪詢操作系統(tǒng),非時鐘節(jié)拍中斷的中斷服務(wù)程序不進(jìn)行任務(wù)切換操作,因此將二者合二為一。for(thTask=0;thTask<TN_OS_MAX_TASKS;thTask++){ if(__GtcbTasks[thTask].uiTicks!=0){ __GtcbTasks[thTask].uiTicks--;//縮短延時時間 if(__GtcbTasks[thTask].uiTicks==0){ __GtcbTasks[thTask].ucTaskStat

|=__TN_TASK_FLG_RDY;

//設(shè)置任務(wù)就緒狀態(tài)位 } }}}延時管理1任務(wù)切換2如果uiTicks不為0,則uiTicks--,即縮短延時時對于80C51來說,規(guī)定:一般函數(shù)返回使用RET指令,而中斷返回使用RETI指令。由于longjmp()函數(shù)是使用RET指令返回的,如果在時鐘節(jié)拍中斷中繼線使用longjmp(),則任務(wù)切換后CPU會認(rèn)為中斷仍未退出,同級中斷(包括自身)將被屏蔽,從而造成整個系統(tǒng)執(zhí)行錯誤。因此必須將longjmp()函數(shù)改為longjmpInIsr()。時鐘節(jié)拍中斷大多數(shù)操作系統(tǒng)中的延時管理和中斷服務(wù)程序中的任務(wù)切換功能,分別是用兩個函數(shù)實(shí)現(xiàn)的,由于TinyOS51

V1.1是純粹的時間片輪詢操作系統(tǒng),非時鐘節(jié)拍中斷的中斷服務(wù)程序不進(jìn)行任務(wù)切換操作,因此將二者合二為一。for(thTask=0;thTask<TN_OS_MAX_TASKS;thTask++){thTmp2++;if(thTmp2>=TN_OS_MAX_TASKS){thTmp2=0;}if((__GtcbTasks[thTmp2].ucTaskStat&__TN_TASK_FLG_RDY)!=0){cTmp1=setjump(__GtcbTask[__GthTaskCur].jbTaskContext);//保持上下文if(cTmep1==0){__GthTaskCur=thTmp2;longjmpInIsr(__GtcbTasks[thTmp2].jbTaskContext);//中斷中切換上下文}}}延時管理1任務(wù)切換2對于80C51來說,規(guī)定:一般函數(shù)返回使用R目錄9longjmpInIsr()

任務(wù)延時刪除任務(wù)78任務(wù)調(diào)度時鐘節(jié)拍中斷1110目錄9longjmpInIsr()任務(wù)延時刪中斷中切換任務(wù)

在中斷中切換任務(wù),不能再使用

溫馨提示

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

評論

0/150

提交評論