版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、setjmp構(gòu)建簡單協(xié)作式多任務(wù)系統(tǒng) setjmp構(gòu)建簡單協(xié)作式多任務(wù)系統(tǒng)預(yù)覽: 摘要:討論一個利用標(biāo)準(zhǔn)C語言setjmp庫函烽實(shí)現(xiàn)查詢式協(xié)作多任務(wù)系統(tǒng),給出完整的內(nèi)核和樣例程序并對源代碼進(jìn)行說明。該系統(tǒng)具有簡單易用的特點(diǎn),只需要編寫存取堆棧指針的宏就可方便地移植到新的平臺上。文章詳述了系統(tǒng)的優(yōu)缺點(diǎn),討論一些性能擴(kuò)展的方法。該內(nèi)核適用于中小規(guī)模的嵌入式軟件。關(guān)鍵詞:協(xié)作式多任務(wù)C setjmp構(gòu)建簡單協(xié)作式多任務(wù)系統(tǒng)正文:摘要:討論一個利用標(biāo)準(zhǔn)C語言setjmp庫函烽實(shí)現(xiàn)查詢式協(xié)作多任務(wù)系統(tǒng),給出完整的內(nèi)核和樣例程序并對源代碼進(jìn)行說明。該系統(tǒng)具有簡
2、單易用的特點(diǎn),只需要編寫存取堆棧指針的宏就可方便地移植到新的平臺上。文章詳述了系統(tǒng)的優(yōu)缺點(diǎn),討論一些性能擴(kuò)展的方法。該內(nèi)核適用于中小規(guī)模的嵌入式軟件。 關(guān)鍵詞:協(xié)作式多任務(wù) C語言 setjmp引言本文介紹的是利用標(biāo)準(zhǔn)C語言setjmp庫函數(shù)實(shí)現(xiàn)的具備此特點(diǎn)的協(xié)作式多任務(wù)系統(tǒng)。從本質(zhì)上講,實(shí)時多任務(wù)操作系統(tǒng)應(yīng)該具備按照優(yōu)先級搶占調(diào)度的內(nèi)核。然而,在實(shí)際應(yīng)用中,搶中式的多任務(wù)某種程序上帶來了用戶程序設(shè)計(jì)時數(shù)據(jù)保護(hù)的困難,并且,具備搶占功能的多任務(wù)內(nèi)核設(shè)計(jì)時困難也比較多,這會增加操作系統(tǒng)自身的代碼,也使它在小資源單片機(jī)系統(tǒng)中應(yīng)用較少;而協(xié)作多任務(wù)系統(tǒng)的調(diào)度只在
3、用戶指定的時機(jī)發(fā)生,這會大大簡化內(nèi)核和用戶系統(tǒng)的設(shè)計(jì),尤其本文實(shí)現(xiàn)的系統(tǒng)通過條件查詢來放棄CPU,既符合傳統(tǒng)單片機(jī)程序設(shè)計(jì)的思維,又帶來了多任務(wù)、模塊化、可重入的編程便利。Setjmp是標(biāo)準(zhǔn)C語言庫函數(shù)的組成部分,它可以實(shí)現(xiàn)程序執(zhí)行中的遠(yuǎn)程轉(zhuǎn)操作。具體來說,它可以在一個函數(shù)中使用setjmp來初始化一個全局標(biāo)號,然后只要該函數(shù)未曾返回,那么在其它任何地方都可以通過longjmp調(diào)用來跳轉(zhuǎn)到setjmp的下一條語句執(zhí)行。實(shí)際上,setjmp函數(shù)將發(fā)生調(diào)用處的局部環(huán)境保存在一個jmp_buf的結(jié)構(gòu)當(dāng)中,只要主調(diào)函數(shù)中對應(yīng)的內(nèi)存未曾釋放(函數(shù)返回時局部內(nèi)存就失效了),那么在調(diào)用longjmp的時候就
4、可以根據(jù)已保存的jmp_buf參數(shù)恢復(fù)到setjmp的地方執(zhí)行。我們的系統(tǒng)中就是分析了setjmp標(biāo)準(zhǔn)庫函數(shù)的特點(diǎn),以簡單的方式實(shí)現(xiàn)了協(xié)作式多任務(wù)。1 演示程序?yàn)榱吮阌诶斫?,首先給出多任務(wù)演示程序的源代碼。這個程序演示了協(xié)作式多任務(wù)切換、任務(wù)的動態(tài)生成、多任務(wù)共用代碼等功能,一共使用了init_coos初始化根任務(wù)(也就是C語言main函數(shù))、creat_task創(chuàng)建新任務(wù)和WAITFOR查詢條件這3個基本的系統(tǒng)調(diào)用。由于面向嵌入式系統(tǒng),因而程序不會中止并且運(yùn)行中也沒有進(jìn)行任何輸出,需要借助適合的調(diào)試工具來理解多任務(wù)系統(tǒng)的運(yùn)行。example.c文件清單:#include<stdlib.
5、h>#include“co-os.h”void tskfunc1(int argc,void *argv);void tskfunc2(int argc,void *argv);void subfunc(void);volatile int cnt,test;int main(void)int i;init_coos(400);creat_tsk(tskfunc1,12,NULL,400);creat_tsk(tskfunc2,0,NULL,400);i=0;while(1)WAITFOR(cnt= =8);while(i+<cnt)test=i;cnt+;void tskfunc
6、1(int argc,void *argv)int i;static int creat=0;1 2 3 4 5 下一頁 setjmp構(gòu)建簡單協(xié)作式多任務(wù)系統(tǒng)預(yù)覽: 摘要:討論一個利用標(biāo)準(zhǔn)C語言setjmp庫函烽實(shí)現(xiàn)查詢式協(xié)作多任務(wù)系統(tǒng),給出完整的內(nèi)核和樣例程序并對源代碼進(jìn)行說明。該系統(tǒng)具有簡單易用的特點(diǎn),只需要編寫存取堆棧指針的宏就可方便地移植到新的平臺上。文章詳述了系統(tǒng)的優(yōu)缺點(diǎn),討論一些性能擴(kuò)展的方法。該內(nèi)核適用于中小規(guī)模的嵌入式軟件。關(guān)鍵詞:協(xié)作式多任務(wù)C setjmp構(gòu)建簡單協(xié)作式多任務(wù)系統(tǒng)正文:if(!creat)creat_tsk(
7、tskfunc1,9,NULL,400);creat=1;i=0;while(1)WAITFOR(cnt>argc);test=0x55;/*使用函數(shù)調(diào)用在子程序中測試WAITFOR*/subfunc();</P >while(i+<cnt)test=i0xAA;void tskfunc2(int argc,void *argv)while(1)WAITFOR(+cnt>15);cnt=0;void subfunc(void)int i;WAITFOR(cnt<5);for(i=0;i<+)test=0x1
8、0*i;2 內(nèi)核構(gòu)成內(nèi)核包括一個供外部用戶程序包含的頭文件(co-os.h)和具體實(shí)現(xiàn)的源文件(co-os.c),它們提供了演示程序中用到的3個系統(tǒng)調(diào)用。內(nèi)核的實(shí)現(xiàn)代碼假定了CPU堆棧是向下增長的,并且通過宏來直接操作堆棧指針。以下代碼在Microsoft VC6 for x86、Borland C+ Builder 5.5、SDS CrossCode7.0 for 68K和GCC3.2 for AVR四種平臺中測試過,只需在co-os.h頭文件中定義相應(yīng)的平臺類型即可順利編譯。(1)co-os.h文件清單#include<setjmp.h>/*選擇X86_VC6,X86_BC5,
9、AVR_GCC或M68H_SDS.*/#define X86_VC6#define MAX_TSK 10typedef struct void (*entry)(int argc,void *argv);jmp_buf env;int argc;void *argv;TVB;extern TCB tcbMAX_TSK;extern int task_num,tskid;上一頁 1 2 3 4 5 下一頁 setjmp構(gòu)建簡單協(xié)作式多任務(wù)系統(tǒng)預(yù)覽: 摘要:討論一個利用標(biāo)準(zhǔn)C語言setjmp庫函烽實(shí)現(xiàn)查詢式協(xié)作多任務(wù)系統(tǒng),給出
10、完整的內(nèi)核和樣例程序并對源代碼進(jìn)行說明。該系統(tǒng)具有簡單易用的特點(diǎn),只需要編寫存取堆棧指針的宏就可方便地移植到新的平臺上。文章詳述了系統(tǒng)的優(yōu)缺點(diǎn),討論一些性能擴(kuò)展的方法。該內(nèi)核適用于中小規(guī)模的嵌入式軟件。關(guān)鍵詞:協(xié)作式多任務(wù)C setjmp構(gòu)建簡單協(xié)作式多任務(wù)系統(tǒng)正文:void init_coos(int mainstk);int creat_tsk(void(*entry)(int argc,void *argv),int argc,void *argv,int stksize);#define WAITFOR(condition)dosetjmp(tcbtskid.env);if(!(con
11、dition)tskid+;if(tskid>=task_num)tskid=0;longijmp(tcbtskid.env,1);while(0)(2)co-os.c文件清單#include "co-os.h"#if defined(X86_VC6)|defined(X86_BC5)#define SAVE_SP(p) _asm mov p,esp#define RESTORE_SP(p) _asm mov esp,p#elif defined(AVR_GCC)#include<io.h>#define SAVE_SP(p) p=(int*)SP#def
12、ine RESTORE_SP(p) SP=(int)p #elif defined(M68K_SDS)#define SAVE_SP(p) asm("MOVE.L A7,"#p"")#define RESTORE_SP(p) asm("MOVE.L "#p",A7")#endifTCB tcbMAX_TSK;Int task_num=1;Int tskid;Static int stktop,oldsp;Void init_coos(int mainstk)SAVE_S
13、P(stktop);stktop=stktop+sizeof(void(*)(void)/sizeof(int)-(mainstk+sizeof(int)-1)/sizeof(int);int creat_tsk(void(*entry)(int argc,void *argv),int argc,void *argv,int stksize)if(task_num>=MAX_TSK)terurn-1;SAVE_SP(oldsp);RESTORE_SP(stktop);上一頁 1 2 3 4 5 下一頁 setjmp
14、構(gòu)建簡單協(xié)作式多任務(wù)系統(tǒng)預(yù)覽: 摘要:討論一個利用標(biāo)準(zhǔn)C語言setjmp庫函烽實(shí)現(xiàn)查詢式協(xié)作多任務(wù)系統(tǒng),給出完整的內(nèi)核和樣例程序并對源代碼進(jìn)行說明。該系統(tǒng)具有簡單易用的特點(diǎn),只需要編寫存取堆棧指針的宏就可方便地移植到新的平臺上。文章詳述了系統(tǒng)的優(yōu)缺點(diǎn),討論一些性能擴(kuò)展的方法。該內(nèi)核適用于中小規(guī)模的嵌入式軟件。關(guān)鍵詞:協(xié)作式多任務(wù)C setjmp構(gòu)建簡單協(xié)作式多任務(wù)系統(tǒng)正文:If(!setjmp(tcbtask_num.env)RESTORE_SP(oldsp);tcbtask_num.entry=entry;tcbtask_num.argc=argc;tcbtask_num.argv=argv
15、;task_num+;stktop-=(stksize+sizeof(int)-1)/sizeof(int);else tcbtskid.entry(tcbtskid.argc,tcbtskid.argv);return 0;3 代碼說明任務(wù)代碼通過執(zhí)行setjmp設(shè)置本任務(wù)下次查詢時的返回點(diǎn),然后在等待條件放棄掉CPU跳轉(zhuǎn)到下一任務(wù)的返回點(diǎn)處執(zhí)行。如此周而復(fù)始,讓各任務(wù)都獲得輪轉(zhuǎn)運(yùn)行的機(jī)會,也要求各任務(wù)都需要主動通過等待條件的方式放棄掉CPU。系統(tǒng)中除了中斷服務(wù)程序之外,所有任務(wù)都是平等的,都應(yīng)該遵循同樣的規(guī)則和其它任務(wù)一起協(xié)作運(yùn)行。基本系統(tǒng)中沒有設(shè)計(jì)殺死任務(wù)的調(diào)用,這要求各任務(wù)都應(yīng)當(dāng)設(shè)計(jì)成
16、某種形式的無限循環(huán)。任務(wù)中等待的條件可以是任務(wù)復(fù)雜的表達(dá)式或都函數(shù)調(diào)用,也可以是中斷服務(wù)程序設(shè)置的全局變量(注意加volatile定義)。一般在任務(wù)執(zhí)行時會讓下次等待的條件不再滿足,避免某個任務(wù)一直霸占CPU將系統(tǒng)餓死。在嵌入式軟件中還經(jīng)常會遇到任務(wù)定時啟動和超時等待在I/O操作上,在我們的系統(tǒng)中可以維護(hù)一個時間計(jì)數(shù)器,只需在適當(dāng)?shù)牡胤接涗洉r刻,然后在任務(wù)查詢條件中判斷當(dāng)前計(jì)數(shù)器和記錄時刻之間的差值就可以了。內(nèi)核實(shí)現(xiàn)的代碼則相當(dāng)簡法。由于主要的保護(hù)和恢復(fù)任務(wù)現(xiàn)場的工作都由C語言標(biāo)準(zhǔn)庫setjmp實(shí)現(xiàn)了,我們就只需要操縱一下堆棧指針防止不同的任務(wù)使用了重疊的局部環(huán)境,這個工作在初始化和創(chuàng)建任務(wù)的
17、時候通過預(yù)定義的兩個宏來實(shí)現(xiàn)。在init_coos函數(shù)中,記錄了主任務(wù)(main函數(shù))保留mainstk字節(jié)堆棧后的新棧頂位置(stktop),然后在每次creat_task時都根據(jù)要求為每個任務(wù)保留stksize字節(jié)的堆棧并重新計(jì)算下一個stktop。在creat_task函數(shù)中利用了setjmp函數(shù)的返回值(直接返回時為0,longjmp跳轉(zhuǎn)返回時非0),使得一方面creat_task能正常回到調(diào)用者,又讓下次輪轉(zhuǎn)到新任務(wù)時能夠找到創(chuàng)建時的入口。co-os.h中定義的WAITFOR使用了一個dowhile(0)實(shí)現(xiàn)多語句宏的C語言小技巧,這樣能保證在任何情況下WAITFOR都可以如單條語句
18、一樣在源程序中使用,需要擔(dān)心多了或者少了大括弧破壞if/else匹配之類的問題,并且,所有的編譯器都會優(yōu)化掉這個假循環(huán)。為了盡量使程序簡單并說明問題,以上代碼中沒有考慮中斷相關(guān)的數(shù)據(jù)保護(hù)問題。實(shí)際運(yùn)行的系統(tǒng)中,如果首先寫堆棧指針不能一步完成(如AVR這樣的8位機(jī)),那么,在寫操作正在進(jìn)行的時候絕對不能允許中斷;另外,在任務(wù)中查詢的條件如果和中斷有關(guān),那么也必須考慮數(shù)據(jù)的完整性。4 性能分 析所有的協(xié)作式多任務(wù)系統(tǒng)中任務(wù)切換時間都和用戶代碼(是否長期占用CPU)、就緒時刻有關(guān),比標(biāo)準(zhǔn)系統(tǒng)略差的是,我們的簡單系統(tǒng)中不支持任務(wù)優(yōu)先級,并且完成一輪查詢調(diào)度的時間還和任務(wù)數(shù)目有關(guān)。這也是為了達(dá)到簡單和可移植性目標(biāo)而不得已作出的犧牲。在各任務(wù)間切換查詢條件通過C語言標(biāo)準(zhǔn)庫函數(shù)longjmp實(shí)現(xiàn),一般來講longjmp函數(shù)要從內(nèi)存中恢復(fù)大部分CPU寄存器,執(zhí)行它也需要若干條指令的時間。為了面向嵌入式系統(tǒng)應(yīng)用,任務(wù)控制塊(TCB)采用靜態(tài)數(shù)組來實(shí)現(xiàn),這樣要求預(yù)先確定系統(tǒng)的最大任務(wù)數(shù)(co-os.h中的MAX_TSK)。如果需要,也可以通過環(huán)波鏈表來動態(tài)管理任務(wù)控制塊(TCB),這時可以簡單實(shí)現(xiàn)任務(wù)的動態(tài)創(chuàng)建和刪除,并且通過指針來訪問TCB也要比通過下標(biāo)(tskid)略
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2022年冀教版六年級數(shù)學(xué)上冊期末試卷及答案
- 運(yùn)動解剖學(xué)(72學(xué)時)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 《金色的草地》課件
- 綠化公司個人鑒定(3篇)
- 泰山碧霞祠導(dǎo)游詞
- 2023屆新高考新教材化學(xué)魯科版一輪學(xué)案-第3章第8講 鈉及其化合物
- 圓鋼采購合同范本
- 2023屆新高考化學(xué)一輪復(fù)習(xí)水的電離和溶液的酸堿性夯基礎(chǔ)
- 泥煤加工合同范本
- 遂寧購房合同范本
- 物聯(lián)網(wǎng)技術(shù)應(yīng)用專業(yè)-物聯(lián)網(wǎng)技術(shù)課程標(biāo)準(zhǔn)
- 小學(xué)道德與法治行動研究報(bào)告
- 2024年工業(yè)和信息化部應(yīng)急通信保障中心招聘公開引進(jìn)高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- 工程部項(xiàng)目培訓(xùn)
- 迷你臨床演練評量MiniCEX于英
- 2024版《隱患排查標(biāo)準(zhǔn)手冊》(附檢查依據(jù))
- DB11/1950-2021-公共建筑無障礙設(shè)計(jì)標(biāo)準(zhǔn)
- 鍍鋅線專業(yè)詞匯表
- 股權(quán)代持股東會決議
- 第17課 盼 六年級語文上冊同步分層作業(yè)設(shè)計(jì)系列(統(tǒng)編版)
- 文化旅游安全培訓(xùn)
評論
0/150
提交評論