![8051單片機實時操作系統(tǒng)RTX51 Tiny總結_第1頁](http://file4.renrendoc.com/view/c75266c3eb3e2f8a03e789957fbee796/c75266c3eb3e2f8a03e789957fbee7961.gif)
![8051單片機實時操作系統(tǒng)RTX51 Tiny總結_第2頁](http://file4.renrendoc.com/view/c75266c3eb3e2f8a03e789957fbee796/c75266c3eb3e2f8a03e789957fbee7962.gif)
![8051單片機實時操作系統(tǒng)RTX51 Tiny總結_第3頁](http://file4.renrendoc.com/view/c75266c3eb3e2f8a03e789957fbee796/c75266c3eb3e2f8a03e789957fbee7963.gif)
![8051單片機實時操作系統(tǒng)RTX51 Tiny總結_第4頁](http://file4.renrendoc.com/view/c75266c3eb3e2f8a03e789957fbee796/c75266c3eb3e2f8a03e789957fbee7964.gif)
![8051單片機實時操作系統(tǒng)RTX51 Tiny總結_第5頁](http://file4.renrendoc.com/view/c75266c3eb3e2f8a03e789957fbee796/c75266c3eb3e2f8a03e789957fbee7965.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
RTX51Tiny介紹^Vision是德國Keil公司開發(fā)的單片機IDE軟件,最初主要用于8051系列單片機,RTX51是其自帶的運行于8051系列單片機上的小型多任務實時操作系統(tǒng),可用來設計具有實時性要求的多任務軟件。RTx51有2個版本:RTX51Tiny和RTX51Full。RTX51Tiny是RTX51Full的子集。RTX51Tiny自身僅占用900字節(jié)左右的程序存儲空間,可以很容易地運行在沒有外部擴展存儲器的051單片機系統(tǒng)上。它完全集成在KeilC5l編譯器中,具有運行速度快、對硬件要求不高、使用方便靈活等優(yōu)點,因此越來越廣泛地應用到單片機的軟件開發(fā)中。它可以在單個:PU上管理幾個作業(yè)(任務)同時可以在沒有擴展外部存儲器的單片機系統(tǒng)上運行。目前在8051系列單片機上使用多任務實時操作系統(tǒng),RTX51Tiny也就成為了首選。//////////////////////////////////////////////////////////////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\RTX51TINY允許同時''準并行”地執(zhí)行多個任務:各個任務并非持續(xù)運行,而是在預先設定的時間片(timeslice)內執(zhí)行。CPU執(zhí)行時間被劃分為若干時間片,RTX51TINY為每個任務分配一個時間片,在一個時間片內允許執(zhí)行某個任務,然后TX51TINY切換到另一個就緒的任務并允許它在其規(guī)定的時間片內執(zhí)行。由于各個時間片非常短,通常只有幾ms,因此各個任務看起來似乎就是被同時執(zhí)行了。RTX51TINY利用單片機內部定時器0的中斷功能實現定時用周期性定時中斷驅動RTX51TINY的時鐘。它最多可以定義16個任務,所有的任務可以同時被激活,允許循環(huán)任務切換,僅支持非搶占式的任務切換,操作系統(tǒng)為每一個任務分配一個獨立的堆棧區(qū)在任務切換的同時改變堆棧的指針,并保存和恢復寄存器的值RTX51TINY沒有專門的時間服務函數和任務掛起函數而是通過os_wait()中的參數設定實現的。使用RTX51TINY時用戶程序中不需要包含main()函數,它會自動地從任務0開始運行。如果用戶程序中包含有main()函數,則需要利用os_create_task函數來啟動RTX51實時操作系統(tǒng)。特性:最大激活的任務數:16DATA最大激活的任務數:16DATA空間:7字節(jié)XDATA空間:0字節(jié)系統(tǒng)時鐘分頻:1000-----65535所需的CODE空間:最大900ByteSTACK空間:3字節(jié)時鐘數:0個中斷嵌套:小于20層任務切換時間:100-700時鐘周期應用:C51紡編譯器A51MarcoAssemblerBL51LinkerorLx51LinkerRTX51TNYLIB和RTX51BT.LIB必需存儲在庫路徑上,一般是文件夾\KEIL\C51\LIBRTX51TNYH包含文件必須存儲在包含文件路徑上,一般是文件夾\KEIL\C51\INC應用程序可能需要外部分的數據存儲空間,但內核并不需要外部存儲空間KEILC51支持各種存儲模式:選擇存儲模式只影響應用程序的存的數據存儲,操作系統(tǒng)的變量和堆棧只存在于51的內存中,即DATA和IDATA,一般情況下,RTX51Tiny的應用只需要小存儲模式。在RTX51Tiny中每個應用程序運行的時間是固定的,支持cooperative任務切換和round-robin任務切換,不支持preemptive(搶先、搶占)任務切換和任務優(yōu)先級。如果應用程序需要preemptive任務切換則必須使用RTX51FULL-TimeExecutive版本。中斷:RTX51Tiny的工作與中斷函數是并行工作的。中斷服務程序可以向RTX51Tiny的任務發(fā)信號(使用函數isr_send_signal),也可以置位作任務的Ready標志(使用函數isr_set_ready)在RTX51Tiny中必須使能中斷,但是在RTX51Tiny沒有中斷服務管理RTX51Tiny使用Timer0和Timer0中斷。全局中斷禁能和Timer0中斷禁能會使RTX51Tiny停止工作,所以只能在短時間內禁能中斷??芍厝牒瘮担悍强芍厝氲腃函數不能被多個任務或中斷過程調用。非可重入的函數的參數和變量保存在靜態(tài)存儲空間中,當它們同時被多個任務調用時,這些參數和變量就可能被覆蓋了。你可以在多任務系統(tǒng)中調用非可重入函數如果你能保證他們不會同進行。不過,這就意味著必須能round-robin任務調度,并且非可重入函數不可以調用RTX51Tiny的功能函數。只使用寄存器量和自動變量的函數自然地就是可重入函數,可以毫無限制地在RTX51Tiny中調用。C51編譯器支可重入函數??芍厝牒褏岛途植孔兞勘4嬖诙褩V?。這樣就可以保證他們被多個任務同時使用。RTX51Tiny并不管理可重入函數的堆棧,因些,如果你在應用程序中使用了可重入函數,你必須確保這些功能函數不調用任務RTX51Tiny的系統(tǒng)函數,并且可重入函數不會被round-robin任務切換所中斷。注意:如果在多個任務或中斷中調用可重入或非可重入函數必須禁止round-robin任務切換。運行時庫:所有的C51可重入運行時庫可能毫無限制地在所用任務中使用。非可重入時庫的要與可重入函數的要求相同。多個數據指針C51編譯器允許使用多個數據指針。RTX51Tiny對他們不進行管理,所以在應用中你必須小心Essentially,你必須確保在改變數據指針時不會發(fā)生round-robin切換。注意:當你打算使用多數據指針時你最好禁止round-robin切換。算術單元(說法與多個數據指針相同)工作寄存器組RTX51Tiny的所有任務都使用工作組0。因些,所有的任務都必須使用C51默認的編譯選項:REGISTERBANK(0)。中斷函數可能會使用其他的工作寄存器組。然而RTX51Tiny在工作寄存器組中永遠需要6個字節(jié)。RTX51Tiny在工作寄存器組中使用的這些字節(jié)可以參考配置文件單個任務程序嵌入式和標準C程序都mian()函數開始。在入式應用中,main函數一般都是一個死循環(huán),我們也可以把它看作是一個連續(xù)執(zhí)行的任務。如:voidmain(void){while(1) /*repeatforever*/{do_something(); /*executethedo_something'task'*/}}在這個例子中,do_something()函數可以認為是一個單任務,既然只有一個任務在執(zhí)行,就不需要具有多任務能力或多任務操作系統(tǒng)。
多任務程序許多成熟的C程序使用一種叫做pseudo多任務的策略,把多個做為一循環(huán),如:voidmain(void){/*repeatforever*/intcounter=0;/*repeatforever*/while(1){/*checkforserialinput*//*processserialinput*//*checkforserialinput*//*processserialinput*//*checkforkeyboardinput*//*processkeyboardinput*//*adjustthecontroller*//*incrementcounter*/process_serial_cmds();check_kbd_io();process_kbd_cmds();adjust_ctrlr_parms();counter++;}}在這個例子中,每個函數完成一個獨立的操作或任務。這些函數是一個一個順序執(zhí)行的當添加更多的任務時調度就行了一個問題。比方說,如果函數process_kbd_cmds執(zhí)行的時間比較長,主循環(huán)就需要很長時間才能再執(zhí)行到函數check_serial_io,這時候串口的數據可能會丟失。當然check_serial_io可以在主循環(huán)中多調用幾次來解決這個問題,但最終這種方法并不是最有效的。RTX51Tiny的程序當使用RTX51Tiny時,你可以為每一個任務生成一個獨立的函數,如:voidcheck_serial_io_task(void)_task_1{/*ThistaskchecksforserialI/O*/}voidprocess_serial_cmds_task(void)_task_2{/*Thistaskprocessesserialcommands*/}voidcheck_kbd_io_task(void)_task_3{/*ThistaskchecksforkeyboardI/O*/}voidprocess_kbd_cmds_task(void)_task_4{/*Thistaskprocesseskeyboardcommands*/}voidstartup_task(void)_task_0{/*Createserial_ioTask*//*Createserial_cmdsTask*//*Createserial_ioTask*//*Createserial_cmdsTask*//*Createkbd_ioTask*//*Createkbd_cmdsTask*//*DeletetheStartupTask*/os_create_task(2);os_create_task(3);os_create_task(4);os_delete_task(0);}在這個例子中,每個函數定義了一個RTX51Tiny的任務。RTX51Tiny程序沒有主C函數,RTX51Tiny首先執(zhí)行任務0。作為一個典型的應用,任務0只是簡單地用來生成其他的所有任務。工作原理RTX51Tiny使用并管理你的目標資源,這一部分講述RTX51Tiny如何使用這些資源°RTX51Tiny的許多方面都可以根據工程需要進行配置。時間片中斷RTX51Tiny使用標準的8051的定時器0來產生定時中斷。這個中斷就是RTX51Tiny的時鐘片。RTX51Tiny運行時庫中用的時等待時間都是以這個時間片為單位的。RTX51Tiny的默認的時間片是10000個機器周期。因此,標準的8051運行在12MHz的時鐘下的時候,時間片有0.01S或著說是100Hz。這個值可以在CONF_TNYA51配置文件中更改。注意:你在以RTX51Tiny時間片中斷中編輯你自己的代碼,參考:CONF_TNYA51任務:RTX51Tiny可以看作是一個任務切換器。要生成RTX51Tiny程序,你必須生成一個具有一個或多個任務的應用。以下細節(jié)可以幫你更快地理解RTX51任務必須用C語言編寫,并且用KeilC51支持的關鍵詞聲明RTX51Tiny使用準確的狀態(tài)維護任務。同時只有一個任務可以處于運行狀態(tài)可能會有多個任務處于就緒,等待,刪除或超時狀態(tài)??臻e任務總是處于就緒狀態(tài),即使使用你的所有任務都處于block狀態(tài)任務狀態(tài)RTX51Tiny的任務總是處于以下狀態(tài)中一確定的狀態(tài)RUNNING:任務處于運行狀態(tài),os_running_task_id返回正在運行的任務的編號READY: 任務處于就緒狀態(tài)。當一個正在運行的任務運行完畢,RTX51Tiny就會啟動下一個就緒狀態(tài)的任務。一個任務可以通設置他的READY標志位os_set_readyorisr_set_ready使它立即進入就緒狀態(tài)(即使它可能正在等待時間到或等一個信號)WAITTING:處于等待一個事件的任務就處于等待狀態(tài)。當所等待的事件發(fā)生后,任務就轉換到就緒狀態(tài),函數os_wait用來使一個作任務進行等待狀態(tài)DELETED:沒有開始運行的任務或被刪除的任務處于DELETED狀態(tài)。函數os_delete_task使一個已經啟動(使用函數os_create_task)的任務進入DELETED狀態(tài)TIME-OUT:被round-robinTime-Out中斷的任務處于TIME-OUT狀態(tài)。這個狀態(tài)在round-robin程序中等效于READY狀態(tài)事件(Events)在實時操作系統(tǒng)中事件可以用來控制任務的執(zhí)行。一個任務可能會等待一個事件,也可能給其他任務設置事件標志。函數os_wait允許任務等待一個或多個事件。任務等待的最普通的事件就是Timeout,一個簡單的Timeout就是一定數量的clockticks,當一個任務等待的時間耗盡時,它就可以繼續(xù)執(zhí)行了,當它等待時,其他的任務就可以運行variantoftheTimeoutistheInterval.Anintervalislikeatimeoutexceptthatthespecifiednumberofclockticksisrelativetothelasttimetheos_waitfunctionwasinvokedbythetask.TheIntervalmaybeusedtogenerateataskwhichisrunonaregular,synchronousschedule(likeonceeverysecond)regardlessofhowlongthetasktakesbetweencallstotheos_waitfunction,(以上內容是說,interval類似于timeout,但與timeout不同的是interval參考的不是上一次任務執(zhí)行后的時間,而是某個特定的時間點,從而是一個規(guī)律性的、周期性的運行的任務:比如說每
秒一次)信號是任務間通信的一種簡單的形式,一個任務可以等待其他作任務給他發(fā)一個信號(使用os_send_signalandisr_send_signal函數)。 每個任務的READY標志都可能被其他任務置位(使用os_set_readyandisr_set_ready函數)。一個等timeout,interval,或信號的任務都可以通過置位READY標志重新啟動。//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////RTX51Tiny會為每個事件維護一個標志。以下事件選擇項可以被用來表明等待什么:事件選項K_IVL事件選項K_IVLK_SIGKTMO等待特定數目的Interval等待一個信號等待Timeout當函數os_wait返回,發(fā)生的事件被返回值標志返回值RDY_EVENTSIG_EVENTTMOEVENT返回值RDY_EVENTSIG_EVENTTMOEVENT任務的就緒標志被置位信號已收到一個Timeout已經結束或一個interval已經完畢函數os_wait可能會等待以下事件組合K_SIG|K_TMO:os_wait延遲任務直到一個信號已經發(fā)給他,或直到設定的clocktick耗盡K_SIG|K_IVL:os_wait延遲任務直到一個信號已經發(fā)給他,或直到設定的interval耗盡注意:上面的兩個事件也可能不組合。任務調度任務調度器是RTX51Tiny的一部分,用來處理器交給任務。任務調度器根據以下規(guī)則決定具體執(zhí)行哪一個任務。當出現以下情況將中斷當前任務:任務調用函數os_wait,并且等待的任務還沒有發(fā)生。任務執(zhí)行的時間超過了設定的round-robin時間片。其他的任務在出現以下條件時開始運行,沒有其他任務正在運行,將啟動的任務正處于就緒狀態(tài)或TIME-OUT狀態(tài)RTX51TINY是基于時間片調度算法的操作系統(tǒng),它支持的是非搶占式的任務切換。所以在一個任務被執(zhí)行時不能對其進行中斷,除非該任務主動放棄CPU的資源,中斷才可以打斷當前的任務,中斷完成后把CPU的控制權再交還該被中斷的任務。任務切換有兩種情況,一種是當前任務主動讓出CPU資源;另一種情況是在當前任務的時間片已經用完的情況下,進行任務切換。CPU執(zhí)行時間被分成若干個時間片,RTX51TINY為每個任務分配一個時間片。時間片是通過對變量TIMESHARING的設置來確定的,即用“TIMESHARINGEQU5;”設置多少個系統(tǒng)時鐘周期為一個時間片。系統(tǒng)默認5個系統(tǒng)時鐘為一個時間片,如果晶振頻率為11.0592MHz,則時間片為10.8507x5=54.2535ms。RTX51TINY的任務切換共有TASKSWITCHING和SWITCHINGNOW兩個入口,前者供定時器T0的中斷服務程序調用,后者供系統(tǒng)函數os_delete和os_wait調用。相應地也有兩個不同的出口,分別是恢復保護現場和清除狀態(tài)標志位。系統(tǒng)首先將當前任務置為“TIMEOUT”狀態(tài),等待下一次時間片循環(huán),然后找到下一個處于“READY”狀態(tài)的任務,通過堆棧管理,將自由堆??臻g分配給該任務,使其成為當前任務。清除使該任務進入“READY”或“TIMEOUT”狀態(tài)的相關位后,執(zhí)行該任務。任務切換的流程如圖1所示。圖1任務切換流程共享資源RTX51TINY由于是一個多任務的操作系統(tǒng),那么就不免會有幾個任務使用同一個資源,這些資源可能是一個變量,也可能是輸入輸出設備。這就要求一個任務在使用共享資源時必須獨占該資源,否則可能會造成數據被破壞。在RTX51TINY中實現共享資源獨占的方法比較多。比如,可以通過TIMESHARING這個變量來禁止時間片輪轉,使其值為0,就可以實現禁止任務切換,從而當前任務就可以獨占共享資源。還可以關閉中斷來實現,使EA=0,定時器T0的中斷被關閉,不能再為時間片輪轉提供基準,從而禁止了任務切換。但這兩種方法都帶有一定的局限性,前一種方法只能適用于實時性要求不高的場合,后一種方法由于T0中斷關閉時間不能太長,只能適用于一些簡單變量操作的場合?;谝陨锨闆r,下面通過另一種方法來實現共享資源的使用。在RTX51full中可以利用信號量很好地實現對共享資源的操作也可以把這種思想應用到RTX51TINY中;而在RTX51TINY中不支持信號量,這就要求用戶自己定義信號量及其操作過程。以下是部分代碼:structsignal{//定義信號量結構體ucharcount;〃該信號量的當前計數值uintlist_tasks//等待該信號量任務表}signal_list[3];/*初始化信號量*/voidinit_signal(uchartask_id,ucharcount){signal_list[task_id].count=countsignal_list[task_id].list_tasks=Q}/*等待信號量*/charwait_signal(uchartask_id){if(signal_list[task_id].count>0){signal_list[task_id].count〃獲取信號量return(-1);}signal_list[task_id].list_tasks|=(:Cos_running_task_id());〃標記為等待狀態(tài)return(0);}voidwait_sem(uchartask_id){if(wait_signal(task_id==0)while(os_wait(K_TMQ255,0)!=RDY_EVENT)//等待,直到該任務就緒}/*釋放信號量*/charrelease_signal(uchartask_id){uchari:uinttemp=1if((signal_list[task_id].count>0)||(signal_list[task_id].list_tasks==0)){signal_list[task_id].count++〃釋放信號量return(-1);}for(i=0;i<16;i++){if((signal_list[task_id].list_tasks&(temp))!=0){/查找任務表signal_list[task_id].list_tasks&=~(1<<i)return(i);//返回等待信號量的任務號}temp<<=1:}}voidrelease_sem(uchartask_id){chartask_temp;task_temp=release_signal(task_id)if(task_temp!=-1){os_set_ready(task_temp)//任務task_id進入就緒狀態(tài)os_switch_task();}}有了以上幾個函數的定義和實現,就可以應用等待信號量和釋放信號量來完成對共享資源的獨占。例如:voidjob()_task_id{ 用戶代石 wait_sem(task_id);//等待任務task_id的信號量 對共享資源使用代石 release_sem(task_id)〃釋放任務task_id的信號量 用戶代石 }應用信號量來實現共享資源的使用,不用禁止時間片輪轉和關閉P中斷,可以有效地實現對共享資源的獨占;但增加了代碼,等待和釋放信號量花費了一定的時間,在具體應用中要視情況而定。在應用RTX51TINY時應注意以下幾點:盡可能不使用循環(huán)任務切換。使用循環(huán)任務切換時要求有13個字節(jié)的堆棧區(qū)來保存任務內容(工作寄存器等)。如果由os_wait()函數來進行任務觸發(fā),則不需要保存任務內容。由于正處于等待運行的任務并不需要等待全部循環(huán)切換時間結束,因此os_wait()函數可以產生一種改進的系統(tǒng)響應時間。不要將時鐘節(jié)拍中斷速率設置得太高,設定為一個較低的數值可以增加每秒的時鐘節(jié)拍個數。每次時鐘節(jié)拍中斷大約需要100~200個CPU周期,因此應將時鐘節(jié)拍率設定得足夠高,以便使中斷響應時間達到最小化。在os_wait()函數中有3個參數:K_TMO、K_IVL和K_SIQ其中對于K_TMO和K_IVL的使用要加以區(qū)別。在使用時,兩者似乎差別不是很大。其實不然兩者存在很大的區(qū)別:K_TMO是指等待一個超時信號,只有時間到了,才會產生一個信號。它產生的信號是不會累計的,產生信號后,任務進入就緒狀態(tài)。而K_IVL是指周期信號,每隔一個指定的周期,就會產生一次信號,產生的信號是可以累計的。這樣就使得在指定事件內沒有響應的信號,通過信號次數的疊加,在以后信號處理時,重新得以響應,從而保證了信號不會被丟失。而通過K_TMO方式進行延時的任務,由于某種原因信號沒有得到及時的響應,那么這樣就可能會丟失一部分沒有響應的信號。不過兩者都是有效的任務切換方式,在使用時要根據應用場合來確定對兩者的使用。RTX51TINY中沒有專門的處理共享資源函數。RTX51Tiny配置RTX51Tiny可根據應用的不同定制。一、配置建立了嵌入式應用后,RTX51Tiny必須要配置。所有的配置設置都在CONF_TNY.A51文件中,該文件位于"KEIL"CS1"RTXTINY2"目錄下。在CONF_TNY.A51中的配置選項允許:指定滴答中斷寄存器組。指定滴答間隔(以8051機器周期為單位)。指定在滴答中斷中執(zhí)行的代理。指定循環(huán)超時。允許或禁止循環(huán)任務切換。指定應用程序占用長時間的中斷。指定是否使用codebankingo定義RTX51Tiny的棧項。指定最小的??臻g需求。指定棧錯誤發(fā)生時要執(zhí)行的代碼。定義棧錯誤發(fā)生時要執(zhí)行的代碼。定義空閑任務操作。CONF_TNY.A51的默認配置包含在RTX51Tiny庫中。但是,為了保證配置的有效和正確,須得將CONF_TNY.A51文件拷貝到工程目錄下并將其加入列工程中。通過改變CONF_TNY.A51中的設置來定制RTX51Tiny的配置。附注:如果在工程中沒有包含配置文件(CONF_TNY.A51),庫中的默認配置將自動加載,后續(xù)的改變將存儲在庫中,這樣可能會對以后的應用起到不良影響。1、硬件定時器下面的常數指定RTX51Tiny的硬件定時器如何配置。INT_REGBANK指定用于定時器中斷的寄存器組,默認為1(寄存器組1)。INT_CLOCK指定定時器產生中斷前的指令周期數。該值用于計算定時器的重裝值(65536_INT_CLOCK)。默認該值為10000。HW_TIMER_CODE是一個宏,它指出在RTX51Tiny定時器中斷結尾處要執(zhí)行的代碼。該宏默認是中斷返回,如:HW_TIMER_CODEMACRORETIENDM默認情況下,循環(huán)任務切換是使能的。下面的常數允許你配置循環(huán)任務切換的時間或完全禁止循環(huán)切換。?TIMESHARING指定每個任務在循環(huán)任務切換前運行的滴答數。設為0時禁止循環(huán)任務切換。默認值為5個滴答數。3、長中斷一般情況下,中斷服務程序設計為快速執(zhí)行的程序,在某些情況下,中斷服務程序可能執(zhí)行較長的時間。如果一個高優(yōu)先級的中斷服務程序執(zhí)行的時間比RTX51Tiny滴答的時間間隔長,RTX51Tiny定時器中斷可能被中斷并可能重入(被后繼的RTX51定時器中斷)。如果要使用執(zhí)行時間較長的高優(yōu)先級中斷,應該考慮減少ISR中執(zhí)行的作業(yè)的數量,改變RTX51定時器的滴答率使其低一些,或者使用下面的配置選項。LONG_USR_ISR指示器是否有執(zhí)行時間長于滴答時間間隔的中斷(滴答中斷除外)。當該選項設為1,RTX51Tiny就會包括保護再入滴答中斷的代碼。該值默認為0,即認為中斷是快速的。4、 CodeBanking以下配置選項允許你指定RTX51Tiny應用是否使用codebanking0CODE_BANKING指定是否使用codebanking。使用codebanking時該選項必須設為1,未使用codebanking時,該選項須設為0,默認的值為0。附注L51_BANK.A512.12及其以上的需要RTX51Tiny程序使用codebankingo5、 棧一些選項用于棧配置。下面的常數定義用于棧區(qū)域的內部RAM的大小和棧的最小自由空間。一個宏允許指定當沒有足夠的自由棧時執(zhí)行的代碼。RAMTOP指定片上棧頂部的地址。除所有位于棧之上的IDATA變量,否則不應修改該值。該值默認為OXFF。FREE_STACK指定棧允許的最小字節(jié)數。切換任務時,如果RTX51Tiny檢測到低于該值時,STACK_ERROR宏將被執(zhí)行。設為0禁止棧檢查,默認設置是20字節(jié)。STACK_ERROR是一個指定發(fā)生棧錯誤(少于FREE_STACK字節(jié)數)時要執(zhí)行的指令的宏。該宏默認是禁止中斷并進入無限循環(huán):STACK_ERRORMACROCLREASJMP$ENDM當沒有任務準備運行時,RTX51Tiny執(zhí)行一個空閑任務。空閑任務只是一個循環(huán),不做任何事一一只是等待滴答中斷切換到一個就緒的任務。下列常數允許配置空閑任務。CPU_IDLE宏指定空閑任務中執(zhí)行的代碼。默認的指令是置位PCON寄存器的空閑模式位(大多數8051設備適用)。這將停止執(zhí)行程序,降低功耗,直到有中斷產生:CPU_IDLEMACROORLPCON,#1ENDMCPU_IDLEMACRO指定在空閑任務中是否執(zhí)行CPU_IDLE宏。默認為0,CPU_IDLE宏不包括在空閑任務中。二、庫文件RTX51Tiny包括兩個庫文件:RTX51TNY.LIB用于無代碼分組(non_banking)的RTX51Tiny程序。RTX51BT.LIB用于代碼分組(code_banking)的RTX51Tiny程序。在"KEIL"C51"RTXTINYZ"SOURCECODE"下的RTXTINZ.PRJ工程用來建立這兩個庫。附注:應用時并不需要顯式的包含一個RTX51Tiny庫。當使用^Visio集成環(huán)境或命令行連接器時會自動執(zhí)行。建立RTX51Tiny庫時,默認配置文件(CONF_TNY.A51)包括在庫中。如果在工程中未顯示包含配置文件(CONF_TNY.A51),將從庫中包含一個默認的,后續(xù)對配置文件的修改將存儲到庫中,這可能對你的應用產生負面影響。下面的事情是為了優(yōu)化RTX51Tiny程序應該做的。? 如果可能,禁止循環(huán)任務切換。循環(huán)切換需要13個字節(jié)的??臻g存儲任務環(huán)境和所有的寄存器。當任務切換通過調用RTX51Tiny庫函數(像os_wait或os_switch_task)觸發(fā)時,不需要這些空間。用os_wait替代依靠循環(huán)超時切換任務。這將是提高系統(tǒng)反應時間和任務響應時間。避免將滴答中斷率設置的太快。為了最小化存儲器需求,從0開始對任務編號使用RTX51Tiny一般地,下面三步是使用RTX51Tiny要實現的編寫RTX51程序編譯并連接程序測試和調試程序一、編寫程序寫RTX51Tiny程序時,必須用關鍵字對任務進行定義,并使用在RTX51TNY.H中聲明的RTX51Tiny核心例程。1、 包含文件RTX51Tiny僅需要包含一個文件:RTX51TNY.H。所有的庫函數和常數都在該頭文件中定義。你可以在你的源文件中包含它:#include<rtx51tny.h>2、 編程原則以下是建立RTX51Tiny程序時必須遵守的原則:、確保包含了RTX51TNY.H頭文件。、不要建立main函數,RTX51Tiny有自己的mian函數。、程序必須至少包含一個任務函數。、中斷必須有效(EA=1),在臨界區(qū)如果要禁止中斷時一定要小心。參見概述中的中斷一節(jié)。、程序必須至少調用一個RTX51Tiny庫函數(象os_wait)。否則,連接起將不包含RTX51Tiny庫。、Task0是程序中首先要執(zhí)行的函數,必須在任務0中調用os_create_task函數以運行其余任務。、任務函數必須是從不退出或返回的。任務必須用一個while(1)或類似的結構重復。用os_delete_task函數停止運行的任務。、必須在uvison中指定RTX51Tiny,或者在連接器命令行中指定。更多技術文檔參見keil軟件知識庫。3、定義任務實時或多任務應用是由一個或多個執(zhí)行具體操作的任務組成的,RTX51Tiny支持最多16個任務。任務就是一個簡單的C函數,返回類型為void,參數列表為void,并且用_task_聲明函數屬性。例如:voidfunc(void)_task_task_id這里,func是任務函數的名字,task_id是從0到15的一個任務ID號。下面的例子定義函數job0編號為0的任務。該任務使一個計數器遞增并不斷重復。voidjob0(void)_task_0{while(1){Counter0++;}}附注:所有的任務都應該是無限循環(huán),任務一定不能返回。任務不能返回一個函數值,它們的返回類型必須是void。不能對一個任務傳遞參數,任務的形參必須是void。每個任務必須賦予一個唯一的,不重復的ID。為了最小化RTX51Tiny的存儲器需求,從0開始對任務進行順序編號。二、編譯和連接有兩種方法編譯和連接RTX51Tiny應用程序。用uvison集成開發(fā)環(huán)境用命令行工具1、 命令行工具RTX51Tiny已經完全集成到了C51編譯語言中,這使得生成RTX51Tiny應用非常容易。建立RTX51Tiny程序只需編寫C函數,無需使用匯編。從命令行編譯RTX51Tiny程序…按常規(guī)方式調用編譯器,無需特別的編譯指示。例如:C51RTXPROG.CDEBUGOBJECTEXTEND產生的RTXPROG.OBJ文件中包含C代碼和定義的RTX51Tiny任務。從命令行連接RTX51Tiny程序:在連接器命令行內指定RTX51TNY指示在目標文件列表中包含RTX_CONF.OBJ文件(如果改變了配置)例如:BL51RTPROG.OBJ,RTX_CONF.OBJRTX51TNYRTX51TNY指示命令連接器連接RTPROG.OBJ和TX_CONF.OBJ并且包含RTX51Tiny庫。這樣就建立了RTX51Tiny程序。附注:不要在RTX51Tiny程序中建立mian函數,只建立任務函數就可以。main函數包含在RTX51Tiny庫中,它啟動操作系統(tǒng)和任務0。如果在程序中包含了main函數,將產生一個連接錯誤指示有多個main被定義。程序中至少建立一個任務函數。必須至少調用一個RTX51Tiny函數(象os_wait或os_create_task),這樣,連接器才會包含RTX51Tiny庫。2、 uvison集成開發(fā)環(huán)境用uvison建立RTX51Tiny程序。1) 打開目標對話框選項(從project菜單選擇OptionsforTarget)。2) 選擇目標標簽。3) 從操作系統(tǒng)選項列表選擇RTX51Tiny。三、調試uvison模擬器允許運行和測試RTX51Tiny應用程序°RTX51Tiny程序的載入和無RTX51Tiny程序的載入是一樣的。無需指定特別的命令和選項。一個核心的對話框顯示RTX51Tiny核心和程序中任務的所有特征。從Peripherals菜單選擇RTX51TinyTasklist顯示該對話框。該對話框中:TID是在任務定義中指定的任務ID。TaskName是任務函數的名字。State是任務當前的狀態(tài)。WaitforEvent指出任務正在等待什么事件。Sig顯示任務信號標志的狀態(tài)(1為置位)。Timer指示任務距超時的滴答數,這是一個自由運行的定時器,僅在任務等待超時和時間間隔時使用。Stack指示任務棧的起始地址。附1:函數參考以下部分描述RTX51Tiny的系統(tǒng)函數。函數依字母順序排列,分為以下部分:概要(Summary)簡述程序作用,列出包含的文件,包括它的聲明和原型,語法舉例,和參數描述。描述(Description)程序的詳細描述,如何使用。返回值 程序返回值說明。參閱(seealso)相關程序。例子 如何正確使用該函數的程序例子中斷。附注:l以os_開頭的函數可以由任務調用,但不能由中斷服務程序調用。l以isr_開頭的函數可以由中斷服務程序調用,但不能由任務調用。1、irs_send_signal概要:#include<rtx51tny.h>charisr_send_signal(unsignedchartask_id);描述:isr_send_signal函數給任務task_id發(fā)送一個信號。如果指定的任務正在等待一個信號,則該函數使該任務就緒,但不啟動它,信號存儲在任務的信號標志中。附注:l該函數是RTX51Tiny實時操作系統(tǒng)的一部分,僅包含于PK51中。l 該函數僅被中斷函數調用。返回值成功調用后返回0,如果指定任務不存在,則返回-1。參閱os_clear_signal,os_send_signal,os_wait例子#include<rtx51tny.h>voidtst_isr_send_signal(void)interrupt2{isr_send_signal(8);}2、 irs_set_ready概要#include<rtx51tny.h>charisr_set_ready{unsignedchartask_id};描述將由task_id指定的任務置為就緒態(tài)。附注l 該函數是RTX51Tiny的一部分,包含在PK51中。l 該函數僅用于中斷函數。返回值無例子#include<rtx51tny.h>voidtst_isr_set_ready(void)interrupt2{isr_set_ready(1);}3、 os_clear_signal概要#include<rtx51tny.h>charos_clesr_signal(unsignedcahrtask_id);描述清除由task_id指定的任務信號標志。附注:該函數是RTX51Tiny的一部分,包含在PK51中。返回值信號成功清除后返回0,指定的任務不存在時返回-1。參|閱isr_send_signal,os_send_signal,os_wait例子#include<rtx51tny.h>voidtst_os_clsar_siganl(void)_task_8{???os_clear_signal(5);?}4、 os_create_task概要#include<rtx51tny.h>charos_create_task(unsignedchartask_id);描述啟動任務task_id,該任務被標記為就緒,并在下一個時間點開始執(zhí)行。附注:該函數是包含在PK51中的RTX51Tiny的組成部分。返回值任務成功啟動后返回0,如果任務不能啟動或任務已在運行,或沒有以task_id定義的任務,返回-1。參閱os_delete_task例子#include<rtx51tny.h>#include<stdio.h>voidnew_task(void)_task_2{..?}voidtst_os_create_task(void)_task_0{if(os_create_task(2)){printf("couldn’tstarttask2"n”)}???}5、 os_delete_task概要#include<rtx51tny.h>charos_delete_task(unsignedchartask_id);描述函數將以task_id指定的任務停止,并從任務列表中將其刪除。附注 該函數是包含在PK51中的RTX51Tiny的組成部分。返回值任務成功停止并刪除后返回0。指定任務不存在或未啟動時返回-1。附注如果任務刪除自己,將立即發(fā)生任務切換。參閱os_create_task例子#include<rtx51tny.h>#include<stdio.h>voidtst_os_delete_task(void)_task_0{?if(os_delete_task(2)){printf("couldn'tstoptask2"n”)}?}6、 os_reset_interval概要#include<rtx51tny.h>voidos_reset_interval(unsignedcharticks);描述用于糾正由于os_wait函數同時等待K_IVL和K_SIG事件而產生的時間問題,在這種情況下,如果一個信號事件(K_SIG)引起os_wait退出,時間間隔定時器并不調整,這樣,會導致后續(xù)的os_wait調用(等待一個時間間隔)延遲的不是預期的時間周期。允許你將時間間隔定時器復位,這樣,后續(xù)對os_wait的調用就會按預期的操作進行。附注:該函數是包含在PK51中的RTX51Tiny的組成部分。返回值無例子#include<rtx51tny.h>voidtask_func(void)_task_4{?switch(os_wait2(KSIG|K_IVL,100)){caseTMO_EVENT:break;caseSIG_EVCENT:os_reset_interval(100);break;}???}7、 os_running_task_id概要#include<rtx51tny.h>charos_running_task_id(void);描述函數確認當前正在執(zhí)行的任務的任務ID。附注:該函數是包含在PK51中的RTX51Tiny的組成部分。返回值返回當前正在執(zhí)行的任務的任務號,該值為0?15之間的一個數。例子#include<rtx51tny.h>voidtst_os_running_task(void)_task_3{unsignedchartid;tid=os_running_task_id();}8、 os_send_signal概要#include<rtx51tny.h>charos_send_signal(chartask_id);描述函數向任務task_id發(fā)送一個信號。如果指定的任務已經在等待一個信號,則該函數使任務準備執(zhí)行但不啟動它。信號存儲在任務的信號標志中。附注該函數是包含在PK51中的RTX51Tiny的組成部分。返回值成功調用后返回0,指定任務不存在時返回-1。參|閱isr_send_signal,os_clear_signal,os_wait#include<rtx51tny.h>voidsignal_func(void)_task_2{?os_send_signal(8);?}voidtst_os_send_signal(void)_task_8{?os_send_signal(2);?}9、 os_set_ready概要#include<rtx51tny.h>charos_set_ready(unsignedchartask_id);描述將以task_id指定的任務置為就緒狀態(tài)。附注:該函數是包含在PK51中的RTX51Tiny的組成部分。返回值無例子#include<rtx51tny.h>voidready_func(void)_task_2{???os_set_ready(1);?}10、 os_switch_task概要#include<rtx51tny.h>charos_switch_task(void);描述該函數允許一個任務停止執(zhí)行,并運行另一個任務。如果調用os_switch_task的任務是唯一的就緒任務,它將立即恢復運行。附注:該函數是包含在PK51中
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 施工方案對工程建設的經濟效益分析
- 跨學科視角下的情感教育實踐研究
- 音色感知在小學音樂欣賞中的重要性及其教學方法
- 藝術設計與宗教文化的互動商業(yè)空間的創(chuàng)新之路
- DB3715T 71-2025楊樹退化林修復技術規(guī)程
- 二手設備轉讓合同模板
- 2025年雜志宣傳合作協(xié)議(合同)
- 個人房屋買賣合同模板大全
- 二手房銷售合同模板大全
- 個人信用借款擔保合同范本
- 安全開發(fā)流程培訓文件課件
- 三年內無重大違法記錄聲明
- 第六章-主成分分析法
- 2024簡單的租房合同樣本下載
- 2025屆浙江省杭州七縣高三第一次調研測試生物試卷含解析
- 2022版義務教育(歷史)課程標準(附課標解讀)
- 中國慢性腎臟病早期評價與管理指南2023
- 新人教版五年級上冊數學應用題大全及答案
- 【家庭教育】0-3歲嬰幼兒早教訓練方案
- 國家中長期科技發(fā)展規(guī)劃(2021-2035)
- 建筑工人實名制管理制度及實施方案
評論
0/150
提交評論