日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

RTX2.02 tiny中文手册

發(fā)布時(shí)間:2024/8/1 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RTX2.02 tiny中文手册 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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 Tiny2版用戶手冊(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_readyos_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_IVLK_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)致SAVEPSWSAVEACC的覆蓋,引起系統(tǒng)崩潰。該問題在RTX51 Tiny2版中解決。如果在應(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í)鐘因子

100065535

中斷等待

20個(gè)周期或更少

上下文切換時(shí)間

100700個(gè)周期

四、工具需求

以下為使用RTX51 Tiny需要的應(yīng)用軟件:

C51編譯器

A51宏匯編器

BL51連接器或LX51連接器

RTX51TNY.LIBRTX51BT.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ū)(DATAIDATA區(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),不保存并重裝EAEA只是簡(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)度。

3C庫(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)行編譯,REGISTERBANK0

?????? 中斷函數(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)情況下,RTX5110000個(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_readyos_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_signalisr_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_SIGK_TMO:任務(wù)延遲直到有信號(hào)發(fā)給它或者指定數(shù)量的時(shí)鐘滴答

到達(dá)。

lK_SIGK_IVL:任務(wù)延遲直到有信號(hào)到來(lái)或者指定的時(shí)間間隔到達(dá)。

注:

lK_IVLK_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_taskRTX51 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_waitos_switch_task,以通知RTX51 Tingy切換到另一個(gè)任務(wù)。

os_waitos_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è)為1RTX51 Tiny就會(huì)包括保護(hù)再入滴答中斷的代碼。該值默認(rèn)為0,即認(rèn)為中斷是快速的。

4Code 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)為0CPU_IDLE宏不包括在空閑任務(wù)中。

二、庫(kù)文件

RTX51 Tiny包括兩個(gè)庫(kù)文件:

l??????? RTX51TNY.LIB用于無(wú)代碼分組(non_banking)RTX51 Tiny程序。

l??????? RTX51BT.LIB用于代碼分組code_ bankingRTX51 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_waitos_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是從015的一個(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.OBJTX_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_waitos_create_task,這樣,連接器才會(huì)包含RTX51 Tiny庫(kù)。

2uvison集成開發(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)用。

1irs_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)*/

}

2irs_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)志*/

}

3os_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)志*/

??????? ?…

??????? }

4os_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”);

??????????? }

??????????????? …

??????????? }

5os_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”);

?????????? }

????????????? …

???????? }

6os_reset_interval

概要?#include<rtx51tny.h>

????? void os_reset_interval(unsigned char ticks); /*滴答數(shù)*/

描述?用于糾正由于os_wait函數(shù)同時(shí)等待K_IVLK_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;

???????????? ???}

??????????? …

?????????? }

7os_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*/

?????????? }

?

8os_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ù)*/

??????????????? ???????}

???????????????? }

11os_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;

???????????????? ?}

??????????????? }

???????????? }

12os_wait1

  概要??? #include<rtx51tny.h>

  char os_wait1(unsigned?char?event_sel);/*要等待的事件*/

描述??? 該函數(shù)掛起當(dāng)前的任務(wù)等待一個(gè)事件發(fā)生。os_wait1os_wait的一個(gè)子集,它不支持os_wait提供的全部事件。參數(shù)event_sel指定要等待的事件,該函數(shù)只能是K_SIG

附注:

l????????? 該函數(shù)是包含于PK51中的RTX51Tiny的組成部分。

l????????? 參見事件一節(jié)獲得K_IVLK_SIGK_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_readyisr_set_ready置位的

SIG_EVENT

收到一個(gè)信號(hào)

NOT_OK

Event_sel參數(shù)的值無(wú)效

?

例子?os_wait

?

13os_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_readyisr_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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。