5.3協(xié)作式多任務(wù)操作系統(tǒng)_第1頁(yè)
5.3協(xié)作式多任務(wù)操作系統(tǒng)_第2頁(yè)
5.3協(xié)作式多任務(wù)操作系統(tǒng)_第3頁(yè)
5.3協(xié)作式多任務(wù)操作系統(tǒng)_第4頁(yè)
5.3協(xié)作式多任務(wù)操作系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、5.3 協(xié)作式多任務(wù)操作系統(tǒng) 目 錄整體規(guī)劃任務(wù)控制塊小結(jié)內(nèi)核API簡(jiǎn)介協(xié)作式多任務(wù)操作系統(tǒng)任務(wù)切換的時(shí)機(jī)完全取決于正在運(yùn)行的任務(wù);現(xiàn)代操作系統(tǒng)不再使用,適合于學(xué)習(xí)范例;下面介紹 TinyOS51 V1.0版 操作系統(tǒng)。 內(nèi)核 API TinyOS51 V1.0是完全用C語(yǔ)言編寫的協(xié)作式多任務(wù)操作系統(tǒng),它的內(nèi)核API(Application Interface Program:接口函數(shù))包括5個(gè)函數(shù)。TinyOS51tnOsTaskCreate() 任務(wù)創(chuàng)建tnOsTaskDel() 任務(wù)刪除tnOsSched() 任務(wù)切換 tnOsInit()系統(tǒng)初始化tnOsStart() 系統(tǒng)啟動(dòng)名 稱

2、 tnOsInit()函數(shù)原型void tnOsInit(void)tnOsInit()作用注意啟動(dòng)多任務(wù)環(huán)境,并執(zhí)行第一個(gè)任務(wù)必須在調(diào)用其他函數(shù)之前調(diào)用,并只能調(diào)用一次名 稱 tnOsStart()函數(shù)原型void tnOsStart (void)tnOsStart()作用注意初始化TinyOS51內(nèi)部變量調(diào)用此函數(shù)之前 必須創(chuàng)建至少一個(gè)任務(wù),該函數(shù)不能重復(fù)調(diào)用,且不返回名 稱 tnOsTaskCreate()函數(shù)原型TN_OS_TASK_HANDLE tnOsTaskCreate (void( * pfuncTask)(void), idata unsigned char *pucStk)

3、輸入?yún)?shù)pfuncTask:任務(wù)函數(shù);pucStk:堆棧位置,堆棧至少要16字節(jié)返回值thTask:任務(wù)句柄,如果其值為-1,則創(chuàng)建任務(wù)失敗tnOsTaskCreate()作用注意創(chuàng)建一個(gè)任務(wù),為任務(wù)創(chuàng)建資源(內(nèi)存)該函數(shù)可在調(diào)用tnOsInit()函數(shù)后任意時(shí)候調(diào)用,但在調(diào)用tnOsStart()函數(shù)之前必須調(diào)用一次名 稱 tnOsTaskDel()函數(shù)原型void tnOsTaskDel (TN_OS_TASK_HANDLE thTask)輸入?yún)?shù)thTask:任務(wù)句柄,如果其值為-1,則刪除任務(wù)自身tnOsTaskDel()作用注意刪除一個(gè)任務(wù),釋放刪除任務(wù)的資源(內(nèi)存)可以刪除其他任務(wù)

4、或自身名 稱 tnOsSched()函數(shù)原型void tnOsSched (void)tnOsSched()作用注意實(shí)現(xiàn)任務(wù)切換,執(zhí)行下一個(gè)任務(wù)必須在任務(wù)中調(diào)用,而且每個(gè)任務(wù)都必須周期性地調(diào)用它Task1任務(wù)堆棧Task2任務(wù)堆棧Task3任務(wù)堆棧Task0任務(wù)堆棧資源配置對(duì)最大任務(wù)數(shù)目沒(méi)有限制支持的任務(wù)數(shù)量無(wú)限TinyOS51單片機(jī)片內(nèi)idata空間有限1任務(wù)堆棧占用idata資源20 xFF0 x0051單片機(jī)idata空間256字節(jié)不能繼續(xù)分配任務(wù)堆棧支持的任務(wù)數(shù)量有限?TinyOS51支持的任務(wù)數(shù)Task1任務(wù)堆棧Task2任務(wù)堆棧Task3任務(wù)堆棧Task0任務(wù)堆棧0 xFF0 x0

5、0至少32字節(jié)空間Task1任務(wù)堆棧Task7任務(wù)堆棧Task0任務(wù)堆棧0 xFF0 x00.理論最大任務(wù)數(shù)量少于8個(gè)實(shí)際最大任務(wù)數(shù)以34個(gè)最為合適 R0R7 編譯器用到的空間 TinyOS51占用空間 用戶代碼占用空間協(xié)作式多任務(wù)操作系統(tǒng)運(yùn)行示例main.cstatic idata unsigned char _GucTaskStk232; / 分配任務(wù)堆static unsigned char _GucTask0;/ 任務(wù)0測(cè)試變量static unsigned char _GucTask1;/ 任務(wù)1測(cè)試變量void task0 (void) void task1 (void) void

6、 main (void) tnOsInit();/ 初始化系統(tǒng) tnOsTaskCreate(task0,_GucTaskStks0); / 創(chuàng)建任務(wù)0 tnOsTaskCreate(task1,_GucTaskStks1); / 創(chuàng)建任務(wù)1 tnOsStart();/ 啟動(dòng)任務(wù)全速運(yùn)行,在任務(wù)函數(shù)中設(shè)置斷點(diǎn),可以看到2個(gè)任務(wù)依次執(zhí)行 目 錄整體規(guī)劃任務(wù)控制塊小結(jié)內(nèi)核API操作系統(tǒng)任務(wù)任務(wù)的識(shí)別和TCB企業(yè)員工名字工號(hào)職稱TCB全稱是Task Control Block,即任務(wù)控制塊,它是一個(gè)結(jié)構(gòu)體數(shù)據(jù)結(jié)構(gòu),用于記錄各個(gè)任務(wù)的各種信息,包括任務(wù)堆棧指針、任務(wù)狀態(tài)、延時(shí)計(jì)數(shù)、等待事件指針等。堆棧

7、指針?lè)祷氐刂啡蝿?wù)狀態(tài)延時(shí)計(jì)數(shù) TCBRTOS和TinyOS51任務(wù)識(shí)別 RTOS使用TCB指針識(shí)別任務(wù),對(duì)于SDCC編譯器來(lái)說(shuō),指針變量占3個(gè)字節(jié)空間,當(dāng)任務(wù)較多時(shí),內(nèi)存開(kāi)銷大。RTOS(實(shí)時(shí)操作系統(tǒng))TCB1TCB2TCBnpTCB1pTCB2pTCBn指向TCB的指針TCB結(jié)構(gòu)體變量TinyOS51 TinyOS51使用TCB結(jié)構(gòu)體類型數(shù)組下標(biāo)來(lái)識(shí)別任務(wù),類型是無(wú)符號(hào)char型,僅占一個(gè)字節(jié)內(nèi)存空間,適合內(nèi)存資源緊張的51單片機(jī)TCB1TCB2TCBnHandleTCB結(jié)構(gòu)體類型數(shù)組數(shù)組下標(biāo),俗稱句柄 TCB的構(gòu)成任務(wù)塊結(jié)構(gòu)體_GtcbTasksxjbTaskContextucTaskSt

8、at TCB的類型是結(jié)構(gòu)體,對(duì)于V1.0版本的TinyOS51操作系統(tǒng),它主要由上下文信息和任務(wù)狀態(tài)字組成。上下文信息jmp_buf xaddr15addr8addr7addr0SPbpjbTaskContext是jmp_buf 數(shù)組類型變量,而jmp_buf 數(shù)組類型在中定義ucTaskStat 即任務(wù)狀態(tài)字,是char型變量,對(duì)于V1.0版本的TinyOS51,它有兩個(gè)值,如下宏定義所示:#define _TN_TASK_FLG_DEL 0 x00 / 任務(wù)被刪除#define _TN_TASK_FLG_RDY 0 x01 / 任務(wù)就緒上下文信息 任務(wù)狀態(tài)字 TCB的程序?qū)崿F(xiàn) tiny_o

9、s_51_core.c#define _TN_TASK_FLG_DEL 0 x00/ 任務(wù)被刪除#define _TN_TASK_FLG_RDY 0 x01/ 任務(wù)就緒struct tn_os_tcb jmp_buf jbTaskContext; / 用于存儲(chǔ)上下文信息 unsigned char ucTaskStat; / 任務(wù)狀態(tài)字;typedef struct tn_os_tck TN_OS_TCB; /TN_OS_TCB類型等效struct tn_os_tcb static data TN_OS_TCB _GtcbTasksTN_OS_MAX_TASK; / 任務(wù)控制塊的結(jié)構(gòu)體數(shù)組 目

10、 錄整體規(guī)劃任務(wù)控制塊小結(jié)內(nèi)核API 內(nèi)部變量初始化 TinyOS51開(kāi)始時(shí)沒(méi)有任務(wù)存在,所以必須將所有的任務(wù)控制塊初始化為一個(gè)“空白表”,即將任務(wù)初始化為“刪除狀態(tài)”。addr15addr8addr7addr0bpucTaskStatxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxSPTCB1TCB0 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxTCBnxxxxxxxxxxxxxxxxxxxxxxxx000000000000000000000000任務(wù)狀態(tài)字#define _TN_TASK_FL

11、G_DEL 0 x00 / 任務(wù)被刪除#define _TN_TASK_FLG_RDY 0 x01 / 任務(wù)就緒 內(nèi)部變量初始化程序tiny_os_51_core.cstatic data TN_OS_TASK_HANDLE _GthTaskCur; void thOsInit (void) TN_OS_TASK_HANDLE thTask; for (thTask = 0; thTask TN_OS_MAX_TASKS; thTask+) _GtcbTasksthTask.ucTaskStat = TN_TASK_FLG_DEL; _GthTaskCur = 0;/ 當(dāng)前任務(wù)句柄/ 初始化任

12、務(wù)控制塊/ 操作的任務(wù)/ 使任務(wù)處于刪除狀態(tài)/ 初始化任務(wù)號(hào)為0創(chuàng)建任務(wù) 在操作系統(tǒng)中,任何一個(gè)程序只有成為了任務(wù)才能在內(nèi)存中運(yùn)行,使用創(chuàng)建任務(wù)創(chuàng)建與之對(duì)應(yīng)的任務(wù)。開(kāi)始結(jié)束創(chuàng)建任務(wù)失敗是否有空閑任務(wù)控制塊保存上下文信息設(shè)置任務(wù)就緒狀態(tài)否是如果沒(méi)有空閑TCB則不能創(chuàng)建任務(wù)填充TCB的過(guò)程關(guān)于空閑任務(wù) 空閑任務(wù)是CPU閑置時(shí)候運(yùn)行的任務(wù),TinyOS51為了節(jié)省片內(nèi)RAM,決定使用調(diào)度器來(lái)完成空閑任務(wù)的工作。 創(chuàng)建任務(wù)中不需要?jiǎng)?chuàng)建空閑任務(wù)。 創(chuàng)建任務(wù)時(shí)TCB填充addr15addr8addr7addr0bpucTaskStatxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx00000

13、000SPTCB1TCB0 假設(shè)系統(tǒng)最大的任務(wù)數(shù)為2,系統(tǒng)剛完成初始化,現(xiàn)在要?jiǎng)?chuàng)建Task0,TCB的申請(qǐng)和填充過(guò)程是:CPUtnOsCreate(Task0Addr, pucStkTask0)Task0程序入口地址Task0堆棧指針TCB申請(qǐng):由于TCB0的狀態(tài)字為“刪除狀態(tài)”,所有將其分配給Task0 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxbppucStkTask0Task0Addr高8位Task0Addr低8位0000000100000000tnOsCreate(Task0Addr, pucStkTask0)TCB填充:包括bp,堆棧指針,函數(shù)入口地址以及設(shè)置任

14、務(wù)為“就緒狀態(tài)” 創(chuàng)建任務(wù)的程序?qū)崿F(xiàn)tiny_os_51_core.cTN_OS_TASK_HANDLE tnOsTaskCreate (void (*pfuncTask)(void), idata unsigned char *pucStk) TN_OS_TASK_HANDLE thRt; for (thRt = 0; thRt TN_OS_MAX_TASKS; thRt+) / 搜索是否有空閑的任務(wù)控制塊 return -1; / 如果創(chuàng)建任務(wù)失敗,則返回-1 if (_GtcbTaskthRt.uctaskStat = _TN_TASK_FLG_DEL) setTaskJmp(pfunc

15、Task, pucStk, _GtcbTasksthRt.jbTaskContext); / 保存上下文信息 _GtcbTasksthRt.ucTaskStat = _TN_TASK_FLG_RDY; / 任務(wù)就緒 return thRt; / 如果創(chuàng)建任務(wù)成功,則返回該任務(wù)的句柄 Task0Task1Task2 啟動(dòng)多任務(wù)環(huán)境 在操作系統(tǒng)中,運(yùn)行第一個(gè)用戶任務(wù)的過(guò)程被稱為“啟動(dòng)多任務(wù)環(huán)境”,也即運(yùn)行句柄為0的任務(wù)。TinyOS51是通過(guò)調(diào)用tnOsStart()函數(shù)實(shí)現(xiàn)的,在內(nèi)部由longjmp()函數(shù)執(zhí)行句柄為0的任務(wù)。void tnOsStart (void) longjmp(_Gtcb

16、Tasks0.jbTaskContext); / 執(zhí)行0號(hào)任務(wù)SPPC高8位低8位Task0 堆棧指針Task0 入口地址高8位Task0 入口地址低8位CPU任務(wù)切換任務(wù)切換是指保存當(dāng)前任務(wù)的上下文,并恢復(fù)需要執(zhí)行任務(wù)的上下文的過(guò)程。開(kāi)始是否存在下一個(gè)就緒任務(wù)?從下一個(gè)就緒任務(wù)TCB恢復(fù)上下文等待當(dāng)前任務(wù)就緒否保存當(dāng)前任務(wù)TCB是結(jié)束任務(wù)在宏觀上是并發(fā)運(yùn)行的task0task1task0task1通過(guò)任務(wù)轉(zhuǎn)換實(shí)現(xiàn)調(diào)用setjmp()調(diào)用longjmp()實(shí)現(xiàn)系統(tǒng)空閑任務(wù) 任務(wù)切換程序說(shuō)明1tiny_os_51_core.cvoid thOsSched (void) TN_OS_TASK_HA

17、NDLE thTask; char cTmp1; TN_OS_TASK_HANDLE thTmp2; volatile data char *pucTmp3 = (void *)0; thTmp2 = _GthTaskCur;/* * 搜索就緒的任務(wù) */ for (thTask = 0; thTask = TN_OS_MAX_TASKS) thTmp2 = 0; if (_GtcbTasksthTmp2.ucTaskStat & _TN_TASK_FLG_RDY) != 0) cTmp1 = setjmp(_GtcbTasks_GthTaskCur.jbTaskContext); if (c

18、Tmp1 = 0) _GthTaskCur = thTmp2; / 更新當(dāng)前任務(wù)句柄 longjmp(_GtcbTasksthTmp2.jbTaskContext); return; / 保存當(dāng)前任務(wù)上下文/ 恢復(fù)就緒任務(wù)的上下文 /* * 如果所有任務(wù)都未就緒,則等待本任務(wù)就緒,相當(dāng)于一般操作系統(tǒng)的空閑任務(wù) */ pucTmp3 = (volatile data char *)(&(_GtcbTasksthTmp2.ucTaskStat); while (*pucTmp3 & _TN_TASK_FLG_RDY) != 0) 刪除任務(wù) 刪除任務(wù)的實(shí)質(zhì)是將需要?jiǎng)h除的任務(wù)對(duì)于TCB中任務(wù)狀態(tài)字設(shè)置為“刪除狀態(tài)”,即釋放TCB,刪除任

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論