時間片輪詢多任務操作系統_第1頁
時間片輪詢多任務操作系統_第2頁
時間片輪詢多任務操作系統_第3頁
時間片輪詢多任務操作系統_第4頁
時間片輪詢多任務操作系統_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

任務B任務C

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

低優(yōu)先級+

中優(yōu)先級+

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

任務B任務C

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

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

這樣,在任務控制塊中不僅不需要保存時鐘任務剩余的時鐘節(jié)拍,而且也不必編寫計算任務的剩余時間和設置任務時間片的代碼。TinyOS51從V1.0到V1.1的改變變TinyOS51V1.0TinyOS51v1.1任務調度函數tnOsSched()__tnOsSched()任務延時函數無tnOsTimeDly()時鐘節(jié)拍處理函數無tnOsTimeTick()TinyOS51V1.0和TinyOS51V1.1的API不同點提供操作系統統的一種基本本服務——延時服務,延延時以時鐘節(jié)節(jié)拍為單位。。在TinyOS51中,時鐘節(jié)拍拍中斷由用戶戶實現,在時時鐘節(jié)拍中斷斷處理函數中中調用tnOsTimeTick()。voidtask0(void){TMOD=(TMOD&0xF0)|0x01;TL0=0x00;//TH0=0x00;//初始化timer0,即TR0=1;//初始化時鐘節(jié)節(jié)拍ET0=1;//中斷。TF0=0;//while(1){__GucTask0++;}}/**一個簡單的任任務,無限循循環(huán)中讓*__GucTask0++。*/voidtask1(void){while(1){__GucTask0++;}}/**用戶實現時鐘鐘節(jié)拍中斷服服務函數,*并調用tnOsTimeTick()。*/voidtimer0ISR(void)__interrupt1{tnOsTimeTick();}/**1.初始化系統*2.創(chuàng)建任務*3.啟動系統*/voidmain(void){tnOsInit();tnOsTaskCreate(task0,__GucTaskStks[0];tnOsTaskCreate(task1,__GucTaskStk[1]);tnOsStart();}資源配置與示示例任務函數task0()和task1()時鐘節(jié)拍中斷斷服務函數timer0ISR()main函數main()staticidataunsignedchar__GucTaskStk[2][32];staticunsignedchar__GucTask0;staticunsignedchar__GucTask1;//分配任務堆棧棧//任務0測試變量//任務1測試變量全局局變變量量定定義義函數數實實現現目錄錄3任務務控控制制塊塊45內部部變變量量初初始始化化創(chuàng)建建任任務務12概述述整體體規(guī)規(guī)劃劃任務務控控制制塊塊TinyOS51V1.1增加加了了延延時時服服務務功功能能,,因因此此,,在在TCB中增增加加了了一一個個記記錄錄時時間間的的成成員員uiTicks。#define__TN_TASK_FLG_DEL0x00//任務務被被刪刪除除#define__TN_TASK_FLG_RDY0x01//任務務就就緒緒#define__TN_TASK_FLG_DLY0x02//任務務延延時時structtn_os_tcb{jmp_bufjbTaskContext;//任務務上上下下文文unsignedcharucTaskStat;//任務務狀狀態(tài)態(tài)unsignedintuiTicks;//任務務延延時時時時間間};typedefstructtn_os_tcbTN_OS_TCB;staticdataTN_OS_TCB__GtcbTasks[TN_OS_MAX_TASKS];//任務務控控制制塊塊數數組組與任任務務控控制制塊塊相相關關代代碼碼::目錄錄4內部部變變量量初初始始化化56創(chuàng)建建任任務務啟動動多多任任務務環(huán)環(huán)境境23整體體規(guī)規(guī)劃劃任務務控控制制塊塊tnOsInit()voidtnOsInit(void){TN_OS_TASK_HANDLEthTask;//操作的任務務for(thTask=0;thTask<TN_OS_MAX_TASKS;thTask++){__GtcbTasks[thTask].ucTaskStat=__TN_TASK_FLG_DEL;//任務初始處處于刪除狀狀態(tài)__GtcbTasks[thTask].uiTicks=0;//設置初值}__GthTaskCur=0;//初始運行0號任務}由于TCB增加了一個個uiTicks,則在tnOsInit()中進行初始始化。OS初始化函數數代碼:目錄錄5創(chuàng)建任務67啟動多任務務環(huán)境任務調度34任務控制塊塊內部變量初初始化通常,為了了提高可移移植性,采采用一個宏宏或函數來來編寫實現現開中斷和和關中斷程程序。由于于TinyOS51僅適合80C51系列單片機機,故直接接使用“EA=0”和“EA=1”。創(chuàng)建任務函函數tnOsTaskCreate()由于tnOsTaskCreate()要操作TCB,而時鐘節(jié)節(jié)拍中斷中中也要操作作TCB,因此tnOsTaskCreate()中操作TCB的代碼為臨臨界區(qū)代碼碼,要避免免被時鐘節(jié)節(jié)拍中斷打打斷。TinyOS51中采用開/關中斷的方式解決決此問題。。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;//允許中斷}目錄錄6啟動多任務務環(huán)境78任務調度時鐘節(jié)拍中中斷45內部變量初初始化創(chuàng)建任務tnOsStart()在TinyOS51V1.1中,如果不不允許中斷斷,則時鐘鐘節(jié)拍中斷斷服務程序序不會運行行,因此,,在tnOsStart()中增加允許許中斷的代代碼。voidtnOsStart(void){EA=1;//允許中斷l(xiāng)ongjmp(__GtcbTask[0].jbTaskContext);//執(zhí)行0號任務}tnOsInit()中__GthTaskCur=0,即當前運行行任務為0號任務。目錄錄7任務調度89時鐘節(jié)拍中中斷l(xiāng)ongjmpInIsr()56創(chuàng)建任務啟動多任務務環(huán)境__tnOsSched()tnOsSched()開/關中斷代碼碼__tnOsSched()TinyOS51V1.0TinyOS51V1.1任務調度函函數__tnOsSched()中也要操作作TCB,因此也需需要加入開開/關中斷代代碼包含含臨界區(qū)區(qū)。另外外,__tnOsSched()不再提供供給任務務直接調調用,僅僅供內部部調用,,因此添添加前綴綴“__”。保護臨界界資源目錄錄8時鐘節(jié)拍拍中斷9longjmpInIsr()任務延時時67啟動多任任務環(huán)境境任務調度度10如果uiTicks不為0,則uiTicks--,即縮短短延時時時間。未未使用任任務狀態(tài)態(tài)標志判判斷任務務是否處處于延時時狀態(tài)。。這是因因為TinyOS51更高的版版本具有有超時功功能,需需要使用用uiTicks來判斷任任務是否否超時。。如果uiTicks為0,則將任任務設置置為就緒緒狀態(tài)。。為了向向上兼容容超時代代碼,即即區(qū)分系系統服務務是正常常返回還還是超時時返回,,未直接接將任務務設置為為就緒狀狀態(tài),而而使用““|=”操作。。時鐘節(jié)拍拍中斷大多數操操作系統統中的延延時管理理和中斷斷服務程程序中的的任務切切換功能能,分別別是用兩兩個函數數實現的的,由于于TinyOS51V1.1是純粹的的時間片片輪詢操操作系統統,非時時鐘節(jié)拍拍中斷的的中斷服服務程序序不進行行任務切切換操作作,因此此將二者者合二為為一。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;//設置任務務就緒狀狀態(tài)位}}}}延時管理理1任務切換換2對于80C51來說,規(guī)規(guī)定:一一般函數數返回使使用RET指令,而而中斷返返回使用用RETI指令。由由于longjmp()函數是使使用RET指令返回回的,如如果在時時鐘節(jié)拍拍中斷中中繼線使使用longjmp(),則任務務切換后后CPU會認為中中斷仍未未退出,,同級中中斷(包包括自身身)將被被屏蔽,,從而造造成整個個系統執(zhí)執(zhí)行錯誤誤。因此此必須將將longjmp()函數改為為longjmpInIsr()。時鐘節(jié)拍拍中斷大多數操操作系統統中的延延時管理理和中斷斷服務程程序中的的任務切切換功能能,分別別是用兩兩個函數數實現的的,由于于TinyOS51V1.1是純粹的的時間片片輪詢操操作系統統,非時時鐘節(jié)拍拍中斷的的中斷服服務程序序不進行行任務切切換操作作,因此此將二者者合二為為一。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任務切換換2目錄錄9longjmpInIsr()任務延時時刪除任務務78任務調度度時鐘節(jié)拍拍中斷1110中斷中切切換任務務在中斷中中切換任任務,不不能再使使用longjmp(),因為中中斷需要要使用專專用返回回指令RETI,非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設置為1,使返回回值為1。因為SDCC51規(guī)定:char類型返回回值保存存在DPL中。采用__naked修飾,表表示此函函數是無無保護的的,即編編譯器不不會生成成此函數數的起始始和結尾尾代碼。。使用者者將完全全控制這這個過程程,這里里用于加加入RETI指令令。。目錄錄任務務延延時時刪除除任任務務78時鐘鐘節(jié)節(jié)拍拍中中斷斷l(xiāng)ongjmpInIsr()1110任務務延延時時函函數數tnOsTimeDly()voiddelay(unsignedintuiDly){unsignedinti,

j;for(i=0;i<uiDly;i++){ for(j=0;j<1000;j++){ }}}CPU處于空轉狀態(tài),效率太低。傳統延時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é)節(jié)拍拍處處理理函函數數tnOsTimeTick()更新新剩剩余余的的延延時時時時間間。。目錄錄刪除除任任務務任務務延延時時78時鐘鐘節(jié)節(jié)拍拍中中斷斷l(xiāng)ongjmpInIsr()1011刪除除任任務務函函數數tnOsTaskDel()與V1.0版本本相相比比,,TinyOS51V1.1版本本在在tnOsTaskDel()函數數中中增增加加了了初初始始化化uiTicks和開開/關中中斷斷代代碼碼。。voidtnOsTaskDel(TN_OS_TASK_HANDLEthTask){……….EA=0;__GtcbTasks[thTask].ucTaskStat=__TN_TASK_FLG_DEL;__GtcbTasks[thTask].uiTicks=0;EA=1;if(thTask==__GthTaskCur){__tnOsSched();}}9、靜夜夜四無無鄰,,荒居居舊業(yè)業(yè)貧。。。1月-231月-23Sunday,January1,202310、雨雨中中黃黃葉葉樹樹,,燈燈下下白白頭頭人人。。。。20:31:0920:31:0920:311/1/20238:31:09PM11、以我我獨沈沈久,,愧君君相見見頻。。。1月-2320:31:0920:31Jan-2301-Jan-2312、故人江江海別,,幾度隔隔山川。。。20:31:0920:31:0920:31Sunday,January1,202313、乍見見翻疑疑夢,,相悲悲各問問年。。。1月-231月-2320:31:0920:31:09January1,202314、他鄉(xiāng)生白白發(fā),舊國國見青山。。。01一月月20238:31:09下下午20:31:091月-2315、比不了了得就不不比,得得不到的的就不要要。。。。一月238:31下午午1月-2320:31January1,202316、行動動出成成果,,工作作出財財富。。。2023/1/120:31:0920:31:0901January202317、做前,能夠夠環(huán)視四周;;做時,你只只能或者最好好沿著以腳為為起點的射線線向前。。8:31:09下午8:31下下午20:31:091月-239、沒沒有有失失敗敗,,只只有有暫暫時時停停止止成成功功??!。。1月月-231月月-23Sunday,January1,202310、很多多事情情努力力了未未必有有結果果,但但是不不努力力卻什什么改改變也也沒有有。。。20:31:0920:31:0920:311/1/20238:31:09PM11、成功就是日日復一日那一一點點小小努努力的積累。。。1月-2320:31:1020:31Jan-2301-Jan-2312、世間間成事事,不不求其其絕對對圓滿滿,留留一份份不足足,可可得無無限完完美。。。20:31:1020:31:1020:31Sunday,January1,202313、不不知知香香積積寺寺,,數數里里入入云云峰峰。。。。1月月-231月月-2320:31:1020:31:10January1,202314、意志堅堅強的人人能把世世界放在在手中像像泥塊一一樣任意意揉捏。。01一一月20238:31:10下午午20:31:101月-2315、楚塞塞三湘湘接,,荊門門九派派通。。。。。一月238:31下下午午1月-2320:31January1,202316、少年年十五五二十十時,,步行行奪得得胡馬馬騎。。。2023/1/120:31:1020:31:1001January202317、空山

溫馨提示

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

評論

0/150

提交評論