版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1單片機與嵌入式系統(tǒng)第十二講本次課主要內(nèi)容第三章嵌入式系統(tǒng)軟件基礎(chǔ)(一)——RTX-51實時多任務(wù)操作系統(tǒng)2RTX-51實時多任務(wù)操作系統(tǒng)嵌入式系統(tǒng)軟件基礎(chǔ)(一)
——RTX-51實時多任務(wù)操作系統(tǒng)1.本次課要達到的目標(biāo)2.RTX-51實時多任務(wù)操作系統(tǒng)概述3.RTX-51Tiny任務(wù)管理4.RTX-51Tiny系統(tǒng)函數(shù)5.RTX-51與單任務(wù)程序的比較6.RTX-51Tiny程序設(shè)計仿真7.小結(jié)31.本次課要達到的目標(biāo)了解RTX-51多任務(wù)操作系統(tǒng),完成基本仿真。能夠應(yīng)用RTX51操作系統(tǒng)完成應(yīng)用編程。4嵌入式系統(tǒng)軟件基礎(chǔ)(一)
——RTX-51實時多任務(wù)操作系統(tǒng)1.本次課要達到的目標(biāo)2.RTX-51實時多任務(wù)操作系統(tǒng)概述3.RTX-51Tiny任務(wù)管理4.RTX-51Tiny系統(tǒng)函數(shù)5.RTX-51與單任務(wù)程序的比較6.RTX-51Tiny程序設(shè)計仿真7.小結(jié)562.RTX-51實時多任務(wù)操作系統(tǒng)概述2.1多任務(wù)系統(tǒng)簡介2.2RTX-51實時多任務(wù)系統(tǒng)2.3RTX-51實時多任務(wù)系統(tǒng)特點多任務(wù)操作系統(tǒng)為可以運行多個程序的平臺。典型多任務(wù)操作系統(tǒng):Windows、Linux等高級操作系統(tǒng)。典型單任務(wù)操作系統(tǒng):DOS。2.1多任務(wù)系統(tǒng)簡介由于RTOS需占用一定的系統(tǒng)資源(尤其是RAM資源),只有μC/OS-II、embOS、salvo、FreeRTOS(飛拓)、RTX-51、ucLinux、SmallRTOS51等少數(shù)實時操作系統(tǒng)能在小RAM單片機上運行。8RTX:Real-TimeeXecutive
是一個實時操作系統(tǒng)內(nèi)核“RTX內(nèi)核”支持C51、ARM7、ARM9、Cortex-M32.2RTX-51實時多任務(wù)系統(tǒng)RTX-51是一個適用于8051家族的實時多任務(wù)操作系統(tǒng)。RTX-51使復(fù)雜的系統(tǒng)和軟件設(shè)計以及有時間限制的工程開發(fā)變得簡單。RTX-51是一個強大的工具,它可以在單個CPU上管理幾個作業(yè)(任務(wù))。RTX-51有兩種不同的版本。RTX-51FULLRXT-51Tiny10RTX-51FULL全功能版本允許4個優(yōu)先權(quán)任務(wù)的循環(huán)和切換,并且還能并行地利用中斷功能,支持信號傳遞,以及與系統(tǒng)郵箱和信號量進行消息傳遞。RTX-51的os_wait
函數(shù)可以等待以下事件:中斷、時間到、來自任務(wù)或中斷的信號、來自任務(wù)或中斷的消息、信號量。11RXT-51Tiny是RTX-51Full的一個子集,可以很容易地運行在沒有擴展外部存儲器的單片機系統(tǒng)上。但使用RTX-51Tiny的程序可以訪問外部存儲器。RTX-51Tiny允許循環(huán)任務(wù)切換,并且支持信號傳遞,還能并行的利用中斷功能。RTX-51Tiny的os_wait函數(shù)可以等待以下事件:時間到、時間間隔、來自任務(wù)或者中斷的信號。12RTX-51的技術(shù)參數(shù)描述RTX-51FullRTX-51Tiny任務(wù)數(shù)量最多256個;可同時激活19個16個RAM需求40到46字節(jié)DATA空間,20到200字節(jié)IDATA空間(用戶堆棧),最小650字節(jié)XDATA空間7字節(jié)DATA空間,3倍于任務(wù)數(shù)量的IDATA空間代碼要求6KB到8KB900字節(jié)硬件要求定時器0或定時器1定時器0系統(tǒng)時鐘1000到40000個周期1000到65535個周期中斷請求時間小于50個周期小于20個周期任務(wù)切換時間70到100個周期(快速任務(wù)),
180到700個周期(標(biāo)準(zhǔn)任務(wù)),取決于堆棧的負載100到700個周期,取決于堆棧的負載郵箱系統(tǒng)8個分別帶有整數(shù)入口的信箱
不提供內(nèi)存池最多16個內(nèi)存池不提供信號量8*1位不提供132.3RTX-51實時多任務(wù)系統(tǒng)特點RTX-51實時多任務(wù)操作系統(tǒng)完全不同于一般的單任務(wù)單片機C51語言程序。RTX-51有以下獨特的概念和特點:(1)任務(wù)調(diào)度:支持四種任務(wù)調(diào)度方式(循環(huán)任務(wù)調(diào)度、事件任務(wù)調(diào)度、信號任務(wù)調(diào)度、搶先任務(wù)調(diào)度)。14(2)信息傳遞:在RTX-51中,信息是一個可以被存儲器看做是數(shù)字或指針的16位數(shù)值。RTX-51支持任務(wù)之間的信息交換(通過isr_recv_message、isr_send_message、os_send_message、os_wait函數(shù)來實現(xiàn))。15(3)BITBUS通信:RTX-51集成了BITBUS主控制器和從控制器。BITBUS任務(wù)用于支持與Intel8044之間的信息傳遞。16(4)CAN通信:RTX-51中集成了一個CAN總線通信模塊RTX-51/CAN,可以輕松實現(xiàn)CAN總線通信,該模塊作為一個任務(wù)來使用,可以通過CAN網(wǎng)絡(luò)實現(xiàn)信息的傳遞。17(5)中斷:RTX-51的中斷以并行方式工作。中斷函數(shù)可以與RTX-51內(nèi)核通信,并可將信號或消息發(fā)送到RTX-51的指定任務(wù)中。在RTX-51中,中斷一般配置為一個任務(wù)。(RTX-51工作在與中斷功能相似的狀態(tài)下,中斷函數(shù)可以與RTX-51通信并且可以發(fā)送信號或信息給RTX-51任務(wù)。RTX-51Full允許將中斷指定給一個任務(wù))18(6)RTX-51不需要有一個主函數(shù)。它將自動開始執(zhí)行任務(wù)0,如果有一個主函數(shù),則必須利用RTX-51Tiny中的os_create_task函數(shù)或RTX-51中的os_start_system函數(shù)手工啟動RTX-51。19嵌入式系統(tǒng)軟件基礎(chǔ)(一)
——RTX-51實時多任務(wù)操作系統(tǒng)1.本次課要達到的目標(biāo)2.RTX-51實時多任務(wù)操作系統(tǒng)概述3.RTX-51Tiny任務(wù)管理4.RTX-51Tiny系統(tǒng)函數(shù)5.RTX-51與單任務(wù)程序的比較6.RTX-51Tiny程序設(shè)計仿真7.小結(jié)20213.RTX-51Tiny任務(wù)管理3.1任務(wù)的定義3.2任務(wù)的狀態(tài)3.3任務(wù)狀態(tài)轉(zhuǎn)換3.4事件223.1任務(wù)的定義實時或多任務(wù)應(yīng)用程序由一個或多個完成具體操作的任務(wù)組成。RTX-51Tiny允許最多16個任務(wù)。任務(wù)是使用下面的格式定義的返回值類型和參數(shù)列表均為空的C語言函數(shù)。voidfunc(void)_task_num,其中num是一個從0到15的任務(wù)標(biāo)識號例子voidjob0(void)_task_0{ while(1) { counter0++;/*incrementcounter*/ }}定義函數(shù)job0為任務(wù)號0,這個任務(wù)所做的是增加一個計數(shù)器的計數(shù)值并重復(fù)。在這種方式下全部的任務(wù)是用無限循環(huán)實現(xiàn)的。233.2任務(wù)的狀態(tài)RTX-51Tiny主要運行在沒有外部存儲器擴展的51單片機系統(tǒng)中,支持4種任務(wù)狀態(tài),任何一個任務(wù)必須處于其中一個確定的狀態(tài)。24Ready:就緒狀態(tài),只差獲得CPU資源,根據(jù)任務(wù)調(diào)度算法來選擇就緒任務(wù)獲得CPU資源進入運行狀態(tài)。RUNING(Active):運行狀態(tài),每一時刻只能有一個任務(wù)處于運行狀態(tài)。25WAITING(Blocked):等待狀態(tài),當(dāng)指定的事件發(fā)生時進入就緒狀態(tài)。SLEEPING:所有未開始的任務(wù)或自行終止的任務(wù)。26其中Ready、Running、Blocked稱之為活動任務(wù)狀態(tài),主要用于指定用戶已啟動的任務(wù)狀態(tài)。Sleeping為非活動任務(wù)狀態(tài),主要用于指定任務(wù)被聲明,但未啟動的狀態(tài)。27283.3任務(wù)狀態(tài)轉(zhuǎn)換RTX-51Tiny能完成時間片輪轉(zhuǎn)多重任務(wù),而且允許準(zhǔn)并行執(zhí)行多個無限循環(huán)或任務(wù)。任務(wù)并不是并行執(zhí)行的而是按時間片執(zhí)行的。29可利用的CPU時間被分成時間片,由RTX-51Tiny分配一個時間片給每個任務(wù)。每個任務(wù)允許執(zhí)行一個預(yù)先確定的時間,然后RTX-51Tiny切換到另一準(zhǔn)備運行的任務(wù),并且允許這個任務(wù)執(zhí)行片刻。一個時間片的持續(xù)時間可以用配置變量TIMESHARING定義。30也可以使用os_wait系統(tǒng)函數(shù)通知RTX-51,它可以讓另一個任務(wù)開始執(zhí)行。os_wait中止正在運行的當(dāng)前任務(wù),然后等待一指定事件的發(fā)生,在這個時候任意數(shù)量的其他任務(wù)仍可以執(zhí)行。31如果出現(xiàn)以下情況當(dāng)前運行任務(wù)中斷任務(wù)調(diào)用os_wait函數(shù)并且指定事件沒有發(fā)生任務(wù)運行時間超過定義的時間片輪轉(zhuǎn)超時時間如果出現(xiàn)以下情況則開始另一個任務(wù)沒有其他的任務(wù)運行將要開始的任務(wù)處READY或TIME-OUT狀態(tài)323.4事件RTX-51Tiny的os_wait函數(shù)支持以下事件類型SIGNAL:任務(wù)間通信位,信號可以使用RTX-51TINY系統(tǒng)函數(shù)來設(shè)定或清除。一個任務(wù)可以等待信號被設(shè)定后繼續(xù)執(zhí)行,如果一個任務(wù)調(diào)用os_wait函數(shù)來等待一個信號,并且信號沒有設(shè)定,則任務(wù)將一直掛起到信號設(shè)定,然后任務(wù)返回到READY狀態(tài)且可以開始執(zhí)行。33TIMEOUT:一個從os_wait函數(shù)開始的時間延遲,延遲的持續(xù)時間為指定的時間片。使用一個超時值調(diào)用os_wait函數(shù)的任務(wù)將中止到時間延遲結(jié)束,然后任務(wù)返回到READY狀態(tài),而且可以開始執(zhí)行。注意事件SIGNAL可以與事件TIMEOUT結(jié)合,此時RTX-51Tiny將等待信號和時間周期全部發(fā)生。34嵌入式系統(tǒng)軟件基礎(chǔ)(一)
——RTX-51實時多任務(wù)操作系統(tǒng)1.本次課要達到的目標(biāo)2.RTX-51實時多任務(wù)操作系統(tǒng)概述3.RTX-51Tiny任務(wù)管理4.RTX-51Tiny系統(tǒng)函數(shù)5.RTX-51與單任務(wù)程序的比較6.RTX-51Tiny程序設(shè)計仿真7.小結(jié)354.RTX-51Tiny系統(tǒng)函數(shù)4.1任務(wù)啟動函數(shù)os_create_task4.2等待函數(shù)os_wait4.3信號發(fā)送函數(shù)os_send_signal4.4信號發(fā)送函數(shù)isr_send_signal4.5信號清除函數(shù)os_clear_signal4.6任務(wù)刪除函數(shù)os_delete_task4.7當(dāng)前運行任務(wù)號函數(shù)os_running_task_id4.8等待函數(shù)1os_wait14.9等待函數(shù)2os_wait236所有這些系統(tǒng)函數(shù)以庫文件的形式存放在:C:\Keil\C51\LIB\RTX-51TNY.LIB中。兩種前綴:“os_”開頭的函數(shù),表示只用于任務(wù);“isr_”開頭的函數(shù),表示只能用于中斷函數(shù)中;374.1任務(wù)啟動函數(shù)os_create_taskexternunsignedcharos_create_task(unsignedchartask_id);os_create_task函數(shù)啟動使用用task_id表示的任務(wù)號定義的任務(wù)函數(shù)。任務(wù)被標(biāo)記為ready狀態(tài)并且依據(jù)RTX-51Tiny規(guī)定的運行。如果任務(wù)成功地開始返回值os_create_task函數(shù)的返回值為0,如果任務(wù)不能被開始或如果沒有使用規(guī)定任務(wù)號定義的任務(wù)返回值為-1。38#include<RTX-51tny.h>#include<stdio.h>/*forprintf*/voidnew_task(void)_task_2{}voidtst_os_create_task(void)_task_0{ if(os_create_task(2)) { printf("Couldn'tstarttask2\n"); }}39問題:使用RTX51創(chuàng)建并執(zhí)行一個任務(wù),使一個外接LED閃爍。思路:基于RTX編程與傳統(tǒng)main函數(shù)的不同?不需要main函數(shù)直接通過task0開始執(zhí)行40傳統(tǒng)main()函數(shù)如何編寫?voidmain() //主函數(shù){ unsignedint
i=0; P1_0=1; while(1) //主循環(huán)
{ for(i=0;i<200;i++) for(j=0;j<120;j++) ; P1_0=~P1_0; }}41演示:Project0使用RTX-51#include<rtx51tny.h>#include<AT89X51.h>#include<stdio.h>unsignedint
i,j;voidMyLED0(void)_task_0
{ P1_0=0; while(1)
{ for(i=0;i<200;i++) for(j=0;j<120;j++); P1_0=~P1_0; }}42演示:Project1問題:使用RTX51創(chuàng)建并執(zhí)行一個任務(wù),使兩個外接LED閃爍。思路:建立兩個task,分別控制兩個LED通過task0創(chuàng)建task143unsignedint
i,j;voidMyLED0(void)_task_0 { P1_0=0;
os_create_task(1); while(1) //主循環(huán)
{ for(i=0;i<200;i++) for(j=0;j<120;j++) ; P1_0=~P1_0; }}voidMyLED1(void)_task_1 { P1_1=0; while(1) //主循環(huán)
{ for(i=0;i<200;i++) for(j=0;j<120;j++) ; P1_1=~P1_1; }}44演示:Project2為何會出現(xiàn)這種情況?注意循環(huán)變量的定義!45unsignedint
i,j,m,n;voidMyLED0(void)_task_0 { P1_0=0;
os_create_task(1); while(1) //主循環(huán)
{ for(i=0;i<200;i++) for(j=0;j<120;j++) ; P1_0=~P1_0; }}voidMyLED1(void)_task_1 { P1_1=0; while(1) //主循環(huán)
{ for(m=0;m<200;m++) for(n=0;n<120;n++) ; P1_1=~P1_1; }}46演示:Project3改造為函數(shù)形式延時47voidDdelayX1ms(unsignedintcount){ unsignedint
i,j; for(i=0;i<count;i++) for(j=0;j<120;j++);} voidMyLED0(void)_task_0 { P1_0=0;
os_create_task(1); while(1) //主循環(huán)
{ DdelayX1ms(200); P1_0=~P1_0; }}voidMyLED1(void)_task_1 { P1_1=0; while(1) //主循環(huán)
{ DdelayX1ms(200); P1_1=~P1_1; }}48演示:Project4函數(shù)的可重入使用RTX控制更多的LED49voidMyLED0(void)_task_0 { P1_0=0; os_create_task(1); os_create_task(2); os_create_task(3); os_create_task(4); while(1)
{ DdelayX1ms(200); P1_0=~P1_0; }}50演示:Project54.2等待函數(shù)os_waitexternunsignedcharos_wait( unsignedchartyp,unsignedcharticks,unsignedintdummy);os_wait函數(shù)停止當(dāng)前任務(wù)并等待一個或幾個事件,比如一個時間間隔、一個超時或從一個任務(wù)或中斷發(fā)送給另一個任務(wù)或中斷的信號。參數(shù)event_sel確定事件或要等待的事件,并且可以綜合。51上述事件可以用字符“|”進行邏輯或,例如K_TMO|K_SIG規(guī)定任務(wù)等待一個超時或一個信號;參數(shù)ticks規(guī)定等待一個間隔事件k_ivl或一個超時事件k_tmo的時間片數(shù)目;參數(shù)dummy是為了提供與RTX-51的兼容性,在RTX-51Tiny中沒有使用。52事件常數(shù)文字說明K_IVL等待一個時間片間隔K_SIG等待一個信號K_TMO等待一個超時(time-out)返回值:當(dāng)一個指定的事件發(fā)生時,任務(wù)允許運行。運行被恢復(fù)并且os_wait函數(shù)返回一個用于識別重新啟動任務(wù)的事件的識別常數(shù)??赡艿姆祷刂凳?3返回值文字說明SIG_EVENT接收到一個信號TMO_EVENT一個超時(time-out)已經(jīng)完成或一個間隔(interval)已經(jīng)期滿NOT_OK參數(shù)event_sel的值無效#include<RTX-51tny.h>#include<stdio.h>/*forprintf*/voidtst_os_wait(void)_task_9{while(1){charevent;event=os_wait(K_SIG+K_TMO,50,0);54switch(event){default:/*thisshouldneverhappen*/break;caseTMO_EVENT:/*time-out*//*50ticktime-outoccurred*/break;caseSIG_EVENT:/*signalrecvd*//*signalreceived*/break;}}}4.3信號發(fā)送函數(shù)os_send_signalexternunsignedcharos_send_signal(unsignedchartask_id);os_send_signal函數(shù)向任務(wù)task_id發(fā)送一個信號。如果指定任務(wù)已經(jīng)在等待一個信號,這個函數(shù)調(diào)用會把任務(wù)準(zhǔn)備好用于運行,另外信號保存在任務(wù)的信號標(biāo)志位。os_send_signal函數(shù)只可以從任務(wù)函數(shù)中調(diào)用。返回值如果成功os_send_signal函數(shù)的返回值為0如果規(guī)定的任務(wù)不存在則返回值為-155#include<RTX-51tny.h>#include<stdio.h>/*forprintf*/voidsignal_func(void)_task_2{ os_send_signal(8);/*signaltask#8*/}voidtst_os_send_signal(void)_task_8{ os_send_signal(2);/*signaltask#2*/}56使用8051控制兩個LED,使得當(dāng)LED1閃爍5次時,LED2狀態(tài)發(fā)生變化。57voidMyLED1(void)_task_1 { P1_1=0; while(1) {
os_wait(K_SIG,0,0); DdelayX1ms(200); P1_1=~P1_1; }}58voidMyLED0(void)_task_0 { unsignedchari=0; P1_0=0;
os_create_task(1); while(1) { DdelayX1ms(200); P1_0=~P1_0; i++; if(i>=10) { os_send_signal(1); i=0; } }}59演示:Project6使用8051控制兩個LED,使得兩個LED交替閃爍5次。60voidMyLED0(void)_task_0 { unsignedchari=0; P1_0=1; os_create_task(1); while(1) { for(i=0;i<10;i++) { DdelayX1ms(200); P1_0=~P1_0; } os_send_signal(1); os_wait(K_SIG,0,0); }}61voidMyLED1(void)_task_1 { unsignedchari=0; P1_1=1; while(1) { os_wait(K_SIG,0,0); for(i=0;i<10;i++) { DdelayX1ms(200); P1_1=~P1_1; } os_send_signal(0); }}62演示:Project7RTX與中斷一起使用8051控制2個LED交替5次閃爍,INT0若產(chǎn)生外部中斷則LED3閃爍5次。63voidMyLED0(void)_task_0 { unsignedchari=0; P1_0=1; os_create_task(1); os_create_task(2); EA=1; //打開總中斷開關(guān)
EX0=1;//打開INT0中斷
TCON=0X01;//外部中斷1程控為邊沿觸發(fā)方式
while(1) { for(i=0;i<10;i++) { DdelayX1ms(200); P1_0=~P1_0; } os_send_signal(1); os_wait(K_SIG,0,0); }}64voidMyInt(void)interrupt0{ unsignedchari=0;
for(i=0;i<10;i++) { DdelayX1ms(200); P1_2=~P1_2; }}65演示:Project84.4信號發(fā)送函數(shù)isr_send_signalexternunsignedcharisr_send_signal(unsignedchartask_id);isr_send_signal函數(shù)向任務(wù)task_id發(fā)送一個信號。如果指定任務(wù)已經(jīng)在等待一個信號,這個函數(shù)調(diào)用會把任務(wù)準(zhǔn)備好用于運行。另外信號保存在任務(wù)的信號標(biāo)志位。isr_send_signal函數(shù)只可以從中斷函數(shù)中調(diào)用,返回值如果成功isr_send_signal函數(shù)的返回值為0如果規(guī)定的任務(wù)不存在則返回值為-1。66舉例:#include<RTX-51tny.h>voidtst_isr_send_signal(void)interrupt2{
isr_send_signal(8);/*signaltask#8*/}674.5信號清除函數(shù)os_clear_signalexternunsignedcharos_clear_signal(unsignedchartask_id);os_clear_signal函數(shù)清除用task_id表示的任務(wù)的信號標(biāo)志位。返回值:如果信號標(biāo)志位成功地清除os_clear_signal,函數(shù)的返回值為0,如果規(guī)定的任務(wù)不存在,返回值為-1。68舉例:#include<RTX-51tny.h>#include<stdio.h>/*forprintf*/voidtst_os_clear_signal(void)_task_8{
os_clear_signal(5);/*clearsignalflagintask5*/}694.6任務(wù)刪除函數(shù)os_delete_taskexternunsignedcharos_delete_task(unsignedchartask_id);os_delete_task函數(shù)停止用task_id表示的任務(wù)的信號標(biāo)志位。指定的任務(wù)被從任務(wù)列表中刪除。返回值如果任務(wù)成功地停止和刪除返回值os_create_task函數(shù)的返回值為0,如果規(guī)定的任務(wù)不存在或沒有開始返回值為-1。70#include<stdio.h>/*forprintf*/voidtst_os_delete_task(void)_task_0{ if(os_delete_task(2)) {
printf("Couldn'tstoptask2\n"); }}714.7當(dāng)前運行任務(wù)號函數(shù)os_running_task_idexternunsignedcharos_running_task_id(void);os_running_task_id函數(shù)判斷當(dāng)前執(zhí)行的任務(wù)函數(shù)的任務(wù)標(biāo)識符,返回值os_running_task_id函數(shù)返回當(dāng)前執(zhí)行的任務(wù)函數(shù)的任務(wù)標(biāo)識符。返回值的范圍為0-15。72#include<RTX-51tny.h>#include<stdio.h>/*forprintf*/voidtst_os_running_task(void)_task_3{ unsignedchartid;
tid=os_running_task_id(); /*tid=3*/}734.8等待函數(shù)1os_wait1externunsignedcharos_wait1(unsignedchartyp);os_wait1函數(shù)停止當(dāng)前任務(wù),并等待一個事件的發(fā)生。os_wait1函數(shù)是os_wait函數(shù)的一個子集。event_sel參數(shù)規(guī)定要等待的事件并且只可以使用值K_SIG等待一個信號。當(dāng)一個信號事件發(fā)生時任務(wù)允許運行,os_wait1函數(shù)返回一個用于識別重新啟動任務(wù)的事件的識別常數(shù)。74返回一個用于識別重新啟動任務(wù)的事件的識別常數(shù)可能的返回值是:75返回值文字說明SIG_EVENT接收到一個信號NOT_OK參數(shù)event_sel的值無效4.9等待函數(shù)2os_wait2externunsignedcharos_wait2(unsignedchartyp,unsignedcharticks);os_wait2函數(shù)停止當(dāng)前任務(wù)并等待一個或幾個事件,比如一個時間間隔、一個超時或從一個任務(wù)或中斷發(fā)送給另一個任務(wù)或中斷的信號。76參數(shù)event_sel確定事件或要等待的事件并且可以綜合使用下列常數(shù):77事件常數(shù)文字說明K_IVL等待一個報時信號間隔K_SIG等待一個信號K_TMO等待一個超時(time-out)上述事件可以用字符“|”進行邏輯或例如K_TMO|K_SIG規(guī)定任務(wù)等待一個超時或一個信號。參數(shù)ticks規(guī)定等待一個間隔事件K_IVL,或一個超時事件K_TMO的時間片數(shù)目。返回值:當(dāng)一個指定的事件發(fā)生時任務(wù)允許運行,運行被恢復(fù)并且os_wait2函數(shù)返回一個用于識別重新啟動任務(wù)的事件的識別常數(shù)。78可能的返回值是:79返回值文字說明SIG_EVENT接收到一個信號TMO_EVENT一個超時(time-out)已經(jīng)完成或一個間隔(interval)已經(jīng)期滿NOT_OK參數(shù)event_sel的值無效嵌入式系統(tǒng)軟件基礎(chǔ)(一)
——RTX-51實時多任務(wù)操作系統(tǒng)1.本次課要達到的目標(biāo)2.RTX-51實時多任務(wù)操作系統(tǒng)概述3.RTX-51Tiny任務(wù)管理4.RTX-51Tiny系統(tǒng)函數(shù)5.RTX-51與單任務(wù)程序的比較6.RTX-51Tiny程序設(shè)計仿真7.小結(jié)805.RTX-51與單任務(wù)程序的比較5.1單任務(wù)C51程序5.2多任務(wù)循環(huán)C51程序5.3多任務(wù)RTX-51程序815.1單任務(wù)C51程序舉例:單任務(wù)C51程序#include<AT89X51.h>#include<stdio.h>intcount=0;voidmain(){TI=1; while(1)
{count++; printf(“SingleTask:count=%d\n”,count);if(count==500) { count=0;
} }}82演示:Project9運行仿真結(jié)果83演示:Project95.2多任務(wù)循環(huán)C51程序舉例:多任務(wù)循環(huán)C51程序#include<AT89X51.h>#include<stdio.h>#include<RTX-51TNY.h>intcount0=0;intcount1=0;voidmain() { TI=1; while(1)
{ count0++;
printf("SingleProcessTask0:count0=%d\n",count0);
84count1++; printf("SingleProcessTask1:count1=%d\n",count1); if(count0==500) { count0=0; } if(count1==500) { count1=0; } }}演示:Project10仿真結(jié)果:85演示:Project105.3多任務(wù)RTX-51程序舉例:兩任務(wù)RTX-51程序#include<AT89X51.h>#include<stdio.h>#include<RTX-51TNY.h>intcount0=0;intcount1=0;Thread0()_task_0 { TI=1;
os_create_task(1); while(1) { count0++; if(count0==50) { count0=0; } }}86Thread1()_task_1 { while(1) { count1++; if(count1==50) { count1=0; } }}演示:Project12仿真結(jié)果:87兩個任務(wù)之間輪流執(zhí)行演示:Project12每個任務(wù)執(zhí)行時間:50ms舉例:三任務(wù)RTX-51程序#include<AT89X51.h>#include<stdio.h>#include<RTX-51TNY.h>intcount0=0;intcount1=0;
intcount12=0;voidMyLED0(void)_task_0 { TI=1;
os_create_task(1);
os_create_task(2); while(1) { count0++; if(count0==50) { count0=0; } }}88voidMyLED1(void)_task_1 { while(1) { count1++; if(count1==50) { count1=0; } }}voidMyLED2(void)_task_2 { while(1) { count2++; if(count2==50) { count2=0; } }}演示:Project13仿真結(jié)果:89每個任務(wù)執(zhí)行時間:50ms兩個任務(wù)之間輪流執(zhí)行演示:Project13嵌入式系統(tǒng)軟件基礎(chǔ)(一)
——RTX-51實時多任務(wù)操作系統(tǒng)1.本次課要達到的目標(biāo)2.RTX-51實時多任務(wù)操作系統(tǒng)概述3.RTX-51Tiny任務(wù)管理4.RTX-51Tiny系統(tǒng)函數(shù)5.RTX-51與單任務(wù)程序的比較6.RTX-51Tiny程序設(shè)計仿真7.小結(jié)906.RTX-51Tiny程序設(shè)計仿真6.1RTX-51循環(huán)任務(wù)調(diào)度程序設(shè)計6.2RTX-51事件任務(wù)調(diào)度程序設(shè)計6.3RTX-51信號任務(wù)調(diào)度程序設(shè)計6.4從傳統(tǒng)編程向面向OS的編程過渡916.1RTX-51循環(huán)任務(wù)調(diào)度程序設(shè)計RTX-51程序不需要有main()函數(shù),自動從task0開始執(zhí)行。各任務(wù)之間按照時間片輪轉(zhuǎn)的方式進行工作。實例(Ex4):設(shè)置兩個任務(wù),分別使P0端口、P1端口累加。92#include<RTX-51TNY.h>#include<reg52.h>#include<stdio.h>Thread0()_task_0 { P1=0x00;
P2=0x00;
os_create_task(1); while(1) { P1=P1+1;
}}93Thread1()_task_1 { while(1) { P2=P2+1;
}}//Ex4:RTX51循環(huán)調(diào)度演示:Project1494演示:Project146.2RTX-51事件任務(wù)調(diào)度程序設(shè)計RTX-51事件任務(wù)調(diào)度是指使用事件來實現(xiàn)多任務(wù)之間切換的調(diào)度方式。在RTX-51系統(tǒng)中,可以使用os_wait函數(shù)向內(nèi)核發(fā)送事件,暫停當(dāng)前的任務(wù),從而可以實現(xiàn)在等待指定的事件時可以執(zhí)行其他的任務(wù)。RTX-51的事件可以用來更加靈活地為各個任務(wù)分配CPU時間。最典型的RTX-51事件為時鐘信號的超時事件。95舉例:兩個任務(wù)計數(shù),使用os_wait(K_TMO,3)剛剛講過的os_wait(K_TMO,3)中K_TMO表示等待3個時間片,這時候CPU可以轉(zhuǎn)而執(zhí)行其他的任務(wù)。96分析這段代碼的輸出#include<RTX51TNY.h>#include<reg52.h>#include<stdio.h>intcount0=0;intcount1=0;Thread0()_task_0 { TI=1;
os_create_task(1); while(1) { count0++; if(count0==50) { count0=0; } }}97Thread1()_task_1 { while(1) {
os_wait(K_TMO,3,0); count1++; if(count1==5) { count1=0; } }}演示:Project1598演示:Project15os_wait(K_TMO,3,0);任務(wù)2每隔3個時間段執(zhí)行一次,之間的間隔,CPU可以執(zhí)行別的任務(wù)Count2每隔50ms加一;什么原因?由于系統(tǒng)默認(rèn)的時間段為10000個周期,對于12MHz時鐘,時間段為10ms。對于多任務(wù),任務(wù)之間切換的時間片為5個時間段,即:50ms。因此:K_TMO參數(shù)一般要大于5才有效果。99舉例:兩個任務(wù),任務(wù)0使Count0不斷累加,任務(wù)1使Count1每100ms加1。分析:每100ms加1,即10個時間段加1可以使用TMO來得到100Thread0()_task_0 {
os_create_task(1); while(1) { count0=(count0+1)%50; }}Thread1()_task_1 { charevent; while(1) {
os_wait(K_TMO,10,0); count1=(count1+1)%5; }}101演示:Project17102演示:Project17舉例:如何使得Count1每隔100ms加一、Count2每隔150ms加一?103#include<RTX51TNY.h>#include<reg52.h>#include<stdio.h>intcount0=0;intcount1=0;Thread0()_task_0 {
os_create_task(1); while(1) { os_wait(K_TMO,10,0); count0=(count0+1)%5; }}Thread1()_task_1 { while(1) {
os_wait(K_TMO,15,0); count1=(count1+1)%5; }}104演示:Project186.3RTX-51信號任務(wù)調(diào)度程序設(shè)計RTX-51信號調(diào)度是指使用信號來完成多任務(wù)之間切換的調(diào)度方式。在RTX-51中,可以使用os_send_signal函數(shù)來向另一個任務(wù)發(fā)送信號,接收信號的任務(wù)使用os_wait函數(shù)等待信號。當(dāng)任務(wù)接收到信號后,便結(jié)束等待狀態(tài),開始運行。105os_wait使用參數(shù)K_SIGos_wait(K_SIG,0,0)106實例:仍以計數(shù)器為例,看看下面這段代碼的意義。107Thread0()_task_0 {
os_create_task(1); while(1) { count0=(count0+1)%5; if(count0==0) {
os_send_signal(1);
} }}108Thread1()_task_1{ while(1) {
os_wait(K_SIG,0,0);
count1=(count1+1)%5; }}演示:Project19Count1每隔50ms加1,試解釋?109演示:Project19Thread0()_task_0{ unsignedint
i;
os_create_task(1); while(1) { for(i=0;i<=5000;i++); count0=(count0+1)%5; if(count0==0) {os_send_signal(1);
} }}110Thread1()_task_1{ while(1) {
os_wait(K_SIG,0,0);
count1=(count1+1)%5; }}演示:Project21111演示:Project21Thread0()_task_0 { unsignedint
i;
os_create_task(1); while(1) { for(i=0;i<=5000;i++); count0=(count0+1)%5; if(count0==0) {os_send_signal(1);
} }}112Thread1()_task_1{ unsignedintj; while(1) {
os_wait(K_SIG,0,0);
for(j=0;j<=5000;j++); count1=(count1+1)%5; }}演示:Project22113演示:Project226.4從傳統(tǒng)編程向面向OS的編程過渡傳統(tǒng)編程循環(huán)(while(1)或for(;;))+中斷面向OS的編程多任務(wù)任務(wù)之間的通信114實例:傳統(tǒng)單片機的編程8個數(shù)碼管顯示計數(shù)值115設(shè)計分析:8個數(shù)碼管公用數(shù)據(jù)線,為了顯示不同的數(shù)值,需要進行刷新操作刷新的具體原理分析如果采用傳統(tǒng)計數(shù)方式,在刷新過程中,判斷顯示計數(shù)值是否累加如果采用中斷,則可以分兩部分進行,主循環(huán)一直刷新,中斷處理程序累加116基于傳統(tǒng)main()函數(shù)的設(shè)計參見Project23117voidmain(){ unsignedchari=0,k=0x80; while(1) { for(i=0;i<8;i++) { P2=0x00; k=_crol_(k,1); P0=Disp[Seg[i]]; P2=k; DdelayX1ms(2); if(++Sec_Count==200) {118 if(++Sec_Count==200) {
Main_Count=(Main_Count+1)%(100000000);
Sec_Count=0;
Seg[7]=Main_Count%10;
Seg[6]=(Main_Count%100)/10;
Seg[5]=(Main_Count%1000)/100;
Seg[4]=(Main_Count%10000)/1000;
Seg[3]=(Main_Count%100000)/10000;
Seg[2]=(Main_Count%1000000)/100000;
Seg[1]=(Main_Count%10000000)/1000000;
Seg[0]=(Main_Count%100000000)/10000000; } } } }119演示:Project23基于循環(huán)+中斷的方式TMOD=0x00;//計數(shù)器工作模式0,13位計數(shù)TH0=(8192-5000)/32;//對于12MHz晶振,5ms產(chǎn)生一次中斷TL0=(8192-5000)%32;IE=0x82; //打開總中斷,計數(shù)器0中斷TR0=1;//開始計數(shù)120參見Project24#include<AT89X51.H>#include<intrins.h>unsignedcharDisp[16
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新時代教師專業(yè)發(fā)展培訓(xùn)資料
- 基金設(shè)立運作流程與管理方案
- 2026中國熱帶農(nóng)業(yè)科學(xué)院院屬單位第一批招聘筆試備考題庫及答案解析
- 企業(yè)內(nèi)部溝通機制建設(shè)案例
- 電動平車操作流程與安全注意事項
- 科學(xué)與人文融合發(fā)展探討報告
- 高中語文考試真題解析與應(yīng)試技巧
- 車間生產(chǎn)計劃排程案例
- 智能制造車間員工崗位職責(zé)
- 保潔阿姨服務(wù)協(xié)議范本示例
- 塔吊施工方案(專項方案)
- 空壓機入井及使用安全技術(shù)措施
- 對昆明機場地區(qū)天氣氣候特征的一些綜述分析
- YS/T 277-2009氧化亞鎳
- YS/T 1109-2016有機硅用硅粉
- 教師的信仰與價值(合師院講座)
- GB/T 10609.2-2009技術(shù)制圖明細欄
- 汽車制造工程的核心技術(shù)及四大工藝流程開發(fā)體系-
- 上海地理高二等級考 第7講 巖石和地貌1
- 安徽省合肥市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細及行政區(qū)劃代碼
- 視神經(jīng)膠質(zhì)瘤-影像科
評論
0/150
提交評論