一種裸奔多任務(wù)嵌入式操作系統(tǒng)模型_第1頁
一種裸奔多任務(wù)嵌入式操作系統(tǒng)模型_第2頁
一種裸奔多任務(wù)嵌入式操作系統(tǒng)模型_第3頁
一種裸奔多任務(wù)嵌入式操作系統(tǒng)模型_第4頁
一種裸奔多任務(wù)嵌入式操作系統(tǒng)模型_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、一種裸奔多任務(wù)模型 一個(gè)網(wǎng)友的總結(jié):stateMachine + timerTick + queue。在RTOS環(huán)境下的多任務(wù)模型:任務(wù)通常阻塞在一個(gè)OS調(diào)用上(比如從消息隊(duì)列取數(shù)據(jù))。外部如果想讓該任務(wù)運(yùn)轉(zhuǎn),就要向消息隊(duì)列發(fā)送消息。任務(wù)收到消息時(shí),根據(jù)當(dāng)前狀態(tài),決定如何處理消息。這就是狀態(tài)機(jī)。任務(wù)將消息隊(duì)列中的消息處理完畢后,重新進(jìn)入阻塞狀態(tài)。任務(wù)在處理中,有時(shí)要延時(shí)一段時(shí)間,然后才繼續(xù)工作:為了充分使用CPU,可以通過OS調(diào)用讓其它任務(wù)去工作。OS通常會(huì)提供一個(gè)taskDelay調(diào)用。當(dāng)任務(wù)調(diào)用taskDelay時(shí),即進(jìn)入阻塞狀態(tài),直到超時(shí),才重新進(jìn)入可工作狀態(tài)(就緒狀 態(tài))。下面說說裸奔

2、環(huán)境下的多任務(wù)模型:裸奔也可以多任務(wù),但調(diào)度是由用戶自主控制。在RTOS環(huán)境下,一般提供搶占式調(diào)度。在裸奔時(shí),一般是任務(wù)在處理告一段落后,主動(dòng)結(jié) 束處理。RTOS環(huán)境下的任務(wù),一般處于一個(gè)while( 1)循環(huán)中。while(1)(從消息隊(duì)列接收消息。如果沒有,將阻塞。處理消息。裸奔下的任務(wù),一般采用查詢方式:查詢是否有待處理的事件。如果沒有,返回。如果有,根據(jù)任務(wù)的當(dāng)前狀態(tài),進(jìn)行處理。處理完畢后,可能返回,也可能將待處理事件 全部處理完畢后再返回。裸奔任務(wù)其實(shí)也處于一個(gè)while( 1)循環(huán)中,只不過這個(gè)循環(huán)在任務(wù)外部。main()A_taskInit();/任務(wù)的初始化B_taskInit

3、();while(1)A_taskProc(); /任務(wù)的處理B_taskProc();狀態(tài)機(jī)既適用于OS環(huán)境,也適用于裸奔環(huán)境。但在裸奔環(huán)境下,狀態(tài)可能被切分得更細(xì)。例如后面講的如何在裸奔環(huán)境實(shí)現(xiàn)t askDelay()。消息隊(duì)列既適用于OS環(huán)境,也適用于裸奔環(huán)境。在OS環(huán)境下,消息隊(duì)列機(jī)制由OS提供。在裸奔環(huán)境下,消息隊(duì)列要自己來實(shí)現(xiàn)。如果對(duì)隊(duì)列的概念不清楚,可參考數(shù)據(jù)結(jié)構(gòu)教 材。這個(gè)隊(duì)列機(jī)制,可做成通用模塊,在不同的程序中復(fù)用。消息隊(duì)列用于緩沖事件。事件不知道什么時(shí)候會(huì)到來,也不能保證來了就能迅速得到處理。使用消息隊(duì)列,可以保證每個(gè)事件都被處理到,以及處理順序。一般在兩種情況下會(huì)用到消息

4、隊(duì)列:存儲(chǔ)外部事件:外部事件由中斷收集,然后存儲(chǔ)到隊(duì)列。串口接收程序中的接收循環(huán)緩沖區(qū),可理解為消息隊(duì)列。任務(wù)間通訊:一個(gè)任務(wù)給其它任務(wù)發(fā)送消息。timerTick,就是系統(tǒng)中的時(shí)鐘基準(zhǔn)。OS中總是有一個(gè)這樣的基準(zhǔn)。在裸奔時(shí),我們要用一個(gè)定時(shí)器(或RTC或watchdog)來建立這個(gè)時(shí)間基準(zhǔn)。一個(gè)tick間隔可以設(shè)置為10ms (典型RTOS的缺省設(shè)置)。讓定時(shí)器10ms中斷一次,中斷 發(fā)生時(shí)給tickNum+ +。以前,我在定時(shí)器中斷中設(shè)置1S標(biāo)志、200ms標(biāo)志等等。時(shí)間相關(guān)的任務(wù)根據(jù)這些標(biāo)志 判斷是否要執(zhí)行。近來,一般讓任務(wù)直接去察看tickNum。兩次相減來判斷定時(shí)是否到達(dá)。也可以在系

5、統(tǒng)中建立一個(gè)通用定時(shí)器任務(wù),管理與不同任務(wù)相關(guān)的多個(gè)定時(shí)器;在定時(shí)到達(dá)時(shí),由定時(shí)器任務(wù)去調(diào)用相應(yīng)的callbacko系統(tǒng)時(shí)鐘基準(zhǔn)是所謂“零耗時(shí)裸奔”的基礎(chǔ)。timerTick的分辨率,決定了只適于于較大的時(shí)間延時(shí)。在做時(shí)序時(shí)的小延時(shí),用傳統(tǒng)方法好了。OS中的taskDelay()在裸奔環(huán)境下的一種實(shí)現(xiàn):OS環(huán)境:void xxxTask(void)while(1)(/waitEvent/do step_1taskDelay(TIME_OUT_TICK_NUM);/do step_2裸奔環(huán)境:void xxxTask(void)static unsigned int taskStat = STA

6、T_GENERAL; /任務(wù)狀態(tài)變量 static timer_t startTick;timer_t currTick;if (taskStat = STAT_GENERAL)/check event/if no eventreturn;/do step_1startTick = sysGetTick(); /sysGetTick(就是察看系統(tǒng)時(shí)間 taskStat = STAT_WAIT;return;else if (taskStat = STAT_WAIT)currTick = sysGetTick(); /sysGetTick()就 是察看系統(tǒng)時(shí)間if (currTick - sta

7、rtTick) = TIME_OUT_TICK_NUM)/do step_2taskStat = STAT_GENERAL;return;elsereturn;老生常談-一種裸奔多任務(wù)模型ourdev 629752P0O6JH.txt(文件大小:4K)(原文件名:老生常 談-一種裸奔多任務(wù)模型.txt)C51多任務(wù)編程思想ourdev 629753EWA0LM.pdf(文件大小:143K)(原文件名:C51多任務(wù)編 程思想.pdf)基于51單片機(jī)的C語言多任務(wù)操作完美版ourdev 629754PETS4B.rar(文件大小:3K)(原文 件名:基于51單片機(jī)的C語言多任務(wù)操作完美版.rar)

8、Easy51RTOS 的原理/Easy51RTOS操作系統(tǒng)頭文件#include os_cfg.h#include functns.h /常用一些功能函數(shù)unsigned char TempBuffer6;/顯示溫度字符串unsigned char str212= , , ,0,0,0,0,0,0,0 xdf,0 x43,0;/任務(wù)0:測(cè)溫度送顯void task0(void)temp=ReadTemperature();IntToStr(temp,TempBuffer);str23=TempBuffer0;str24=TempBuffer1;str25=TempBuffer2;str26=T

9、empBuffer3;str27=TempBuffer4;str28=TempBuffer5;GotoXY(0,1);Print(str2);delay_nms(300);/任務(wù)1:鍵盤掃描,LCD顯示void taskl(void)if(CHANGE=0)/判斷change溫度鍵是否按下set_temp=key_set();設(shè)定需要更改的溫度值if(set_temptemp)fengshan();設(shè)定的溫度 temp)dianlu();/若大于,則打開電爐(這里用LED模擬一下)/任務(wù)2void task2()/任務(wù)3void task3()/任務(wù)4void task4(void)/任務(wù)5v

10、oid task5(void)/任務(wù)6void task6()/任務(wù)7 void task7()/main主函數(shù)void main(void)OS_InitTimer0();EA=1;LCD_Init();LCD_w_data(1,1,Temp_Str);LCD_w_data(2,1,Key_Str);while(1)if (OS_Delay0=0)task0();OS_Delay0=100; /溫度測(cè)量,每秒 1 次if (OS_Delay1=0)task1();OS_Delay1=10; /鍵盤掃描,鍵值存儲(chǔ)if (OS_Delay2=0)task2();OS_Delay=100; /讀出

11、存儲(chǔ)的鍵值,LCD 顯示if (OS_Delay3=0)task3();OS_Delay3=50;if (OS_Delay4=0)task4();OS_Delay4=100;if (OS_Delay5=0)task5();OS_Delay5=60;if (OS_Delay6=0)task6();OS_Delay6=70;if (OS_Delay7=0)task7();OS_Delay7=80;Delay(50);/Taskturn;定時(shí)中斷服務(wù)void OS_Timer0(void) interrupt 1 using 2uchar i;/CRY_OSC,TIME_PER_SEC 在 easy

12、cfg.h 中配置TH0 = 255-CRY_OSC/TIME_PER_SEC/12/256;TL0 = 255-CRY_OSC/TIME_PER_SEC/12%256;每節(jié)拍對(duì)任務(wù)延時(shí)變量減1 ,減至0后,任務(wù)就緒。for(i=0;iMAX_TASK;i+)if(OS_Delayi!=0) OS_Delayi-;/Runing(On);/和傳統(tǒng)的前后感覺基本上是一樣的唯一的優(yōu)點(diǎn)呢,是感覺OS_Delayn數(shù)組起到了分配各Easy51RTOS 的原理 ourdev 629755MEIQGP.txt文件大小:3K)(原文件名:Easy51RTOS 的原 理 .txt)基于51單片機(jī)的C語言多任務(wù)

13、操作完美版/*本程序不使用任何匯編指令由定時(shí)器T0產(chǎn)生中斷,切換進(jìn)程由于中斷或調(diào)用子程序,要把PC堆棧,故可以以SP為基址的地方找到PC中斷或子程序返回,要把SP出棧給PC,故可以操作SP改變程序入口本程序經(jīng)調(diào)試運(yùn)行電路圖已上傳程序編譯是會(huì)有一個(gè)警告提示,為正常現(xiàn)象,因?yàn)楸4鍾0-R7時(shí),重新定義地址,出現(xiàn)地址覆蓋的警告提示。用戶以此模板寫程序只需寫用戶的進(jìn)程子程序和用戶初始化子程序,并把各進(jìn)程參數(shù)放在規(guī)定地方,各程序放在規(guī)定地方就可以;所有的任務(wù)調(diào)度已處理好。*/頭文件#include/#include/#include/宏定義#define uchar unsigned char#defi

14、ne uint unsigned int#define TN 65436進(jìn)程1,2,3執(zhí)行時(shí)間之比為T1: T2: T3 (時(shí)間單位us)#define TN1 55536 /1個(gè)進(jìn)程循環(huán)周期內(nèi)進(jìn)程1執(zhí)行的時(shí)間T1us TN1=(65536-T1) #define TN2 55536 /1個(gè)進(jìn)程循環(huán)周期內(nèi)進(jìn)程2執(zhí)行的時(shí)間T2us TN2=(65536-T1) #define TN3 55536 /1個(gè)進(jìn)程循環(huán)周期內(nèi)進(jìn)程3執(zhí)行的時(shí)間T3us TN3=(65536-T1) /#define N1 4 /進(jìn)程1的延時(shí)參數(shù)#define N2 4 /進(jìn)程2的延時(shí)參數(shù)#define N3 4 /進(jìn)程3的

15、延時(shí)參數(shù) idata uchar temp8 _at_ 0 x00; /R0-R7 uchar tempbf18; /用于保存 R0-R7 進(jìn)程 1 uchar tempbf28; /用于保存 R0-R7 進(jìn)程 2 uchar tempbf38; /用于保存 R0-R7 進(jìn)程 3 定義全局變量uint address1,address2,address3;uchar test1_1=0,test2_1=0,test3_1=0,PID=1;/各進(jìn)程的標(biāo)志位,是否為第一次執(zhí)行,0第一次,非0非第一次;PID進(jìn)程號(hào); uint ac1,ac2,ac3; /, PC_Next;各進(jìn)程的初始地址寄存器.

16、/testl的參數(shù)由于進(jìn)程切換時(shí)沒有保存普通變量,/所以各進(jìn)程的普通參數(shù)需要定義成全局變量.uint m1,i1,j1,k1;uchar table14;/在此加入用戶進(jìn)程1參數(shù)/test2的參數(shù)int m2,i2,j2,k2;uchar table24;/在此加入用戶進(jìn)程2參數(shù)/test3的參數(shù)int m3,i3,j3,k3;uchar table34;/在此加入用戶進(jìn)程1參數(shù)聲明/unsigned int Get_Next_PC(void);/調(diào)用子程序,獲取 PCvoid chushihua(void); /初始化函數(shù)void yonghuchushihua(void); /用戶初始化函

17、數(shù)void test1(void); /進(jìn)程一void test2(void);void test3(void);/main函數(shù)void main(void)/ PC_Next=Get_Next_PC();chushihua();ac1=(unsigned int)(test1); 獲取進(jìn)程 1 的入口地址ac2=(unsigned int)(test2); /獲取進(jìn)程 2 的入 口地址ac3=(unsigned int)(test3); 獲取進(jìn)程 3 的入 口地址yonghuchushihua();TR0=1;while(1); /初始化時(shí)鐘void chushihua(void)TMOD=

18、0 x01; /EA=1;ET0=1;TH0=TN/256;TL0=TN%256;中斷處理,進(jìn)程調(diào)度void time0() interrupt 1 using 1 uchar ib;TR0=0;進(jìn)程順序分配PID+;if(PID=4)PID=1;/進(jìn)程調(diào)度switch(PID)case 1:if(test3_1!=0) /第一次否? /保存現(xiàn)場(chǎng),還回地址address3=*(unsigned char *)(SP-4); /PC 的高字節(jié)address3 = 8;address3+=*(unsigned char *)(SP-5); /PC 的低字節(jié)table30=*(unsigned ch

19、ar *)(SP); 現(xiàn)場(chǎng)保護(hù)table31=*(unsigned char *)(SP-1); 現(xiàn)場(chǎng)保護(hù)table32=*(unsigned char *)(SP-2); 現(xiàn)場(chǎng)保護(hù)table33=*(unsigned char *)(SP-3); 現(xiàn)場(chǎng)保護(hù)for(ib=0;ib8; /PC 的高字節(jié)(unsigned char *)(SP-5)=ac1 & 0 x00ff; /PC 的低字節(jié) else /非第一次執(zhí)行 /執(zhí)行新進(jìn)程,恢復(fù)現(xiàn)場(chǎng)(unsigned char *)(SP-4)=address18;/PC 的高字節(jié)(unsigned char *)(SP-5)=address1 &

20、0 x00ff; /PC 的低字節(jié)(unsigned char *)(SP)=table10; 現(xiàn)場(chǎng)恢復(fù)(unsigned char *)(SP-1)=table11; 現(xiàn)場(chǎng)恢復(fù)(unsigned char *)(SP-2)=table12; 現(xiàn)場(chǎng)恢復(fù)(unsigned char *)(SP-3)=table13; 現(xiàn)場(chǎng)恢復(fù)for(ib=0;ib=7;ib+) /恢復(fù) R0-R7tempib=tempbf1ib;TH0=TN1/256;TL0=TN1%256;TR0=1;break;case 2:if(test1_1!=0)/第一次否? /保存現(xiàn)場(chǎng),還回地址,否address1=*(unsig

21、ned char *)(SP-4); /PC 的高字節(jié)address1 = 8;address1+=*(unsigned char *)(SP-5); /PC 的低字節(jié)table10=*(unsigned char *)(SP);現(xiàn)場(chǎng)保護(hù)table11=*(unsigned char *)(SP-1); /現(xiàn)場(chǎng)保護(hù)table12=*(unsigned char *)(SP-2); /現(xiàn)場(chǎng)保護(hù)table13=*(unsigned char *)(SP-3); 現(xiàn)場(chǎng)保護(hù)for(ib=0;ib8; /PC 的高字節(jié)(unsigned char *)(SP-5)=ac2 & 0 x00ff; /PC

22、的低字節(jié)else 非第一次 執(zhí)行進(jìn)程2,恢復(fù)現(xiàn)場(chǎng)(unsigned char *)(SP-4)=address28; /PC 的高字節(jié)(unsigned char *)(SP-5)=address2 & 0 x00ff; /PC 的低字節(jié)(unsigned char *)(SP)=table20; 現(xiàn)場(chǎng)恢復(fù)(unsigned char *)(SP-1)=table21; 現(xiàn)場(chǎng)恢復(fù)(unsigned char *)(SP-2)=table22; 現(xiàn)場(chǎng)恢復(fù)(unsigned char *)(SP-3)=table23; 現(xiàn)場(chǎng)恢復(fù)for(ib=0;ib=7;ib+) /恢復(fù) R0-R7tempib=

23、tempbf2ib;TH0=TN2/256;TL0=TN2%256;TR0=1;break;case 3:if(test2_1!=0) /保存現(xiàn)場(chǎng),還回地址address2=*(unsigned char *)(SP-4); /PC 的高字節(jié)address2 = 8;address2+=*(unsigned char *)(SP-5); /PC 的低字節(jié)table20=*(unsigned char *)(SP);現(xiàn)場(chǎng)保護(hù)table21=*(unsigned char *)(SP-1); /現(xiàn)場(chǎng)保護(hù)table22=*(unsigned char *)(SP-2); /現(xiàn)場(chǎng)保護(hù)table23=*

24、(unsigned char *)(SP-3); 現(xiàn)場(chǎng)保護(hù)for(ib=0;ib8; /PC 的高字節(jié)(unsigned char *)(SP-5)=ac3 & 0 x00ff; /PC 的低字節(jié)else 執(zhí)行進(jìn)程3,恢復(fù)現(xiàn)場(chǎng)(unsigned char *)(SP-4)=address38; /PC 的高字節(jié)(unsigned char *)(SP-5)=address3 & 0 x00ff; /PC 的低字節(jié)(unsigned char *)(SP)=table30; 現(xiàn)場(chǎng)恢復(fù)(unsigned char *)(SP-1)=table31; 現(xiàn)場(chǎng)恢復(fù)(unsigned char *)(SP-2)=table32; 現(xiàn)場(chǎng)恢復(fù)(unsigned char *)(SP-3)=table33; 現(xiàn)場(chǎng)恢復(fù)for(ib=0;ib=7;ib+) /恢復(fù) R0-R7tempib=tempbf3ib;TH0=TN3/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論