項(xiàng)目10單片機(jī)嵌入式系統(tǒng)原理及應(yīng)用(賈好來)單片機(jī)實(shí)時操作系統(tǒng)RTX51_第1頁
項(xiàng)目10單片機(jī)嵌入式系統(tǒng)原理及應(yīng)用(賈好來)單片機(jī)實(shí)時操作系統(tǒng)RTX51_第2頁
項(xiàng)目10單片機(jī)嵌入式系統(tǒng)原理及應(yīng)用(賈好來)單片機(jī)實(shí)時操作系統(tǒng)RTX51_第3頁
項(xiàng)目10單片機(jī)嵌入式系統(tǒng)原理及應(yīng)用(賈好來)單片機(jī)實(shí)時操作系統(tǒng)RTX51_第4頁
項(xiàng)目10單片機(jī)嵌入式系統(tǒng)原理及應(yīng)用(賈好來)單片機(jī)實(shí)時操作系統(tǒng)RTX51_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第10章實(shí)時操作系統(tǒng)RTX5112對于單任務(wù)應(yīng)用程序或者簡單的前后臺應(yīng)用系統(tǒng)來說,編寫簡單的監(jiān)控程序就夠了。如簡易計(jì)算器、防盜報(bào)警器、容器溫度控制系統(tǒng)等等,學(xué)習(xí)前面章節(jié)的內(nèi)容就夠了。但是,許多單片機(jī)應(yīng)用程序要求同時執(zhí)行兩個或兩個以上工作或任務(wù),如汽車發(fā)動機(jī)控制、防抱死系統(tǒng)(ABS)、飛機(jī)管理系統(tǒng)、噴氣發(fā)動機(jī)控制。對于這樣的應(yīng)用程序,監(jiān)控程序的編寫相當(dāng)困難,而必須要使用實(shí)時操作系統(tǒng)RTOS。3實(shí)時多任務(wù)操作系統(tǒng)(RTOS)可以靈活地為幾個任務(wù)調(diào)度系統(tǒng)的資源(CPU、存儲器等)。RTX51是一個強(qiáng)大的實(shí)時操作系統(tǒng),而且簡單易用。它可以在所有的8051派生產(chǎn)品中使用。本章首先介紹實(shí)時操作系統(tǒng)的概念,然后介紹在8051系統(tǒng)中得到應(yīng)用的RTX51實(shí)時操作系統(tǒng)的結(jié)構(gòu)特點(diǎn)和應(yīng)用實(shí)例。4本章內(nèi)容10.1實(shí)時操作系統(tǒng)10.2RTX51實(shí)時操作系統(tǒng)10.3RTX精簡版例程10.4RTX全功能版例程

實(shí)時操作系統(tǒng)(RTOS)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時,能夠接受并以足夠快的速度予以處理,其處理的結(jié)果又能在規(guī)定的時間之內(nèi)來控制生產(chǎn)過程或?qū)μ幚硐到y(tǒng)作出快速響應(yīng),并控制所有實(shí)時任務(wù)協(xié)調(diào)一致運(yùn)行的操作系統(tǒng)。因而,提供及時響應(yīng)和高可靠性是其主要特點(diǎn)。實(shí)時操作系統(tǒng)有硬實(shí)時和軟實(shí)時之分,硬實(shí)時要求在規(guī)定的時間內(nèi)必須完成操作,這是在操作系統(tǒng)設(shè)計(jì)時保證的;軟實(shí)時則只要按照任務(wù)的優(yōu)先級,盡可能快地完成操作即可。我們通常使用的操作系統(tǒng)在經(jīng)過一定改變之后就可以變成實(shí)時操作系統(tǒng)。510.1實(shí)時操作系統(tǒng)多任務(wù)運(yùn)行的實(shí)現(xiàn)實(shí)際上是靠CPU(中央處理單元)在許多任務(wù)之間轉(zhuǎn)換和調(diào)度。CPU只有一個,輪番服務(wù)于一系列任務(wù)中的某一個。多任務(wù)運(yùn)行很像前/后臺系統(tǒng),只是后臺任務(wù)有多個。多任務(wù)運(yùn)行使CPU的利用率達(dá)到最高,并使應(yīng)用程序模塊化。在實(shí)時應(yīng)用中,多任務(wù)化的最大特點(diǎn)是,開發(fā)人員可以將很復(fù)雜的應(yīng)用程序?qū)哟位J褂枚嗳蝿?wù),應(yīng)用程序?qū)⒏菀自O(shè)計(jì)與維護(hù)。10.1.1多任務(wù)系統(tǒng)6一個任務(wù),也稱做一個線程,是一個簡單的程序,該程序可以認(rèn)為CPU完全只屬于該程序自己。實(shí)時應(yīng)用程序的設(shè)計(jì)過程包括如何把問題分割成多個任務(wù)。每個任務(wù)都是整個應(yīng)用的一部分,都被賦予一定的優(yōu)先級,有自己的一套CPU寄存器和棧空間。典型的是,每個任務(wù)都是一個無限的循環(huán),都可能處在以下5種狀態(tài)之一—休眠態(tài)、就緒態(tài)、運(yùn)行態(tài)、掛起態(tài)(等待某一事件發(fā)生)及被中斷態(tài)。10.1.2多任務(wù)系統(tǒng)中任務(wù)的定義7休眠態(tài)相當(dāng)于任務(wù)駐留在內(nèi)存中,但并不被多任務(wù)內(nèi)核所調(diào)度;就緒態(tài)意味著任務(wù)已經(jīng)準(zhǔn)備好,可以運(yùn)行,但由于該任務(wù)的優(yōu)先級比正在運(yùn)行的任務(wù)的優(yōu)先級低,還暫時不能運(yùn)行;運(yùn)行態(tài)是指任務(wù)掌握了CPU的使用權(quán),正在運(yùn)行中;掛起態(tài)也可以叫做等待事件態(tài),指任務(wù)在等待,等待某一事件的發(fā)生(例如等待某外設(shè)的I/O操作,等待某共享資源由暫不能使用變成能使用狀態(tài),等待定時脈沖的到來,或等待超時信號的到來,以結(jié)束目前的等待,等等);最后,發(fā)生中斷時,CPU提供相應(yīng)的中斷服務(wù),原來正在運(yùn)行的任務(wù)暫不能運(yùn)行,就進(jìn)入了被中斷狀態(tài)。810.1.3多任務(wù)系統(tǒng)中的任務(wù)特性任務(wù)就是一個具有獨(dú)立功能的無限循環(huán)的程序段的一次運(yùn)行活動。任務(wù)具有動態(tài)性、并發(fā)性、異步獨(dú)立性的特點(diǎn)。

1.動態(tài)性:任務(wù)的狀態(tài)是不斷變化的,一般分為:休眠態(tài),就緒態(tài),運(yùn)行態(tài),掛起態(tài)等。

2.并發(fā)性:系統(tǒng)中同時存在多個任務(wù),它們宏觀上是同時運(yùn)行的

3.異步獨(dú)立性:任務(wù)是系統(tǒng)中獨(dú)立運(yùn)行的基本單元,也是內(nèi)核分配和調(diào)度的基本單元,每個任務(wù)各自按相互獨(dú)立的不可預(yù)知的速度運(yùn)行,走走停停。每個任務(wù)都要安排一個決定其重要性的優(yōu)先級,都有一個無限循環(huán)的程序段規(guī)定其功能(如一個C語言過程),并相應(yīng)有一個數(shù)據(jù)段、堆棧段及一個任務(wù)控制塊TCB(用于保存CPU的現(xiàn)場,狀態(tài)等)。910.1.4實(shí)時操作系統(tǒng)特性1.高精度計(jì)時系統(tǒng)計(jì)時精度是影響實(shí)時性的一個重要因素。在實(shí)時應(yīng)用系統(tǒng)中,經(jīng)常需要精確確定實(shí)時地操作某個設(shè)備或執(zhí)行某個任務(wù),或精確的計(jì)算一個時間函數(shù)。這些不僅依賴于一些硬件提供的時鐘精度,也依賴于實(shí)時操作系統(tǒng)實(shí)現(xiàn)的高精度計(jì)時功能。2.多級中斷機(jī)制一個實(shí)時應(yīng)用系統(tǒng)通常需要處理多種外部信息或事件,但處理的緊迫程度有輕重緩急之分。有的必須立即作出反應(yīng),有的則可以延后處理。因此,需要建立多級中斷嵌套處理機(jī)制,以確保對緊迫程度較高的實(shí)時事件進(jìn)行及時響應(yīng)和處理。103.實(shí)時調(diào)度機(jī)制實(shí)時操作系統(tǒng)不僅要及時響應(yīng)實(shí)時事件中斷,同時也要及時調(diào)度運(yùn)行實(shí)時任務(wù)。但是,處理機(jī)調(diào)度并不能隨心所欲的進(jìn)行,因?yàn)樯婕暗絻蓚€進(jìn)程之間的切換,只能在確?!鞍踩袚Q”的時間點(diǎn)上進(jìn)行,實(shí)時調(diào)度機(jī)制包括兩個方面,一是在調(diào)度策略和算法上保證優(yōu)先調(diào)度實(shí)時任務(wù);二是建立更多“安全切換”時間點(diǎn),保證及時調(diào)度實(shí)時任務(wù)。1110.2RTX51實(shí)時操作系統(tǒng)RTX51是用于8051系列單片機(jī)的一種多任務(wù)實(shí)時操作系統(tǒng)(RTOS)。它可以簡化具有實(shí)時性要求的復(fù)雜軟件的設(shè)計(jì)。RTX51有兩個不同版本:RTX51Full和RTX51Tiny。RTX51Full允許4個任務(wù)優(yōu)先級的輪轉(zhuǎn)和搶先式任務(wù)切換,且它還可以與中斷函數(shù)并行使用。任務(wù)之間可以使用郵箱系統(tǒng)(mailboxsystem)來傳遞信號和消息。可以從存儲池進(jìn)行分配或釋放存儲器,還可以使一個任務(wù)等待,如中斷、超時、另一個任務(wù)或中斷的信號及消息。1213RTX51Tiny是RTX51Full的子集,可以容易地在沒有片外存儲器的8051單片機(jī)系統(tǒng)上運(yùn)行。RTX51Tiny也支持很多RTX51Full的功能,允許輪轉(zhuǎn)式任務(wù)切換,支持信號傳遞。但它不支持搶先式的任務(wù)切換,不能進(jìn)行信息處理,也不支持存儲池的分配和釋放。在許多單片機(jī)應(yīng)用系統(tǒng)中要求能夠同時處理多項(xiàng)工作或任務(wù),實(shí)時多任務(wù)操作系統(tǒng)(RTOS)可以靈活地為幾個任務(wù)調(diào)度系統(tǒng)的資源(CPU、存儲器等)。RTX51是一個強(qiáng)大的實(shí)時操作系統(tǒng),而且簡單易用。它可以在所有的8051派生產(chǎn)品中使用??梢杂脴?biāo)準(zhǔn)C的結(jié)構(gòu)編寫RTX-51程序,并用C51編譯它們。它只在指定任務(wù)ID和優(yōu)先權(quán)方面與標(biāo)準(zhǔn)C有一點(diǎn)不同。RTX-51程序也要求包含實(shí)時可執(zhí)行的頭文件,并用BL51鏈接器/定位器和相應(yīng)的RTX-51庫文件鏈接。10.2.1RTX-51實(shí)時操作系統(tǒng)特點(diǎn)

RTX-51實(shí)時多任務(wù)操作系統(tǒng),完全不同于一般的單片機(jī)C51程序。RTX-51有自己獨(dú)特的概念和特點(diǎn):1.中斷:RTX-51系統(tǒng)可以使用中斷,其中斷函數(shù)以并行方式工作。中斷函數(shù)可以與RTX-51內(nèi)核通信,并可以將信號或者消息發(fā)送到RTX-51的指定任務(wù)中。在RTX-51FULL中,中斷一般配置為一個任務(wù)。2.信息傳遞:

RTX-51FULL支持任務(wù)之間的信息交換,可以使用isr_recv_message、isr_send_message、os_send_message和os_wait函數(shù)來實(shí)現(xiàn)。在RTX-51系統(tǒng)中,信息是一個可以被存儲器看作是數(shù)字或者指針的16位數(shù)值。RTX-51FULL中還可以支持使用存儲器庫系統(tǒng)的變量信息。1410.2.1RTX51實(shí)時操作系統(tǒng)特點(diǎn)3.CAN通信:

RTX-51FULL中集成了一個CAN總線通信模塊RTX-51/CAN。通過RTX-51/CAN可以輕松地實(shí)現(xiàn)CAN總線的通信。RTX-51CAN作為一個任務(wù)來使用,可以通過CAN網(wǎng)絡(luò)來實(shí)現(xiàn)信息的傳遞,其他的CAN終端可以配置為一般的C51程序,也可以是RTX-51的實(shí)時操作系。4.BITBUS通信:

RTX-51FULL系統(tǒng)中集成了BITBUS主控制器和從控制器。BITBUS任務(wù)主要用于支持與Intel8044之間的信息傳遞。155.事件

在os_wait函數(shù)中,RTX51支持下列事件:Timeout(超時):

掛起正在運(yùn)行的任務(wù),等待規(guī)定的時鐘滴答數(shù)。Interval(間隔):

這和Timeout很相似,但不是用軟件定時器的復(fù)位來產(chǎn)生周期性的間隔(時鐘要求)。(僅RTX51Tiny)Signal(信號):任務(wù)之間協(xié)調(diào)。Message(消息):交換消息。(僅RTX51Full)Interrupt(中斷):

一個可以等待8051硬件中斷的任務(wù)。(僅RTX51Full)Semaphore(信號量):

管理共享的系統(tǒng)資源的二進(jìn)制信號量。(僅RTX51Full)

166.運(yùn)行環(huán)境RTX-51實(shí)時多任務(wù)操作系統(tǒng)使用標(biāo)準(zhǔn)的C51來編寫程序,可以運(yùn)行于所有的51系列單片機(jī)中。RTX-51自身提供了靈活的時間分配,以及任務(wù)的響應(yīng)和切換。用戶只需要用標(biāo)準(zhǔn)的C51語言編寫RTX51程序,然后用C51編譯器編譯即可生成代碼。其中,僅有少數(shù)內(nèi)容和標(biāo)準(zhǔn)C語言有差異,這些內(nèi)容是為了實(shí)現(xiàn)任務(wù)標(biāo)識和優(yōu)先級而設(shè)置的。RTX-51程序設(shè)計(jì)需要包含實(shí)時運(yùn)行頭文件和必要的庫文件,并且要用BL51連接/定位器來實(shí)現(xiàn)連接。17在Keil中,在目標(biāo)選項(xiàng)的Target標(biāo)簽中的operating中選擇RTX-51Tiny,如圖10-1;且在頭文件中需要加上#include<rtx51tny.h>。在RTX51TINY環(huán)境下生成代碼,需要用到下列工具:C51編譯器BL51連接/定位器A51宏匯編器此外,庫文件RTX51TNY.LIB必須存放在環(huán)境變量C51LIB所指定的路徑下。1819圖10-1RTX-51Tiny的設(shè)置界面RTX51Tiny的存儲模式

RTX51Tiny版可以運(yùn)行在8051的單芯片嵌入式系統(tǒng)上,且不需要任何外部數(shù)據(jù)存儲器,但也不排斥應(yīng)用程序訪問外部的數(shù)據(jù)存儲器。RTX51Tiny版本可以使用C51所支持的所有存儲模式。所使用的存儲模式只影響應(yīng)用對象的存儲位置。RTX51Tiny的系統(tǒng)變量和應(yīng)用程序的堆棧區(qū)總是存儲在8051的片內(nèi)RAM中(即DATA和IDATA)。典型的RTX51Tiny應(yīng)用程序一般運(yùn)行于SMALL存儲模式下。20RTX51Tiny定時使用的定時器

RTX51Tiny版本使用了8051的定時器0和定時器0的中斷信號。SFR中的全局中斷允許位或定時器0中斷屏蔽位都可能使RTX51Tiny停止運(yùn)行。因此,除非有特殊的應(yīng)用目的,應(yīng)該使定時器0的中斷始終開啟,以保證RTX51Tiny的正常運(yùn)行。217.RTX51的性能參數(shù)實(shí)時操作系統(tǒng)的性能參數(shù)對嵌入式系統(tǒng)的應(yīng)用開發(fā)也有著直接影響,RTX51的性能參數(shù)如表10-1所示。描述RTX51TINY版本任務(wù)數(shù)量最多16個RAM需求7字節(jié)DATA空間,3倍于任務(wù)數(shù)量的IDATA空間代碼要求900字節(jié)硬件要求定時器0系統(tǒng)時鐘1000~65535個時鐘周期中斷響應(yīng)時間<20周期任務(wù)切斷時間100~700周期,依賴于堆棧負(fù)載22表10-1RTX51的性能參數(shù)10.2.2RTX51的系統(tǒng)配置編寫RTX51程序需要包含RTX51TNY.H文件。在程序中,需要用一個關(guān)鍵字“_task_”來聲明一個函數(shù)的任務(wù)屬性。RTX51程序不需要main函數(shù)。在進(jìn)行連接處理時,會將啟動任務(wù)0的執(zhí)行所需要的代碼連接進(jìn)來,作為開始執(zhí)行的代碼。用戶可以更改配置文件CONF_TNY.A51中的以下幾個參數(shù):①

系統(tǒng)定時器中斷所用的寄存器組②系統(tǒng)定時器的時間間隔③

Round-Robin的超時(time-out)值④內(nèi)部數(shù)據(jù)存儲器的大小⑤RTX5l啟動后的自由堆棧大小23以下是配置文件的部分內(nèi)容:;RTX51的硬件定時器;用下面的EQU可預(yù)置RTX51的定時器時間常數(shù);用8051定時器0作為控制軟件的定時器;定義定時器中斷用的寄存器組INT_REGBANKEQU 1;

默認(rèn)為寄存器1組;定義8051定時器0溢出所需的機(jī)器周期數(shù)INT_CLOCKEQU10000;默認(rèn)周期數(shù)為10000;定義Round-Robin的Timeout所需的定時器溢出數(shù)

TIMESHARING EQU 5;默認(rèn)為5次;注意:Round-Robin任務(wù)切換可用TIMESHARING為0來屏蔽;24;RTX51堆??臻g;以下的EQU語句定義了堆棧區(qū)的片內(nèi)RAM體積最小自由堆??臻g;定義了堆棧空間耗盡后所執(zhí)行的宏代碼;定義最大的堆棧RAM地址

RAMTOPEQU 0FFH;默認(rèn)地址是255;定義最小的堆棧自由空間

FREE_STACKEQU20;默認(rèn)為20字節(jié)堆棧自由空間;;發(fā)生堆棧用盡時的執(zhí)行代碼

STACK_ERRORMACRO

CLREA

;關(guān)閉所有中斷SJMP$;如堆??臻g耗盡,進(jìn)入死循環(huán)ENDM這些參數(shù)的說明詳見表10-2。25

表10-2配置文件參數(shù)說明參數(shù)描述INT-REGBANK說明RTX51系統(tǒng)所用的寄存器組INT-CLOCK定義系統(tǒng)時間間隔,系統(tǒng)用這個間隔產(chǎn)生一個中斷信號,定義的數(shù)據(jù)是指每次中斷發(fā)生所需的CPU周期數(shù)TIMESHARING定義Round-Robin任務(wù)切換的超時間隔(time-out),是定時器溢出中斷次數(shù),發(fā)生指定次數(shù)中斷后切換任務(wù)。如果是0,則多任務(wù)Round-Robin機(jī)制被屏蔽RAMTOP說明8051片內(nèi)RAM的最大地址,8051為7FH,8052為0FFHFREE-STACK定義任務(wù)切換時堆棧自由空間體積字節(jié)數(shù),RTX51會檢驗(yàn)堆棧體積是否合理。如太小,引用STACK-ERROR宏STACK-ERROR當(dāng)RTX51檢測到堆棧出錯時執(zhí)行的宏,可以根據(jù)應(yīng)用程序需求更換這個宏。2610.2.3RTX的典型功能函數(shù)在RTX-51Tiny的系統(tǒng)函數(shù)中,以“os_”開頭的函數(shù)可以被任務(wù)專用,而以“isr_”開頭的函數(shù)則表示可以被C51的中斷函數(shù)專用。在使用RTX-51Tiny的系統(tǒng)函數(shù)時,需要在程序中加入“RTX51TNY.h”頭文件。在該頭文件中,提供了RTX-51Tiny系統(tǒng)函數(shù)的說明以及所有常數(shù)聲明。27(1)發(fā)送信號函數(shù)isr_send_signal

發(fā)送信號函數(shù)isr_send_signal主要用于向一個任務(wù)發(fā)送信號。其函數(shù)原型如下:charisr_send_signal(unsignedchartaskid);

其中,參數(shù)taskid表示接收信號的任務(wù)號。發(fā)送信號函數(shù)isr_send_signal如果返回0,則表示信號發(fā)送成功,如果返回-1,則表示指向的任務(wù)不存在。28(2)清除信號標(biāo)志函數(shù)os_clear_signal清除信號標(biāo)志函數(shù)os_clear_signal主要用于清除指定任務(wù)的信號標(biāo)志。其函數(shù)原型如下:charos_clear_signal(unsignedchartaskid);其中,參數(shù)taskid表示所需要清除信號標(biāo)志的任務(wù)號。清除信號標(biāo)志函數(shù)os_clear_signal如果返回0,則表示信號標(biāo)志清除成功,如果返回-1,則表示指向的任務(wù)不存在。29(3)刪除任務(wù)函數(shù)os_delete_task刪除任務(wù)函數(shù)os_delete_task主要用于刪除指定任務(wù)號的任務(wù)。其函數(shù)原型如下:

charos_delete_task(unsignedchartaskid);其中,參數(shù)taskid表示所需要刪除任務(wù)的任務(wù)號,taskid必須與任務(wù)描述的數(shù)字相一致,可取值的范圍為0~15。刪除任務(wù)函數(shù)os_delete_task如果返回0,則表示刪除任務(wù)成功,如果返回-1,則表示指向的任務(wù)不存在或者任務(wù)沒有啟動。30(4)當(dāng)前任務(wù)號函數(shù)os_running_task_id當(dāng)前任務(wù)號函數(shù)os_running_task_id主要用于獲得當(dāng)前運(yùn)行任務(wù)的任務(wù)號。其函數(shù)原型如下:charos_running_task_id(void);其中,當(dāng)前任務(wù)號函數(shù)os_running_task_id的返回值表示當(dāng)前任務(wù)的任務(wù)號。使用函數(shù)os_delete_task的程序示例如下:voidtask_os_running_taskid(void)_task_2{unsignedcharrid;rid=os_running_task_id();……}31(5)發(fā)送信號函數(shù)os_send_signal發(fā)送信號函數(shù)os_send_signal主要用于向一個任務(wù)發(fā)送信號。其函數(shù)原型如下:

charos_send_signal(unsignedchartaskid);其中,參數(shù)taskid表示接收信號的任務(wù)號。發(fā)送信號函數(shù)os_send_signal如果返回0,則表示信號發(fā)送成功,如果返回-1,則表示指向的任務(wù)不存在。發(fā)送信號函數(shù)os_send_signal在向taskid所指定的任務(wù)發(fā)送信號時,如果該任務(wù)正在等待信號,則信號到達(dá)后,任務(wù)再次執(zhí)行。如果任務(wù)正在執(zhí)行其他操作,則信號將被存儲在所訪問的任務(wù)信號標(biāo)志中。32使用函數(shù)os_send_signal的程序示例如下:voidtask_os_sendsignal(void)_task_2{……os_send_signal(3); //向任務(wù)3發(fā)送信號……}33(6)等待函數(shù)os_wait等待函數(shù)os_wait主要用于暫停當(dāng)前任務(wù),等待一個或多個事件發(fā)生。其函數(shù)原型如下:charos_wait(unsignedcharevent_sel,unsignedcharticks,unsignedintdummy);其中,參數(shù)event_sel表示等待發(fā)生的事件??梢赃x擇的事件有如下幾種形式:

K_IVL:等待的時間間隔。

K_SIG:等待的信號。

K_TMO:超時,即等待的時間到。

這些事件可以單獨(dú)使用,也可以在一起組合使用,示例如下:

event_sel=K_TMO|K_IVL;

event_sel=K_SIG|K_IVL;34(7)等待函數(shù)os_wait1等待函數(shù)os_wait1主要用于暫停當(dāng)前任務(wù),等待信號的到來。其函數(shù)原型如下:

charos_wait1(unsignedcharevent_sel);其中,參數(shù)event_sel表示等待發(fā)生的事件,其不同于os_wait函數(shù),只能設(shè)置為K_SIG。等待函數(shù)os_wait1如果返回SIG_EVENT,則表示信號被成功接受;如果返回NOT_OK,則表示該函數(shù)中所設(shè)置的event_sel參數(shù)無效。35(8)等待函數(shù)os_wait2等待函數(shù)os_wait2主要用于暫停當(dāng)前任務(wù),等待一個或多個事件發(fā)生。其函數(shù)原型如下

charos_wait2(unsignedcharevent_sel,unsignedcharticks);其中,參數(shù)event_sel表示等待發(fā)生的事件。可以選擇的事件有如下幾種形式。K_IVL:等待的時間間隔。K_SIG:等待的信號。K_TMO:等待的時間到。這些事件可以單獨(dú)使用,也可以在一起組合使用,示例如下:event_sel=K_TMO|K_IVL;event_sel=K_SIG|K_IVL;36(9)啟動任務(wù)函數(shù)os_create_task啟動任務(wù)函數(shù)os_create_task主要用于啟動已定義的由task_id說明的任務(wù),此任務(wù)根據(jù)RTX51運(yùn)行規(guī)則,標(biāo)記為就緒,并準(zhǔn)備執(zhí)行。

charos_create_task(unsignedchartask_id);如果任務(wù)成功啟動,此函數(shù)返回0值;如果沒有task_id說明的任務(wù),則返回-13710.2.4RTX51的任務(wù)調(diào)度方法RTX51實(shí)時多任務(wù)操作系統(tǒng)的程序結(jié)構(gòu)與標(biāo)準(zhǔn)單進(jìn)程C51語言程序不一樣,RTX51不要求程序中一定要有一個main函數(shù),它會自動地從任務(wù)0(task0)開始執(zhí)行。如果程序有main函數(shù),那么就必須用RTX51Tiny的os_creat_task函數(shù)或RTX51FULL的os_start_system函數(shù)手工啟動RTX51。具體的程序運(yùn)行方法有下面幾種:381.RTX51的輪轉(zhuǎn)式任務(wù)調(diào)度方法RTX51可以實(shí)現(xiàn)多任務(wù)的輪轉(zhuǎn)調(diào)度,并允許“準(zhǔn)并行”地執(zhí)行多個循環(huán)或任務(wù)。任務(wù)不是同時執(zhí)行,而是以不同的時間片輪轉(zhuǎn)調(diào)度執(zhí)行。RTX-51將可用的CPU時間劃分成若干時間片,為每個任務(wù)指定一個時間片,每個任務(wù)允許在預(yù)先規(guī)定的一個時間片內(nèi)執(zhí)行。然后,RTX51切換到另一個就緒的任務(wù),使這個任務(wù)也在規(guī)定的一個時間片內(nèi)執(zhí)行。時間片是很短的,通常是幾個毫秒。因此,任務(wù)看起來是同時執(zhí)行的。RTX51使用8051硬件定時器產(chǎn)生中斷的定時程序,產(chǎn)生周期性的中斷用于驅(qū)動RTX51的時鐘。39下面的例子是一個簡單的輪轉(zhuǎn)任務(wù)調(diào)度的RTX51應(yīng)用程序。這個程序中的兩個任務(wù)是簡單的計(jì)數(shù)器循環(huán)。RTX51開始執(zhí)行任務(wù)job0。在任務(wù)job0里啟動job1的任務(wù)。在任務(wù)job0的時間片執(zhí)行完后RTX51切換到j(luò)ob1。job1時間片執(zhí)行完后,RTX51又切換回job0,這個過程無限地重復(fù)。40

#include<rtx51tny.h>intcounter0;intcounter1;voidjob0(void)_task_0{os_create_task(1);//啟動任務(wù)1//while(1){counter0++;}}voidjob1(void)_task_1{while(1){counter1++;}}

2.RTX51的事件任務(wù)調(diào)度方法事件程序調(diào)度方法可以用os_wait函數(shù)通知RTX51,讓它執(zhí)行下一個任務(wù),而不是等待一個任務(wù)的時間片到期。這個函數(shù)會掛起當(dāng)前正在執(zhí)行的任務(wù),等待一個指定的事件發(fā)生。在這段時間內(nèi),可以執(zhí)行任意數(shù)量的其他任務(wù)。41(1)在RTX51中使用超時調(diào)度任務(wù)在os_wait函數(shù)中最簡單的等待事件是一個RTX51時鐘的超時周期。這個類型的事件可以在要求延時的任務(wù)中使用。下面的例子顯示了如何使用os_wait函數(shù)延時,以允許另一個任務(wù)執(zhí)行。42#include<rtx51tny.h>intcounter0;intcounter1;voidjob0(void)_task_0{/*創(chuàng)建任務(wù)1*/

os_create_task(1);while(1){counter0++;/*更新計(jì)數(shù)器*//*暫停3個時鐘*/os_wait(K_TMO,3,0);}}voidjob1(void)_task_1{while(1){/*更新計(jì)數(shù)器*/counter1++;/*暫停5個時鐘*/os_wait(K_TMO,5,0);}}在上面的例子中job0任務(wù)中使能任務(wù)job1。在counter0加1后job0調(diào)用os_wait函數(shù),等待3個時鐘滴答。這時,RTX51切換到另一個任務(wù)job1。在job1的counte1加1后,也調(diào)用os_wait函數(shù),暫停5個時鐘滴答。此時,RTX51沒有其他任務(wù)要執(zhí)行,因此它進(jìn)入一個空閑的循環(huán),等待3個時鐘滴答,然后繼續(xù)執(zhí)行job0。這個例子的結(jié)果是counter0每3個時鐘滴答加1,而counter1每5個時鐘滴答加1。43(2)在RTX51中使用信號調(diào)度任務(wù)可以用os_wait函數(shù)暫停一個任務(wù),等待另一個任務(wù)的信號。它可以協(xié)調(diào)兩個或多個任務(wù)。等待一個信號的操作如下:如果一個任務(wù)要等待一個信號,而且信號標(biāo)志是0,則任務(wù)會被掛起,直到收到信號。如果信號標(biāo)志在任務(wù)查詢信號時已經(jīng)是1,則標(biāo)志會被清除并繼續(xù)執(zhí)行任務(wù)。請看下面的例子:44

#include<rtx51tny.h>intcounter0;intcounter1;voidjob0(void)_task_0{os_create_task(1);/*任務(wù)1準(zhǔn)備就緒*/while(1){if(++counter0==0)/*更新計(jì)數(shù)器*/os_send_signal(1);/*給任務(wù)1發(fā)信號*/}}voidjob1(void)_task_1{while(1){os_wait(K_SIG,0,0);/*等待一個信號*/counter1++;/*更新計(jì)數(shù)器*/}}45在上面的例子中,job0的counter0不斷加1,當(dāng)counter0溢出為0時job0發(fā)送一個信號到j(luò)ob1。job1等待從job0任務(wù)接收到一個信號時,counter1加1,然后再次等待另一個信號。RTX51將job1標(biāo)記為就緒態(tài),直到RTX51到下一個時鐘滴答后job1才會啟動。463.優(yōu)先級和搶先RTX51允許給任務(wù)指定優(yōu)先級。當(dāng)高優(yōu)先級的任務(wù)可執(zhí)行時,會中斷低優(yōu)先級的任務(wù),或比低優(yōu)先級的任務(wù)搶先執(zhí)行。這就叫做搶先式的多任務(wù)或就叫搶先(RTX51Tiny不支持搶先和優(yōu)先級)。優(yōu)先級可以從0~3,默認(rèn)情況下,所有任務(wù)的優(yōu)先級都是0,這是最低的優(yōu)先級??梢孕薷纳厦鎗ob1的函數(shù)聲明,使它的優(yōu)先級比job0高。下面的例子顯示如何將job1的優(yōu)先級定義為1。47

voidjob1(void)_task_1_priority_1{while(1){os_wait(K_SIG,0,0);/*等待一個信號*/counter1++;/*更新計(jì)數(shù)器*/}}現(xiàn)在,無論何時job0發(fā)送一個信號到j(luò)ob1,job1都會立即啟動。4810.2.6任務(wù)管理所定義的每個RTX51Tiny的任務(wù)可以處于多種不同狀態(tài)中的一種。RTX51Tiny內(nèi)核為每個任務(wù)維持正確的狀態(tài)。表10-3是對各種狀態(tài)的解釋。49表10-3各種任務(wù)狀態(tài)的解釋狀態(tài)說

明Running當(dāng)前正在執(zhí)行的任務(wù)處于Running態(tài)。在同一時間只能運(yùn)行一個任務(wù)Ready等待執(zhí)行的任務(wù)處于Ready態(tài)。當(dāng)前的Running(運(yùn)行的)任務(wù)處理完成后,RTX啟動下一個在Ready態(tài)的任務(wù)。Waiting等待時間的任務(wù)處于Waiting態(tài)。如果任務(wù)等待的事件發(fā)生,則任務(wù)進(jìn)入Ready態(tài)。Deleted沒有啟動的任務(wù)都處于Deleted狀態(tài)Timeout由于輪轉(zhuǎn)超時而中斷的任務(wù)處于Timeout狀態(tài)。這個狀態(tài)相當(dāng)于Ready10.3RTX精簡版例程下面這個例子程序使用RTX-51Tiny控制3個任務(wù)循環(huán)執(zhí)行。在每項(xiàng)任務(wù)程序中執(zhí)行的是增量計(jì)數(shù)的功能。50#include<rtx51tny.h>/*RTX-51

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論