RTX2.02 tiny中文手册
RTX51 Tiny 2.02 中文手冊(cè)
??????? RTX51 Tiny第二版(版本2.02)是RTX51 Tiny 1.xx的升級(jí)版本,他完全集成在keil的集成開發(fā)環(huán)境中。RTX51 Tiny是一款可以運(yùn)行在大多數(shù)8051兼容的器件及其派生器件上的實(shí)時(shí)操作系統(tǒng)(準(zhǔn)實(shí)時(shí)),相對(duì)與傳統(tǒng)的開發(fā)方式而言,用實(shí)時(shí)操作系統(tǒng)進(jìn)行開發(fā)是一種效率更高的方式。作為實(shí)時(shí)操作系統(tǒng),RTX51 Tiny雖然比較簡(jiǎn)陋,但它還是具備了一些實(shí)時(shí)操作系統(tǒng)的基本要素,完全可以充當(dāng)我們進(jìn)入實(shí)時(shí)操作系統(tǒng)(RTOS)世界的領(lǐng)路者,更為重要的是,它是免費(fèi)的。:-)
??? 從本節(jié)起,我會(huì)陸續(xù)將keil幫助文件中的RTX51 Tiny第二版的使用手冊(cè)翻譯為中文,并發(fā)布給大家,供大家參考。
?
RTX51 Tiny 2.02 中文手冊(cè) part1
RTX51 Tiny第2版用戶手冊(cè)
第一章 概述
RTX51 Tiny是一種實(shí)時(shí)操作系統(tǒng)(RTOS),可以用它來(lái)建立多個(gè)任務(wù)(函數(shù))同時(shí)執(zhí)行的應(yīng)用。嵌入式應(yīng)用系統(tǒng)經(jīng)常有這種需求。RTOS可以提供調(diào)度、維護(hù)、同步等功能。
實(shí)時(shí)操作系統(tǒng)能靈活的調(diào)度系統(tǒng)資源,像CPU和存儲(chǔ)器,并且提供任務(wù)間的通信。RTX51 Tiny是一個(gè)功能強(qiáng)大的RTOS,且易于使用,它用于8051系列的微控制器。
RTX51 Tiny的程序用標(biāo)準(zhǔn)的C語(yǔ)言構(gòu)造,由Keil C51 C編譯器編譯。用戶可以很容易的定義任務(wù)函數(shù),而不需要進(jìn)行復(fù)雜的棧和變量結(jié)構(gòu)配置,只需包含一個(gè)指定的頭文件。
一、What’s?New
RTX51 Tiny第二版增加了許多新特性,使得實(shí)時(shí)軟件的開發(fā)更加簡(jiǎn)單,如:
l??????? 支持Code Banking
該選項(xiàng)必須在CONF_TNY.A51配置文件中允許,還要在L51_BANK.A51文件中定義Code Banking硬件配置。
l??????? 直接任務(wù)切換
新增加的函數(shù)(os_swich_task)允許一個(gè)任務(wù)立即切換到另一個(gè)處于就緒態(tài)的任務(wù)。
l??????? 任務(wù)就緒標(biāo)志
新的庫(kù)函數(shù)isr_set_ready和os_set_ready允許用戶給一個(gè)任務(wù)設(shè)置就緒標(biāo)志。就緒標(biāo)志可以用于將一個(gè)正在等待時(shí)間間隔、超時(shí)或信號(hào)(參見os_wait)的任務(wù)置為就緒態(tài),該任務(wù)在下一個(gè)運(yùn)行時(shí)機(jī)恢復(fù)。
l??????? CPU空閑模式支持
l??????? 支持用戶在定時(shí)器中斷的代碼
現(xiàn)在可以在定時(shí)器滴答中斷中加入自己的代碼。
該選項(xiàng)必須在CONF_TNY.A51中被允許
?l????? ?支持時(shí)間間隔調(diào)整
當(dāng)在os_wait中混合使用時(shí)間間隔和信號(hào)時(shí),可用os_reset_interval函數(shù)調(diào)整時(shí)間間隔超時(shí)值。
此外,RTX51 Tiny 進(jìn)行了完全重構(gòu),以增加靈活性,加快執(zhí)行速度,減少代碼和數(shù)據(jù)空間需求。
當(dāng)滿足以下條件時(shí),RTX51 Tiny第二版在代碼大小上的縮小尤為顯著。
1、禁止任務(wù)的時(shí)間輪轉(zhuǎn)
2、盡量少的RTX51 Tiny系統(tǒng)函數(shù)調(diào)用
3、禁止棧檢查
禁止任務(wù)時(shí)間輪轉(zhuǎn)同時(shí)也降低了數(shù)據(jù)空間的需求。
??二、已解決的問題
以下是在1.06版中已知的問題,已在第二版中得到了修正.
1、在RTX51 Tiny1.06中當(dāng)在os_wait期間產(chǎn)生一個(gè)中斷時(shí),isr_send_signal數(shù)
可能會(huì)破壞就緒狀態(tài),導(dǎo)致任務(wù)掛起,等待從中斷發(fā)來(lái)的信號(hào),該問題在RTX Tiny2中已解決。
2、在RTX51 Tiny1.06中,由于信號(hào)產(chǎn)生時(shí)時(shí)間間隔定時(shí)器的值不能被調(diào)整,因而K_IVL和K_SIG事件不能在os_wait中合并為一個(gè)調(diào)用。在RTX Tiny2中,提供的os_reset_interval函數(shù)允許調(diào)整間隔定時(shí)器。
3、在RTX51 Tiny1.06中,TIMESHARING不能被設(shè)為1,如果設(shè)為1,并且在時(shí)間片輪轉(zhuǎn)前產(chǎn)生了中斷,時(shí)間輪轉(zhuǎn)周期可能被破壞,成為延遲256個(gè)滴答數(shù),而不是1個(gè)。該問題在第2版中解決。
4、在RTX51 Tiny1.06中,當(dāng)用戶中斷執(zhí)行的時(shí)間比系統(tǒng)時(shí)鐘滴答時(shí)間長(zhǎng)時(shí),RTX51 Tiny系統(tǒng)時(shí)鐘定時(shí)器就會(huì)遞歸調(diào)用,這導(dǎo)致SAVEPSW和SAVEACC的覆蓋,引起系統(tǒng)崩潰。該問題在RTX51 Tiny第2版中解決。如果在應(yīng)用中包含一個(gè)執(zhí)行時(shí)間大于RTX51 Tiny系統(tǒng)時(shí)鐘定時(shí)間隔的中斷程序,可以將LONG_USR_INTR設(shè)為1。如果應(yīng)用程序在高優(yōu)先級(jí)中斷程序中消耗大量時(shí)間,很可能會(huì)用到這個(gè)選項(xiàng)。
?三、產(chǎn)品規(guī)約(產(chǎn)品規(guī)格說(shuō)明)
?
| 參?? 數(shù) | 范??? 圍 |
| 最大任務(wù)數(shù) | 16 |
| 最大活動(dòng)任務(wù) | 16 |
| 代碼空間需求 | 900字節(jié)最大 |
| 數(shù)據(jù)空間需求 | 7字節(jié) |
| 棧空間需求 | 3字節(jié)/任務(wù) |
| 外部RAM需求 | 0字節(jié) |
| 定時(shí)器 | 0 |
| 系統(tǒng)時(shí)鐘因子 | 1000~65535 |
| 中斷等待 | 20個(gè)周期或更少 |
| 上下文切換時(shí)間 | 100~700個(gè)周期 |
四、工具需求
以下為使用RTX51 Tiny需要的應(yīng)用軟件:
C51編譯器
A51宏匯編器
BL51連接器或LX51連接器
RTX51TNY.LIB和RTX51BT.LIB庫(kù)文件必須保存于庫(kù)路徑下,通常,該路徑是"KEIL"C51"LIB文件夾。RTX51TNY.H必須保存在包含路徑下,通常是"KEIL"C51"INC文件夾。
五、目標(biāo)需求
RTX51 Tiny運(yùn)行于大多數(shù)8051兼容的器件及其變種上。RTX51 Tiny應(yīng)用程序可以訪問外部數(shù)據(jù)存儲(chǔ)器,但內(nèi)核無(wú)此需求。
RTX51 Tiny支持Keil C51編譯器全部的存儲(chǔ)模式。存儲(chǔ)模式的選擇只影響應(yīng)用程序?qū)ο蟮奈恢?#xff0c;RTX51 Tiny系統(tǒng)變量和應(yīng)用程序棧空間總是位于8051的內(nèi)部存儲(chǔ)區(qū)(DATA或IDATA區(qū)),一般情況下,應(yīng)用程序應(yīng)使用小(SMALL)模式。
RTX51 Tiny執(zhí)行協(xié)作式任務(wù)切換(每個(gè)任務(wù)調(diào)用一個(gè)操作系統(tǒng)例程)
和時(shí)間片輪轉(zhuǎn)任務(wù)切換(每個(gè)任務(wù)在操作系統(tǒng)切換到下一個(gè)任務(wù)前運(yùn)行一個(gè)固定的時(shí)間段),不支持搶先式任務(wù)切換以及任務(wù)優(yōu)先級(jí)。RTX51 Full支持搶先式任務(wù)切換。
1、中斷
RTX51 Tiny與中斷函數(shù)并行運(yùn)作,中斷服務(wù)程序可以通過發(fā)送信號(hào)(用isr_send_signal函數(shù))或設(shè)置任務(wù)的就序標(biāo)志(用isr_set_redy函數(shù))與RTX51 Tiny的任務(wù)進(jìn)行通信。
如同在一個(gè)標(biāo)準(zhǔn)的,沒有RTX51 Tiny的應(yīng)用中一樣,中斷例程必須在RTX51Tiny應(yīng)用中實(shí)現(xiàn)并允許,RTX51 Tinyim 沒有中斷服務(wù)程序的管理。
RTX51 Tiny使用定時(shí)器0、定時(shí)器0中斷,和寄存器組1。如果在程序中使用了定時(shí)器0,則RTX51 Tiny將不能正常運(yùn)轉(zhuǎn)。你可以在RTX51 Tiny定時(shí)器0的中斷服務(wù)程序后追加自己的定時(shí)器0中斷服務(wù)程序代碼(參見硬件定時(shí)器)。
RTX51 Tiny假設(shè)總中斷總是允許(EA=1)。RTX51 Tiny庫(kù)例程在需要時(shí)改變中斷系統(tǒng)(EA)的狀態(tài),以確保RTX51 Tiny的內(nèi)部結(jié)構(gòu)不被中斷破壞。當(dāng)允許或禁止總中斷時(shí),RTX51 Tiny只是簡(jiǎn)單的改變EA的狀態(tài),不保存并重裝EA,EA只是簡(jiǎn)單的被置位或清除。因此,如果你的程序在調(diào)用RTX51例程前某止了中斷,RTX51可能會(huì)失去響應(yīng)。
在程序的臨界區(qū),可能需要在短時(shí)間內(nèi)禁止中斷。但是,在中斷禁止后,不能調(diào)用任何RTX51 Tiny的例程。如果程序確實(shí)需要禁止中斷,應(yīng)該持續(xù)很短的時(shí)間。
2、再入函數(shù)
C51編譯器提供對(duì)再入函數(shù)的支持,再入函數(shù)在再入堆棧中存儲(chǔ)參數(shù)和局部變量,從而保護(hù)遞歸調(diào)用或并行調(diào)用。RTX51 Tiny不支持對(duì)C51再入棧的任何管理。因此,如果在程序中使用再入函數(shù),必須確保這此函數(shù)不調(diào)用任何RTX51 Tiny系統(tǒng)函數(shù),且不被循環(huán)任務(wù)切掉所打斷。
僅用寄存器傳遞參數(shù)和保存自動(dòng)變量的C函數(shù)具有內(nèi)在的再入性,可以無(wú)限制的調(diào)用RTX51 Tiny。
非可再入C函數(shù)不能被超過一個(gè)以上的任務(wù)或中斷過程調(diào)用。非再入C51函數(shù)在靜態(tài)存儲(chǔ)區(qū)段保存參數(shù)和自動(dòng)變量(局部數(shù)據(jù)),該區(qū)域在函數(shù)被多個(gè)任務(wù)同時(shí)調(diào)用或遞歸調(diào)用時(shí)可能會(huì)被修改。
如果確定多個(gè)任務(wù)不會(huì)遞歸(或同時(shí))調(diào)用,則多個(gè)任務(wù)可以調(diào)用非再入函數(shù)。通常,這意味著必須禁止循環(huán)任務(wù)調(diào)度,且該非再入函數(shù)不能調(diào)用任何RTX51 Tiny系統(tǒng)函數(shù)。
附注:
l??????? 如果希望在多個(gè)任務(wù)或中斷中調(diào)用再入或非再入函數(shù),應(yīng)當(dāng)禁止循
環(huán)任務(wù)調(diào)度。
3、C庫(kù)例程
可再入C51庫(kù)函數(shù)可在任何任務(wù)中無(wú)限制的使用。對(duì)于非再入的C51庫(kù)函數(shù),同樣有非可再入C函數(shù)的限制。
4、多數(shù)據(jù)指針
Keil C51編譯器允許使用多數(shù)據(jù)指針(存在于許多8051的派生芯片中), RTX51 Tiny不提供對(duì)它們的支持.因此,在RTX51 Tiny的應(yīng)用程序中應(yīng)小心使用多數(shù)據(jù)指針。
從本質(zhì)上說(shuō),必須確保循環(huán)任務(wù)切換不會(huì)在執(zhí)行改變數(shù)據(jù)指針選擇器的代碼時(shí)發(fā)生。
附注:
l??????? 如果要使用多數(shù)據(jù)指針,應(yīng)該禁止循環(huán)任務(wù)切換。
5、運(yùn)算單元
Keil C51編譯器允許使用運(yùn)算單元(存在于許多8051的派生芯片中)。RTX51 Tiny不提供對(duì)它們的支持。
因此,在RTX51 Tiny的應(yīng)用程序中須小心使用運(yùn)算單元。
從本質(zhì)上說(shuō),必須確保循環(huán)任務(wù)切換不會(huì)在執(zhí)行用運(yùn)算單元的代碼時(shí)發(fā)生。
附注:
l??????????? 如果希望使用運(yùn)算單元,應(yīng)禁止循環(huán)任務(wù)切換。
6、寄存器組
????? ??RTX51 Tiny分配所有的任務(wù)到寄存器0,因此,所有的函數(shù)必須用C51的默認(rèn)設(shè)置進(jìn)行編譯,REGISTERBANK(0)。
?????? 中斷函數(shù)可以使用剩余的寄存器組。然而,RTX51 Tiny需要寄存器組區(qū)域中的6個(gè)永久性的字節(jié),用于這些字節(jié)的寄存器組在配置文件中指定。
RTX51 Tiny 2.02 中文手冊(cè) part2
第二章?實(shí)時(shí)程序
實(shí)時(shí)程序必須對(duì)實(shí)時(shí)發(fā)生的事件快速響應(yīng)。事件很少的程序不用實(shí)時(shí)操作系統(tǒng)也很容易實(shí)現(xiàn)。隨著事件的增加,編程的復(fù)雜程度和難度也隨之增大,這正是RTOS的用武之地。
一、單任務(wù)程序
嵌入式程序和標(biāo)準(zhǔn)C程序都是從main函數(shù)開始執(zhí)行的,在嵌入式應(yīng)用中,main通常是一個(gè)無(wú)限循環(huán),可以認(rèn)為是一個(gè)持續(xù)執(zhí)行的單個(gè)任務(wù),例如:
void main (void)
﹛while(1)???? ??????/*永遠(yuǎn)重復(fù)*/
﹛
do_something(); ?/*執(zhí)行 do_something“任務(wù)”*/
﹜
﹜
在這個(gè)例子里,do_something函數(shù)可以認(rèn)為是一個(gè)單任務(wù),由于僅有一個(gè)任務(wù)在執(zhí)行,所以沒有必要進(jìn)行多任務(wù)處理或使用多任務(wù)操作系統(tǒng)。
二、多任務(wù)程序
許多C程序通過在一個(gè)循環(huán)里調(diào)用服務(wù)函數(shù)(或任務(wù))來(lái)實(shí)現(xiàn)偽多任務(wù)調(diào)度。如:
void main(void)
﹛
int counter="0";
while(1)????? ???????????????????/*一直重復(fù)執(zhí)行*/
﹛
check_serial_io();???? ?????????/*檢查串行輸入*/
process_serial_cmds() ;???????? /*處理串行輸入*/
check_kbd_io();??????????????/*檢查鍵盤輸入*/
process_kbd_cmds(); ??????????/*處理鍵盤輸入*/
adjust|ctrlr_parms();????????? /*調(diào)整控制器*/
counter++;?????????????????? /*增加計(jì)數(shù)器*/
﹜
﹜
該例中,每個(gè)函數(shù)執(zhí)行一個(gè)單獨(dú)的操作或任務(wù),函數(shù)(或任務(wù))按次序依次執(zhí)行。
當(dāng)任務(wù)越來(lái)越多,調(diào)度問題就被自然而然的提出來(lái)了。例如,如果process_kbd_cmds函數(shù)執(zhí)行時(shí)間較長(zhǎng),主循環(huán)就可能需要較長(zhǎng)的時(shí)間才能返回來(lái)執(zhí)行check_sericd_io函數(shù),導(dǎo)致串行數(shù)據(jù)可能被丟失。當(dāng)然,可以在主循環(huán)中更
頻繁的調(diào)用check_serial_io函數(shù)以糾正這個(gè)問題,但最終這個(gè)方法還是會(huì)失效
三、RTX51 Tiny 程序
當(dāng)使用Rtx51Tiny時(shí),為每個(gè)任務(wù)建立獨(dú)立的任務(wù)函數(shù),例如:
void check_serial_io_task(void) _task_ 1
﹛/*該任務(wù)檢測(cè)串行I/0*/﹜
void process_serial_cmds_task(void) _task_ 2
﹛/*該任務(wù)處理串行命令*/﹜
void check_kbd_io_task(void) _task_ 3
﹛/*該任務(wù)檢測(cè)鍵盤I/O*/﹜
void process_kbd_cmds_task(void) _task_ 4
﹛/*處理鍵盤命令*/﹜?
void startup-_task(void) _task_ 0
﹛
os_create_task(1); ????????????????/*建立串行I/O任務(wù)*/
os_create_task(2); ????????????????/*建立串行命令任務(wù)*/
os_create_task(3);?????????? ????/*建立鍵盤I/O任務(wù)*/
os_create_task(4); ???????????????/*建立鍵盤命令任務(wù)*/
os_delete_task(0); ????????????????/*刪除啟動(dòng)任務(wù)*/
﹜
該例中,每個(gè)函數(shù)定義為一個(gè)RTX51 Tiny任務(wù)。RTX51 Tiny程序不需要main函數(shù),取而代之,RTX51 Tiny從任務(wù)0開始執(zhí)行。在典型的應(yīng)用中,任務(wù)0簡(jiǎn)單的建立所有其他的任務(wù)。
?
?
RTX51 Tiny 2.02 中文手冊(cè) part3
第三章?原理
RTX51 Tiny 用于管理目標(biāo)系統(tǒng)的資源,本章討論RTX51 Tiny如何使用這些資源。
一、定時(shí)器滴答中斷
RTX51 Tiny 用標(biāo)準(zhǔn)8051的定時(shí)器0(模式1)生產(chǎn)一個(gè)周期性的中斷。該中斷就是RTX51 Tiny的定時(shí)滴答(Timer Tick)。 庫(kù)函數(shù)中的超時(shí)和時(shí)間間隔就是基于該定時(shí)滴答來(lái)測(cè)量的。
默認(rèn)情況下,RTX51每10000個(gè)機(jī)器周期產(chǎn)生一個(gè)滴答中斷,因此,對(duì)于運(yùn)行于12MHZ的標(biāo)準(zhǔn)8051來(lái)說(shuō),滴答的周期是0.01秒,也即頻率是100HZ(12MHz/12/10000)。該值可以在CONF_TNY.A51配置文件中修改。
附注:
l可以在RTX51的定時(shí)滴答中斷里追加自己的代碼。參見CONF_TNY.A51 配置文件。
l關(guān)于RTX51 Tiny如何使用中斷可以參考概述中中斷一節(jié)的敘述。
二、任務(wù)
RTX51 Tiny本質(zhì)上是一個(gè)任務(wù)切換器,建立一個(gè)RTX51 Tiny程序,就
是建立一個(gè)或多個(gè)任務(wù)函數(shù)的應(yīng)用程序。下面的信息可以幫助你快速的理解
RTX51 。
l任務(wù)用新的關(guān)鍵字由C語(yǔ)言定義,該關(guān)鍵字是Keic C51 所支持的。
lRTX51 Tiny維護(hù)每個(gè)任務(wù)的正確狀態(tài)(運(yùn)行、就緒、等待、刪除、超時(shí))。
l某個(gè)時(shí)刻只有一個(gè)任務(wù)處于運(yùn)行態(tài)。
l任務(wù)可能處于就緒態(tài)、等待態(tài)、刪除態(tài)或超時(shí)態(tài)。
l空閑任務(wù)(Idle_Task)總是處于就緒態(tài),當(dāng)定義的所有任務(wù)處于阻?塞狀態(tài)時(shí),運(yùn)行該任務(wù)。
三、任務(wù)管理
每個(gè)RTX51 Tiny 任務(wù)總是處于下述狀態(tài)中的一種狀態(tài)中。
?
| 狀 態(tài) | 描??? 述 |
| 運(yùn) 行 | 正在運(yùn)行的任務(wù)處于運(yùn)行態(tài)。某個(gè)時(shí)刻只能有一個(gè)任務(wù)處于該狀態(tài)。 os_running_task_id 函數(shù)返回當(dāng)前正在運(yùn)行的任務(wù)編號(hào)。 |
| 就 緒 | 準(zhǔn)備運(yùn)行的任務(wù)處于就緒態(tài)。一旦運(yùn)行的任務(wù)完成了處理,RTX51 ???Tiny選擇一個(gè)就緒的任務(wù)執(zhí)行。一個(gè)任務(wù)可以通過用os_set_ready或os_set_ready函數(shù)設(shè)置就緒標(biāo)志來(lái)使其立即就緒(即便該任務(wù)正在等待超時(shí)或信號(hào))。 |
| 等 待 | 正在等待一個(gè)事件的任務(wù)處于等待態(tài)。一旦事件發(fā)生,任務(wù)切換到就緒態(tài)。Os_wait函數(shù)用于將一個(gè)任務(wù)置為等待態(tài)。 |
| 刪 除 | 沒有被啟動(dòng)或已被刪除的任務(wù)處于刪除態(tài)。Os-delete-task函數(shù)將一個(gè)已經(jīng)啟動(dòng)(用os_create_task)的任務(wù)置為刪除態(tài)。 |
| 超 時(shí) | 被超時(shí)循環(huán)中斷的任務(wù)處于超時(shí)態(tài),在循環(huán)任務(wù)程序中,該狀態(tài)相當(dāng)于就緒態(tài)。 |
?
四、事件
?
在實(shí)時(shí)操作系統(tǒng)中,事件可用于控制任務(wù)的執(zhí)行,一個(gè)任務(wù)可能等待一個(gè)事件,也可能向其他任務(wù)發(fā)送任務(wù)標(biāo)志。
os_wait函數(shù)可以使一個(gè)任務(wù)等待一個(gè)或多個(gè)事件。
l超時(shí)是一個(gè)任務(wù)可以等待的公共事件。超時(shí)就是一些時(shí)鐘滴答數(shù),?? 當(dāng)一個(gè)任務(wù)等待超時(shí)時(shí),其他任務(wù)可以執(zhí)行。一旦到達(dá)指定數(shù)量的滴答數(shù),任務(wù)就可以繼續(xù)執(zhí)行。
l時(shí)間間隔(Interval)是一個(gè)超時(shí)(Timeout)的變種。時(shí)間間隔與超
時(shí)類似,不同的是時(shí)間間隔是相對(duì)于任務(wù)上次調(diào)用os_wait函數(shù)的指定數(shù)量的時(shí)鐘滴答數(shù)。
l信號(hào)是任務(wù)間通信的方式。一個(gè)任務(wù)可以等待其他任務(wù)給它發(fā)信號(hào) (用os_send_signal和isr_send_signal函數(shù))。
l每個(gè)任務(wù)都有一個(gè)可被其它任務(wù)設(shè)置的就緒標(biāo)志(用os_set_ready和
isr_set_ready函數(shù))。一個(gè)個(gè)等待超時(shí)、時(shí)間間隔或信號(hào)的任務(wù)可以通過設(shè)置它的就緒標(biāo)志來(lái)啟動(dòng)。
lisr_set_ready函數(shù))。一個(gè)等待超時(shí)、時(shí)間間隔或信號(hào)的任務(wù)可以通?過設(shè)置它的就緒標(biāo)志來(lái)啟動(dòng)。
下表是os_wait函數(shù)等待的事件:
| K_IVL | 等待制定的時(shí)間 |
| 隔K_SIG | 等待一個(gè)信號(hào) |
| K_TMO | 等待指定的超時(shí) |
?
?
?
os-wait返回時(shí),返回值表明發(fā)生了的事件:
| 返 回 值 | 意?義 |
| RDY_EVENT | 任務(wù)的就緒標(biāo)志被置位 |
| SIG_EVENT | 收到一個(gè)信號(hào) |
| TMO_EVENT | 超時(shí)完成或時(shí)間間隔到達(dá)。 |
?
?
?
os_wait可以等待下面的事件組合:
lK_SIG︱K_TMO:任務(wù)延遲直到有信號(hào)發(fā)給它或者指定數(shù)量的時(shí)鐘滴答
到達(dá)。
lK_SIG︱K_IVL:任務(wù)延遲直到有信號(hào)到來(lái)或者指定的時(shí)間間隔到達(dá)。
附 注:
lK_IVL和K_TMO事件不能組合
五、任務(wù)調(diào)度程序:
任務(wù)調(diào)度程序給任務(wù)分配處理器,RTX51 Tiny調(diào)度程序用下列規(guī)則確定
哪個(gè)任務(wù)要被運(yùn)行:
當(dāng)前任務(wù)被中斷如果:
1、任務(wù)調(diào)用了os_switch_task且另一個(gè)任務(wù)正準(zhǔn)備運(yùn)行。
2、任務(wù)調(diào)用了os_wait且指定的事件沒有發(fā)生。
3、任務(wù)執(zhí)行了比輪轉(zhuǎn)時(shí)間片更長(zhǎng)的時(shí)間。
另一個(gè)任務(wù)啟動(dòng)如果:
1、無(wú)其它任務(wù)運(yùn)行。
2、要啟動(dòng)的任務(wù)處于就緒態(tài)或超時(shí)態(tài)。
六、循環(huán)任務(wù)切換
RTX51 Tiny可以配置為用循環(huán)法進(jìn)行多任務(wù)處理(任務(wù)切換)。循環(huán)法允許
并行的執(zhí)行若干任務(wù)。任務(wù)并非真的同時(shí)執(zhí)行,而是分時(shí)間片執(zhí)行的(CPU時(shí)間分
成時(shí)間片,RTX51 Tiny給每個(gè)任務(wù)分配一個(gè)時(shí)間片)。由于時(shí)間片很短(幾毫秒),
看起來(lái)好象任務(wù)在同時(shí)執(zhí)行。
任務(wù)在它的時(shí)間片內(nèi)持續(xù)執(zhí)行(除非任務(wù)的時(shí)間片用完)。然后,RTX51 Tin
g切換到下一個(gè)就緒的任務(wù)運(yùn)運(yùn)行。時(shí)間片的持續(xù)時(shí)間可以通過RTX51 Ting配置
定義。
下面是一個(gè)RTX51 Tiny程序的例子,用循環(huán)法多任務(wù)處理,程序中的兩個(gè)任務(wù)
是計(jì)數(shù)器循環(huán)。RTX51 Tiny在啟動(dòng)時(shí)執(zhí)行函數(shù)名為job0的任務(wù)0,該函數(shù)建立了另
一個(gè)任務(wù)job1,在job0執(zhí)行完它的時(shí)間片后, RTX51 Tiny切換到job1。在job1執(zhí)
行完它的時(shí)間片后,RTX51 Ting又切換到job0,該過程無(wú)限重復(fù)。
#include
int counter0;
int counter1;
void job0(void)? _task_? 0
﹛
os_create(1);??? ??????????/*標(biāo)記任務(wù)1為就緒*/
while(1)
﹛ ????????????????????????/*無(wú)限循環(huán)*/
counter0++; ????????????/*更新記數(shù)器*/
}
}
void job1(void) _task_1
﹛
while(1)
﹛???????????? ??????????/*無(wú)限循環(huán)*/
counter++;??????????????? /*更新記數(shù)器*/
}
}
附 注:
l可以用os_wait 或os_switch_task讓RTX51 Tiny切換到另一個(gè)任務(wù)而不是
等待任務(wù)的時(shí)間片用完。 os_wait函數(shù)掛起當(dāng)前的任務(wù)(使之變?yōu)榈却龖B(tài))直
到指定的事件發(fā)生(接著任務(wù)變?yōu)榫途w態(tài))。在此期間,任意數(shù)量的其他任務(wù)
可以運(yùn)行。
七、協(xié)作任務(wù)切換
如果禁止了循環(huán)任務(wù)處理,就必須讓任務(wù)以協(xié)作的方式運(yùn)作,在每個(gè)任務(wù)
里調(diào)用os_wait或os_switch_task,以通知RTX51 Tingy切換到另一個(gè)任務(wù)。
os_wait與os_switch_task的不同是,os_wait是讓任務(wù)等待一個(gè)事件,而
os_switch_task是立即切換到另一個(gè)就緒的任務(wù)。
八、空閑任務(wù)
沒有任務(wù)準(zhǔn)備運(yùn)行時(shí),RTX51 Ting執(zhí)行一個(gè)空閑任務(wù)。空閑任務(wù)就是一個(gè)
無(wú)限循環(huán)。如:
SJMP$
有些8051兼容的芯片提供一種降低功耗的空閑模式,該模式停止程序的執(zhí)
行,直到有中斷產(chǎn)生。在該模式下,所有的外設(shè)包括中斷系統(tǒng)仍在運(yùn)行。
RTX51 Tiny允許在空閑任務(wù)中啟動(dòng)空閑模式(在沒有任務(wù)準(zhǔn)備執(zhí)行時(shí))。當(dāng)
RTX51 Tiny的定時(shí)滴答中斷(或其它中斷)產(chǎn)生時(shí),微控制器恢復(fù)程序的執(zhí)行。
空閑任務(wù)執(zhí)行的代碼在CONF_TNY.A51配置文件中允許和配置。
九、棧管理
RTX51 Tiny為每個(gè)任務(wù)在8051的內(nèi)部RAM區(qū)(IDATA)維護(hù)一個(gè)棧。任務(wù)
運(yùn)行時(shí),將得到可能得到的最大數(shù)量的棧空間。任務(wù)切換時(shí),先前的任務(wù)棧被
壓縮并重置,當(dāng)前任務(wù)的棧被擴(kuò)展和重置。
下圖表明一個(gè)三任務(wù)應(yīng)用的內(nèi)部存儲(chǔ)器的布局。
圖略…… :-)
?STACK表示棧的起始地址。該例中,位于棧下方的對(duì)象包括全局變量、寄存器和位尋址存儲(chǔ)器,剩余的存儲(chǔ)器用于任務(wù)棧。存儲(chǔ)器的頂部可在配置中指定。
?
?
RTX51 Tiny 2.02 中文手冊(cè) part4
第四章RTX51 Tiny配置
RTX51 Tiny可根據(jù)應(yīng)用的不同定制。
一、配置
建立了嵌入式應(yīng)用后,RTX51 Tiny必須要配置。所有的配置設(shè)置都在CONF_TNY.A51文件中,該文件位于"KEIL"CS1"RTXTINY2"目錄下。在CONF_TNY.A51中的配置選項(xiàng)允許:
l??????? 指定滴答中斷寄存器組。
l??????? 指定滴答間隔(以8051機(jī)器周期為單位)。
l??????? 指定在滴答中斷中執(zhí)行的代理。
l??????? 指定循環(huán)超時(shí)。
l??????? 允許或禁止循環(huán)任務(wù)切換。
l??????? 指定應(yīng)用程序占用長(zhǎng)時(shí)間的中斷。
l??????? 指定是否使用code banking。
l??????? 定義RTX51 Tiny的棧項(xiàng)。
l??????? 指定最小的棧空間需求。
l??????? 指定棧錯(cuò)誤發(fā)生時(shí)要執(zhí)行的代碼。
l??????? 定義棧錯(cuò)誤發(fā)生時(shí)要執(zhí)行的代碼。
l??????? 定義空閑任務(wù)操作。
CONF_TNY.A51的默認(rèn)配置包含在RTX51 Tiny庫(kù)中。但是,為了保證配置的有效和正確,須得將CONF_TNY.A51文件拷貝到工程目錄下并將其加入列工程中。
通過改變CONF_TNY.A51中的設(shè)置來(lái)定制RTX51 Tiny的配置。
附注:
l??????? 如果在工程中沒有包含配置文件(CONF_TNY.A51),庫(kù)中的默認(rèn)配置
將自動(dòng)加載,后續(xù)的改變將存儲(chǔ)在庫(kù)中,這樣可能會(huì)對(duì)以后的應(yīng)用起到不良影響。
1、硬件定時(shí)器
下面的常數(shù)指定RTX51 Tiny的硬件定時(shí)器如何配置。
l??????? INT_REGBANK指定用于定時(shí)器中斷的寄存器組,默認(rèn)為1(寄存
器組1)。
l??????? INT_CLOCK指定定時(shí)器產(chǎn)生中斷前的指令周期數(shù)。該值用于計(jì)算定時(shí)器的重裝值(65536_INT_CLOCK)。默認(rèn)該值為10000。
l??????? HW_TIMER_CODE是一個(gè)宏,它指出在RTX51 Tiny定時(shí)器中斷結(jié)尾處要執(zhí)行的代碼。該宏默認(rèn)是中斷返回,如:
HW_TIMER_CODE MACRO
RETI
ENDM
2、循環(huán)
默認(rèn)情況下,循環(huán)任務(wù)切換是使能的。下面的常數(shù)允許你配置循環(huán)任
務(wù)切換的時(shí)間或完全禁止循環(huán)切換。
l??????? TIMESHARING指定每個(gè)任務(wù)在循環(huán)任務(wù)切換前運(yùn)行的滴答數(shù)。設(shè)為0時(shí)禁止循環(huán)任務(wù)切換。默認(rèn)值為5個(gè)滴答數(shù)。
3、長(zhǎng)中斷
一般情況下,中斷服務(wù)程序設(shè)計(jì)為快速執(zhí)行的程序,在某些情況下,中斷
服務(wù)程序可能執(zhí)行較長(zhǎng)的時(shí)間。如果一個(gè)高優(yōu)先級(jí)的中斷服務(wù)程序執(zhí)行的時(shí)間比RTX51 Tiny滴答的時(shí)間間隔長(zhǎng),RTX51 Tiny定時(shí)器中斷可能被中斷并可能重入(被后繼的RTX51 定時(shí)器中斷)。
?如果要使用執(zhí)行時(shí)間較長(zhǎng)的高優(yōu)先級(jí)中斷,應(yīng)該考慮減少ISR中執(zhí)行的作
業(yè)的數(shù)量,改變RTX51 定時(shí)器的滴答率使其低一些,或者使用下面的配置選項(xiàng)。
l??????? LONG_USR_ISR指示器是否有執(zhí)行時(shí)間長(zhǎng)于滴答時(shí)間間隔的中斷(滴答中斷除外)。當(dāng)該選項(xiàng)設(shè)為1,RTX51 Tiny就會(huì)包括保護(hù)再入滴答中斷的代碼。該值默認(rèn)為0,即認(rèn)為中斷是快速的。
4、Code Banking
以下配置選項(xiàng)允許你指定RTX51 Tiny應(yīng)用是否使用code banking。
CODE_BANKING指定是否使用code banking。使用code banking時(shí)該選項(xiàng)必須設(shè)為1,未使用code banking時(shí),該選項(xiàng)須設(shè)為0,默認(rèn)的值為0。
附注
l??????? L51_BANK.A51 2.12及其以上的需要RTX51 Tiny程序使用code banking。
5、棧
一些選項(xiàng)用于棧配置。下面的常數(shù)定義用于棧區(qū)域的內(nèi)部RAM的大小和
棧的最小自由空間。一個(gè)宏允許指定當(dāng)沒有足夠的自由棧時(shí)執(zhí)行的代碼。
l??????? RAM TOP指定片上棧頂部的地址。除所有位于棧之上的IDATA變量,否則不應(yīng)修改該值。該值默認(rèn)為OXFF。
l??????? FREE_STACK指定棧允許的最小字節(jié)數(shù)。切換任務(wù)時(shí),如果RTX51 Tiny檢測(cè)到低于該值時(shí),STACK_ERROR宏將被執(zhí)行。設(shè)為0禁止棧檢查,默認(rèn)設(shè)置是20字節(jié)。
l??????? STACK_ERROR是一個(gè)指定發(fā)生棧錯(cuò)誤(少于FREE_STACK字節(jié)數(shù))時(shí)要執(zhí)行的指令的宏。該宏默認(rèn)是禁止中斷并進(jìn)入無(wú)限循環(huán):
?? STACK_ERROR?MACRO
?? CLR?? EA
SJMP$
ENDM
6、空閑任務(wù)
當(dāng)沒有任務(wù)準(zhǔn)備運(yùn)行時(shí),RTX51 Tiny執(zhí)行一個(gè)空閑任務(wù)。空閑任務(wù)只是
一個(gè)循環(huán),不做任何事——只是等待滴答中斷切換到一個(gè)就緒的任務(wù)。下列常數(shù)允許配置空閑任務(wù)。
l??????? CPU_IDLE宏指定空閑任務(wù)中執(zhí)行的代碼。默認(rèn)的指令是置位PCON寄存器的空閑模式位(大多數(shù)8051設(shè)備適用)。這將停止執(zhí)行程序,降低功耗,直到有中斷產(chǎn)生:
CPU_IDLE MACRO
ORL?PCON,﹟1
ENDM
l??????? CPU_IDLE MACRO指定在空閑任務(wù)中是否執(zhí)行CPU_IDLE宏。
??? 默認(rèn)為0,CPU_IDLE宏不包括在空閑任務(wù)中。
二、庫(kù)文件
RTX51 Tiny包括兩個(gè)庫(kù)文件:
l??????? RTX51TNY.LIB用于無(wú)代碼分組(non_banking)的RTX51 Tiny程序。
l??????? RTX51BT.LIB用于代碼分組(code_ banking)的RTX51 Tiny程序。
在"KEIL"C51"RTXTINYZ"SOURCECODE"下的RTXTINZ.PRJ工程用來(lái)建立這兩個(gè)庫(kù)。
附注:
l??????? 應(yīng)用時(shí)并不需要顯式的包含一個(gè)RTX51 Tiny庫(kù)。當(dāng)使用μVision集成環(huán)境或命令行連接器時(shí)會(huì)自動(dòng)執(zhí)行。
l??????? 建立RTX51 Tiny庫(kù)時(shí),默認(rèn)配置文件(CONF_TNY.A51)包括在庫(kù)中。如果在工程中未顯示包含配置文件(CONF_TNY.A51),將從庫(kù)中包含一個(gè)默認(rèn)的,后續(xù)對(duì)配置文件的修改將存儲(chǔ)到庫(kù)中,這可能對(duì)你的應(yīng)用產(chǎn)生負(fù)面影響。
三、優(yōu)化
下面的事情是為了優(yōu)化RTX51 Tiny程序應(yīng)該做的。
l??????? 如果可能,禁止循環(huán)任務(wù)切換。循環(huán)切換需要13個(gè)字節(jié)的棧空間存儲(chǔ)任務(wù)環(huán)境和所有的寄存器。當(dāng)任務(wù)切換通過調(diào)用RTX51 Tiny庫(kù)函數(shù)(像os_wait或os_switch_task)觸發(fā)時(shí),不需要這些空間。
l??????? 用os_wait替代依靠循環(huán)超時(shí)切換任務(wù)。這將是提高系統(tǒng)反應(yīng)時(shí)間和任務(wù)響應(yīng)時(shí)間。
l??????? 避免將滴答中斷率設(shè)置的太快。
為了最小化存儲(chǔ)器需求,從0開始對(duì)任務(wù)編號(hào)。
?
?
?
?
RTX51 Tiny 2.02 中文手冊(cè) part5
第五章?使用RTX51 Tiny
一般地,下面三步是使用RTX51 Tiny要實(shí)現(xiàn)的
l??????? 編寫RTX51程序
l??????? 編譯并連接程序
l??????? 測(cè)試和調(diào)試程序
一、編寫程序
?? 寫RTX51 Tiny程序時(shí),必須用關(guān)鍵字對(duì)任務(wù)進(jìn)行定義,并使用在RTX51TNY.H中聲明的RTX51 Tiny核心例程。
1、包含文件
RTX51 Tiny僅需要包含一個(gè)文件:RTX51TNY.H。所有的庫(kù)函數(shù)和常數(shù)都在該頭文件中定義。你可以在你的源文件中包含它:
#include<rtx51tny.h>
2、編程原則
以下是建立RTX51 Tiny程序時(shí)必須遵守的原則:
①、確保包含了RTX51TNY.H頭文件。
②、不要建立main函數(shù),RTX51 Tiny有自己的mian函數(shù)。
③、程序必須至少包含一個(gè)任務(wù)函數(shù)。
④、中斷必須有效(EA=1),在臨界區(qū)如果要禁止中斷時(shí)一定要小心。參見概述中的中斷一節(jié)。
⑤、程序必須至少調(diào)用一個(gè)RTX51 Tiny庫(kù)函數(shù)(象os_wait)。否則,連接起將不包含RTX51 Tiny庫(kù)。
⑥、Task 0是程序中首先要執(zhí)行的函數(shù),必須在任務(wù)0中調(diào)用os_create_task 函數(shù)以運(yùn)行其余任務(wù)。
⑦、任務(wù)函數(shù)必須是從不退出或返回的。任務(wù)必須用一個(gè)while(1)或類似的結(jié)構(gòu)重復(fù)。用os_delete_task函數(shù)停止運(yùn)行的任務(wù)。
⑧、必須在uvison中指定RTX51 Tiny,或者在連接器命令行中指定。更多技術(shù)文檔參見keil軟件知識(shí)庫(kù)。
3、定義任務(wù)
??? 實(shí)時(shí)或多任務(wù)應(yīng)用是由一個(gè)或多個(gè)執(zhí)行具體操作的任務(wù)組成的,RTX51 Tiny支持最多16個(gè)任務(wù)。
任務(wù)就是一個(gè)簡(jiǎn)單的C函數(shù),返回類型為void,參數(shù)列表為void,并且用_task_聲明函數(shù)屬性。例如:
void func (void)_task_task_id
這里,func是任務(wù)函數(shù)的名字,task_id是從0到15的一個(gè)任務(wù)ID號(hào)。
下面的例子定義函數(shù)job0編號(hào)為0的任務(wù)。該任務(wù)使一個(gè)計(jì)數(shù)器遞增并不斷重復(fù)。
void job0(void)_task_0
{
??? while(1)
{
????? Counter0++;
???? }
}
附注:
l??????? 所有的任務(wù)都應(yīng)該是無(wú)限循環(huán),任務(wù)一定不能返回。
l??????? 任務(wù)不能返回一個(gè)函數(shù)值,它們的返回類型必須是void。
l??????? 不能對(duì)一個(gè)任務(wù)傳遞參數(shù),任務(wù)的形參必須是void。
l??????? 每個(gè)任務(wù)必須賦予一個(gè)唯一的,不重復(fù)的ID。
l??????? 為了最小化RTX51 Tiny的存儲(chǔ)器需求,從0開始對(duì)任務(wù)進(jìn)行順序編號(hào)。
二、編譯和連接
有兩種方法編譯和連接RTX51 Tiny應(yīng)用程序。
l??????? 用uvison集成開發(fā)環(huán)境
l??????? 用命令行工具
1、命令行工具
RTX51 Tiny已經(jīng)完全集成到了C51編譯語(yǔ)言中,這使得生成RTX51 Tiny應(yīng)
用非常容易。建立RTX51 Tiny程序只需編寫C函數(shù),無(wú)需使用匯編。
從命令行編譯RTX51 Tiny程序…
按常規(guī)方式調(diào)用編譯器,無(wú)需特別的編譯指示。例如:
C51?RTXPROG.C?DEBUG?OBJECTEXTEND
產(chǎn)生的RTXPROG.OBJ文件中包含C代碼和定義的RTX51 Tiny任務(wù)。
從命令行連接RTX51 Tiny程序:
l??????? 在連接器命令行內(nèi)指定RTX51TNY指示
l??????? 在目標(biāo)文件列表中包含RTX_CONF.OBJ文件(如果改變了配置)
例如:BL51?RTPROG.OBJ, RTX_CONF.OBJ?RTX51TNY
RTX51TNY指示命令連接器連接RTPROG.OBJ和TX_CONF.OBJ并且包含RTX51 Tiny庫(kù)。這樣就建立了RTX51 Tiny程序。
附注:
l??????? 不要在RTX51 Tiny程序中建立mian函數(shù),只建立任務(wù)函數(shù)就可以。main函數(shù)包含在RTX51 Tiny庫(kù)中,它啟動(dòng)操作系統(tǒng)和任務(wù)0。如果在程序中包含了main函數(shù),將產(chǎn)生一個(gè)連接錯(cuò)誤指示有多個(gè)main被定義。
l??????? 程序中至少建立一個(gè)任務(wù)函數(shù)。
l??????? 必須至少調(diào)用一個(gè)RTX51 Tiny函數(shù)(象os_wait或os_create_task),這樣,連接器才會(huì)包含RTX51 Tiny庫(kù)。
2、uvison集成開發(fā)環(huán)境
用uvison建立RTX51 Tiny程序。
1)????? 打開目標(biāo)對(duì)話框選項(xiàng)(從project菜單選擇Options for Target)。
2)????? 選擇目標(biāo)標(biāo)簽。
3)????? 從操作系統(tǒng)選項(xiàng)列表選擇RTX51 Tiny。
三、調(diào)試
??? uvison模擬器允許運(yùn)行和測(cè)試RTX51 Tiny應(yīng)用程序。RTX51 Tiny程序的載入和無(wú)RTX51 Tiny程序的載入是一樣的。無(wú)需指定特別的命令和選項(xiàng)。
一個(gè)核心的對(duì)話框顯示RTX51 Tiny核心和程序中任務(wù)的所有特征。從Peripherals菜單選擇RTX51 Tiny Tasklist顯示該對(duì)話框。
該對(duì)話框中:
l??????? TID是在任務(wù)定義中指定的任務(wù)ID。
l??????? Task Name是任務(wù)函數(shù)的名字。
l??????? State是任務(wù)當(dāng)前的狀態(tài)。
l??????? Wait for Event指出任務(wù)正在等待什么事件。
l??????? Sig顯示任務(wù)信號(hào)標(biāo)志的狀態(tài)(1為置位)。
l??????? Timer指示任務(wù)距超時(shí)的滴答數(shù),這是一個(gè)自由運(yùn)行的定時(shí)器,僅在任務(wù)等待超時(shí)和時(shí)間間隔時(shí)使用。
l??????? Stack指示任務(wù)棧的起始地址。
?
?
RTX51 Tiny 2.02 中文手冊(cè) part6
第六章?函數(shù)參考
以下部分描述RTX51 Tiny的系統(tǒng)函數(shù)。函數(shù)依字母順序排列,分為以下部分:
概要(Summary) 簡(jiǎn)述程序作用,列出包含的文件,包括它的聲明和原型,語(yǔ)法舉例,和參數(shù)描述。
描述(Description)程序的詳細(xì)描述,如何使用。
返回值?????????? 程序返回值說(shuō)明。
參閱(see also) ?相關(guān)程序。
例子???????????? 如何正確使用該函數(shù)的程序例子中斷。
附注:
l??????? 以os_開頭的函數(shù)可以由任務(wù)調(diào)用,但不能由中斷服務(wù)程序調(diào)用。
l??????? 以isr_開頭的函數(shù)可以由中斷服務(wù)程序調(diào)用,但不能由任務(wù)調(diào)用。
1、irs_send_signal
概要: #include<rtx51tny.h>
???? char isr_send_signal(unsigned char task_id); /*信號(hào)發(fā)往的任務(wù)*/
描述: isr_send_signal函數(shù)給任務(wù)task_id發(fā)送一個(gè)信號(hào)。如果指定的任務(wù)正在等待一個(gè)信號(hào),則該函數(shù)使該任務(wù)就緒,但不啟動(dòng)它,信號(hào)存儲(chǔ)在任務(wù)的信號(hào)標(biāo)志中。
附注:
l??????? 該函數(shù)是RTX51 Tiny實(shí)時(shí)操作系統(tǒng)的一部分,僅包含于PK51中。
l??????? 該函數(shù)僅被中斷函數(shù)調(diào)用。
返回值?成功調(diào)用后返回0,如果指定任務(wù)不存在,則返回-1。
參閱?? ?os_clear_signal,os_send_signal,os_wait
例子
#include<rtx51tny.h>
void tst_isr_send_signal(void) interrupt 2
{
?? isr_send_signal(8); /*給任務(wù)8發(fā)信號(hào)*/
}
2、irs_set_ready
概要???? #include< rtx51tny.h>
??????? ?char isr_set_ready{ unsigned char task_id};/*使就緒的任務(wù)*/
描述?將由task_id指定的任務(wù)置為就緒態(tài)。
附注?
l??????? 該函數(shù)是RTX51 Tiny的一部分,包含在PK51中。
l??????? 該函數(shù)僅用于中斷函數(shù)。
返回值??? 無(wú)
例子????? ?#include< rtx51tny.h>
?????????? void tst_isr_set_ready(void)interrupt 2
{ isr_set_ready(1);/*置位任務(wù)1的就緒標(biāo)志*/
}
3、os_clear_signal
概要?? #include< rtx51tny.h>
?????? char os_clesr_signal(unsigned cahr task_id);/*清除信號(hào)的任務(wù)*/
描述??? 清除由task_id指定的任務(wù)信號(hào)標(biāo)志。
附注: 該函數(shù)是RTX51 Tiny的一部分,包含在PK51中。
返回值?信號(hào)成功清除后返回0,指定的任務(wù)不存在時(shí)返回-1。
參閱?? ?isr_send_signal,os_send_signal,os_wait
例子?? ?#include< rtx51tny.h>
??????? void tst_os_clsar_siganl(void)_task_8
??????? {
?????? ??…
??????? ?os_clear_signal(5);??????????? /*清除任務(wù)5的信號(hào)標(biāo)志*/
??????? ?…
??????? }
4、os_create_task
概要?? ?#include<rtx51tny.h>
???????char os_create_task(unsigned char task_id);/*要啟動(dòng)的任務(wù)ID*/
描述??? 啟動(dòng)任務(wù)task_id,該任務(wù)被標(biāo)記為就緒,并在下一個(gè)時(shí)間點(diǎn)開始執(zhí)行。
附注:?該函數(shù)是包含在PK51中的RTX51 Tiny的組成部分。
返回值?任務(wù)成功啟動(dòng)后返回0,如果任務(wù)不能啟動(dòng)或任務(wù)已在運(yùn)行,或沒有以task_id定義的任務(wù),返回-1。
參閱??? os_delete_task
例子??? #include< rtx51tny.h>
?????? ?#include<stdio.h>?? ?/*用于printf*/
??????? void new_task(void)_task_2
{…}
void tst_os_create_task(void)_task_0
{
…
if(os_create_task(2))
?{
printf(“couldn’t start task2"n”);
??????????? }
??????????????? …
??????????? }
5、os_delete_task
概要???? #include<rtx51tny.h>
??????? ?char os_delete_task(unsigned char task_id);/*要?jiǎng)h除的任務(wù)*/
描述???? 函數(shù)將以task_id指定的任務(wù)停止,并從任務(wù)列表中將其刪除。
附注???? 該函數(shù)是包含在PK51中的RTX51 Tiny的組成部分。
返回值?? 任務(wù)成功停止并刪除后返回0。指定任務(wù)不存在或未啟動(dòng)時(shí)返回-1。
附注???? 如果任務(wù)刪除自己,將立即發(fā)生任務(wù)切換。
參閱???? os_create_task
例子??? ?#include<rtx51tny.h>
#include<stdio.h>
???????? void tst_os_delete_task(void)_task_0
???????? {
????????????? …
?????????? if(os_delete_task(2))
?????????? {
????????????? printf(“couldn’t stop task2"n”);
?????????? }
????????????? …
???????? }
6、os_reset_interval
概要?#include<rtx51tny.h>
????? void os_reset_interval(unsigned char ticks); /*滴答數(shù)*/
描述?用于糾正由于os_wait函數(shù)同時(shí)等待K_IVL和K_SIG事件而產(chǎn)生的時(shí)間問題,在這種情況下,如果一個(gè)信號(hào)事件(K_SIG)引起os_wait退出,時(shí)間間隔定時(shí)器并不調(diào)整,這樣,會(huì)導(dǎo)致后續(xù)的os_wait調(diào)用(等待一個(gè)時(shí)間間隔)延遲的不是預(yù)期的時(shí)間周期。允許你將時(shí)間間隔定時(shí)器復(fù)位,這樣,后續(xù)對(duì)os_wait的調(diào)用就會(huì)按預(yù)期的操作進(jìn)行。
附注: 該函數(shù)是包含在PK51中的RTX51 Tiny的組成部分。
返回值?? 無(wú)
例子??? ?#include<rtx51tny.h>
??????? ?void task_func(void)_task_4
??????? ?{
?????????? …
?????????? switch(os_wait2(KSIG|K_IVL,100))
????????????? {
????????????????? case?? TMO_EVENT:
????? /*發(fā)生了超時(shí),不需要Os_reset_interval*/
break;
????????????????? case??? SIG_EVCENT:
????????????????? /*收到信號(hào),需要Os_reset_interval*/
?????????????????????? os_reset_interval(100);
????????????????? /*依信號(hào)執(zhí)行的其它操作*/
????????????????????? ?break;
???????????? ???}
??????????? …
?????????? }
7、os_running_task_id
?? 概要?? #include<rtx51tny.h>
????????? char os_running_task_id(void);
?? 描述?? 函數(shù)確認(rèn)當(dāng)前正在執(zhí)行的任務(wù)的任務(wù)ID。
?? 附注: 該函數(shù)是包含在PK51中的RTX51 Tiny的組成部分。
?? 返回值 返回當(dāng)前正在執(zhí)行的任務(wù)的任務(wù)號(hào),該值為0~15之間的一個(gè)數(shù)。
?? 例子??#include<rtx51tny.h>
???????? ?void tst_os_running_task(void)_task_3
????????? {
???????????? unsigned char tid;
???????????? tid=os_running_task_id( ); /*tid=3*/
?????????? }
?
8、os_send_signal
概要?? ?#include<rtx51tny.h>
???? char os_send_signal(char task_id);/*信號(hào)發(fā)往的任務(wù)*/
?? 描述?? 函數(shù)向任務(wù)task_id發(fā)送一個(gè)信號(hào)。如果指定的任務(wù)已經(jīng)在等待一個(gè)信號(hào),則該函數(shù)使任務(wù)準(zhǔn)備執(zhí)行但不啟動(dòng)它。信號(hào)存儲(chǔ)在任務(wù)的信號(hào)標(biāo)志中。
?? 附注?? 該函數(shù)是包含在PK51中的RTX51 Tiny的組成部分。
?? 返回值 成功調(diào)用后返回0,指定任務(wù)不存在時(shí)返回-1。
?? 參閱?? isr_send_signal,os_clear_signal,os_wait
????????? #include<rtx51tny.h>
????????? void signal_func(void)_task_2
????????? {
???????????? …
???????????? os_send_signal(8);???? /*向8號(hào)任務(wù)發(fā)信號(hào)*/
????????? ???…
????????? ?}
????????? void tst_os_send_signal(void)_task_8
????????? {
???????????? …
???????????? os_send_signal(2);??? /*向2號(hào)任務(wù)發(fā)信號(hào)*/
???????? ????…
?????????? }
9、?os_set_ready
概要??#include<rtx51tny.h>
????????? char os_set_ready(unsigned char task_id);/*使就緒的任務(wù)*/
?? 描述?? 將以task_id指定的任務(wù)置為就緒狀態(tài)。
?? 附注: 該函數(shù)是包含在PK51中的RTX51 Tiny的組成部分。
?? 返回值 無(wú)
?? 例子?? #include<rtx51tny.h>
????????? void ready_func(void)_task_2
????????? {
????????? ????…
????????????? os_set_ready(1);???? /*置位任務(wù)1的就緒標(biāo)志*/
????????? ????…
??????? ??}
10、??? os_switch_task
?????? 概要?? ?#include<rtx51tny.h>
??????????????? char os_switch_task(void);
?????? 描述??? 該函數(shù)允許一個(gè)任務(wù)停止執(zhí)行,并運(yùn)行另一個(gè)任務(wù)。如果調(diào)用os_switch_task的任務(wù)是唯一的就緒任務(wù),它將立即恢復(fù)運(yùn)行。
?????? 附注:?該函數(shù)是包含在PK51中的RTX51 Tiny的組成部分。
?????? 返回值?無(wú)
?????? 例子???? #include<rtx51tny.h>
?????????????? #include<stdio>
?????????????? void long_job(void)_task_1
?????????????? {
??????????????????? float f1,f2;
??????????????????? f1=0.0;
?????????? ?????????while(1)
????????????????????? {
???????????????????????? f2=log(f1);
???????????????????????? f1+=0.0001;
???????????????????????? os_switch_task();?? /*運(yùn)行其它任務(wù)*/
??????????????? ???????}
???????????????? }
11、os_wait
???? 概要?? #include<rtx51tny.h>
??????????? char os_wait(
????????????? unsigned char event_sel,??? /*要等待的事件*/
???????????? ?unsigned char ticks,??????/*要等待的滴答數(shù)*/
????????????? unsigned int?? dammy);?? /*無(wú)用參數(shù)*/
???? 描述?? 該函數(shù)掛起當(dāng)前任務(wù),并等待一個(gè)或幾個(gè)事件,如時(shí)間間隔,超時(shí),或從其它任務(wù)和中斷發(fā)來(lái)的信號(hào)。參數(shù)event_set指定要等待的事件,可以是下表中常數(shù)的一些組合。
?????????????
| 事?件 | 描???? 述 |
| K_IVL | 等待滴答值為單位的時(shí)間間隔 |
| K_SIG | 等待一個(gè)信號(hào) |
| K_TMO | 等待一個(gè)以滴答值為單位的超時(shí) |
?
事件可以用豎線符(“|”)進(jìn)行邏輯或。例如,K_TMO1K_SIG指定任務(wù)等待一個(gè)超時(shí)或者一個(gè)信號(hào)。
ticks參數(shù)指定要等待的時(shí)間間隔事件(K_IVL)或超時(shí)事件(K_TMO)的定時(shí)器滴答數(shù)。參數(shù)是為了提供與兼容性而設(shè)置的,在中并不使用。
????? 附注
l??????? 該函數(shù)是包含在PK中的RTX51 Tiny的組成部分。
l??????? 請(qǐng)參閱事件一節(jié)獲得關(guān)于K_IVL,K_SIG,K_TMO的更多信息。
????? 返回值 當(dāng)有一個(gè)指定的事件發(fā)生時(shí),任務(wù)進(jìn)入就緒態(tài)。任務(wù)恢復(fù)執(zhí)行時(shí),下表列出的由返回的常數(shù)指出使任務(wù)重新啟動(dòng)的事件。可能的返回值有:
?????????????
| 返 回 值 | 描??? 述 |
| RDY_EVENT | 表示任務(wù)的就緒標(biāo)志是被或函數(shù)置位的。 |
| SIG_EVENT | 收到一個(gè)信號(hào) |
| TMO_EVENT | 超時(shí)完成,或時(shí)間間隔到 |
| NOT_OK | 參數(shù)的值無(wú)效 |
?
參閱?
isr_send_signal,isr_set_ready,os_clear_signal,os_reset_interval,
os_send_signal,os_set_ready,os_wait1,os_wait2
例子?#include<rtx51tny.h>
?????????? #include<stdio.h>
?????????? void tst_os_wait(void)_task_9
?????? ????{
????????????? while(1)
?????????????? {
???????????????? char event;
???????????????? event=os_wait(K_SIG|K_TMO,50.0);
???????????????? switch(event)
???????????????? {
????????????????? ??default: ?????????????/*從不發(fā)生,該情況*/
????????????????? ??break;
?????????????????? ?case??? TMO_EVENT;/*超時(shí)*/
?????????????????? ?break;???? ??????????/*50次滴答超時(shí)*/
??????????????????? case??? SIG_EVENT; /*收到信號(hào)*/
??????????????????? break;
???????????????? ?}
??????????????? }
???????????? }
12、os_wait1
概要??? #include<rtx51tny.h>
char os_wait1(unsigned?char?event_sel);/*要等待的事件*/
描述??? 該函數(shù)掛起當(dāng)前的任務(wù)等待一個(gè)事件發(fā)生。os_wait1是os_wait的一個(gè)子集,它不支持os_wait提供的全部事件。參數(shù)event_sel指定要等待的事件,該函數(shù)只能是K_SIG。
附注:
l????????? 該函數(shù)是包含于PK51中的RTX51Tiny的組成部分。
l????????? 參見事件一節(jié)獲得K_IVL,K_SIG和K_TMO的更多信息。
返回值 ?當(dāng)指定的事件發(fā)生,任務(wù)進(jìn)入就緒態(tài)。任務(wù)恢復(fù)運(yùn)行時(shí),os_wait1
返回的值表明啟動(dòng)任務(wù)的事件,返回值見下面的常數(shù)列表:
?
?
?
| 返 回 值 | ? |
| RDY_EVENT | 任務(wù)的就緒標(biāo)志位是被os_set_ready或isr_set_ready置位的 |
| SIG_EVENT | 收到一個(gè)信號(hào) |
| NOT_OK | Event_sel參數(shù)的值無(wú)效 |
?
例子?見os_wait
?
13、os_wait2
概要??? #include<rtx51tny.h>
??????? char os_wait2(unsigned char event_sel,???? /*要等待的事件*/
unsigned char ticks);???????? /*要等待的滴答數(shù)*/
描述 函數(shù)掛起當(dāng)前任務(wù)等待一個(gè)或幾個(gè)事件發(fā)生,如時(shí)間間隔,超時(shí)或一個(gè)從其它任務(wù)或中斷來(lái)的信號(hào)。參數(shù)event_sel指定的事件可以是下列常數(shù)的組合:
?
| Event | 描 述 |
| K_IVL | 等待以滴答數(shù)為單位的時(shí)間間隔 |
| K_SIG | 等待一個(gè)信號(hào) |
| K_TMO | 等待以滴答數(shù)為單位的超時(shí) |
?
事件可以用“|”進(jìn)行邏輯或。如K_TMO|K_SIG表示任務(wù)等待一個(gè)超時(shí)或一個(gè)信號(hào)。
參數(shù)ticks 指定等待時(shí)間間隔(K_IVL)或超時(shí)(K_TMO)事件時(shí)的滴答數(shù)。
?
附注:
l????????? 該函數(shù)是包含于PK51中的RTX51Tiny的組成部分。
l????????? 參見事件一節(jié)獲得更多關(guān)于K_IVL, K_TMO,和K_SIG的信息。
返回值?當(dāng)一個(gè)或幾個(gè)事件產(chǎn)生時(shí),任務(wù)進(jìn)入就緒態(tài).任務(wù)恢復(fù)執(zhí)行時(shí), os_wait2的返回值見下面的常數(shù)列表:
?
| 返 回 值 | 描???? 述 |
| RDY_EVENT | 任務(wù)的就緒標(biāo)志是被os_set_ready或isr_set_ready函數(shù)置位的 |
| SIG_EVENT | 收到一個(gè)信號(hào) |
| TMO_EVENT | 返回時(shí)完成,或時(shí)間間隔到達(dá) |
| NOT_OK | 參數(shù)event_sel的值無(wú)效 |
?
例子??? 見os_wait。
?
轉(zhuǎn)載于:https://www.cnblogs.com/lizunicon/archive/2009/05/19/1460547.html
總結(jié)
以上是生活随笔為你收集整理的RTX2.02 tiny中文手册的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 Failed to resolve
- 下一篇: 国内android源码下载网站