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