第15章RTX51實時操作系統(tǒng)_第1頁
第15章RTX51實時操作系統(tǒng)_第2頁
第15章RTX51實時操作系統(tǒng)_第3頁
第15章RTX51實時操作系統(tǒng)_第4頁
第15章RTX51實時操作系統(tǒng)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第15章RTX51實時操作系統(tǒng)

RTOS概述

RTX51系統(tǒng)特點

RTX51的程序設計

RTX51的系統(tǒng)配置

RTX51的應用舉例15.1

RTOS概述單任務系統(tǒng)的設計思路:傳統(tǒng)的單片機程序多為單任務系統(tǒng),其業(yè)務邏輯順序安排在主函數(shù)中。主函數(shù)是整個程序的入口,一般包含一個死循環(huán),循環(huán)過程中通過調(diào)用函數(shù)來完成相應的操作,而對于一些較短的實時任務則通過中斷方式進行處理。此種程序結構簡單、直觀、易于實現(xiàn),但對于較復雜的應用,此種結構極為不便,并且不能滿足實時性要求較高的場合15.1.1單任務/多任務順序執(zhí)行的單任務程序設計voidmain(){ intcounter=0; while(1){ check_serial_io(); //檢查串行輸入

process_serial_cmds();

//處理串行輸入

check_kbd_io(); //檢查鍵盤輸入

process_kbd_cmds();//處理鍵盤輸入

app_execute(); //應用程序執(zhí)行

counter++; //循環(huán)計數(shù)

}}順序執(zhí)行的單任務程序設計該例中,每個函數(shù)執(zhí)行一個獨立操作或任務。任務依次按順序執(zhí)行。當任務數(shù)量增加時,調(diào)度會成為問題。例如,若process_kbd_cmds()函數(shù)的執(zhí)行耗費大量時間,主循環(huán)會很慢才執(zhí)行到check_serial_io(),此時串口數(shù)據(jù)可能已經(jīng)丟失。多任務系統(tǒng)的執(zhí)行特點多任務系統(tǒng)的設計思路:各功能模塊(如顯示、鍵盤掃描等等)處于等同地位。各功能模塊執(zhí)行順序可在程序運行過程中動態(tài)地改變。各子任務在自已的時間片內(nèi)運行,通過合理設計時間片大小和各任務的優(yōu)先級,可以自然地滿足系統(tǒng)內(nèi)各種復雜的時序要求。類似這樣的任務管理和調(diào)度,就是多任務OS的核心。多任務系統(tǒng)的執(zhí)行特點check_serial_io(

)process_serial_cmds(

)check_kbd_io(

)process_kbd_cmds(

)app1_execute(

)app2_execute(

)任務調(diào)度時間片輪轉(zhuǎn)、任務優(yōu)先級設定等功能15.1.2什么是RTOS實時操作系統(tǒng)(Real-Time

Operating

System,RTOS),是指當外界事件或數(shù)據(jù)產(chǎn)生時,能夠接受并以足夠快的速度予以處理,其處理的結果又能在規(guī)定的時間之內(nèi)來控制生產(chǎn)過程或?qū)μ幚硐到y(tǒng)作出快速響應,并控制所有實時任務協(xié)調(diào)一致運行的操作系統(tǒng)。RTOS廣泛應用于嵌入式計算機技術領域,比如μCOS、VxWork、Linux、WinCE等,51單片機上常用的SmallRTOS51,還有目前手機中廣泛使用的Android、iOS,都是典型的RTOS。15.2

RTX51的特點RTX51是一款小巧的針對基于8051核心的嵌入式系統(tǒng)的多任務RTOS。使用它可以簡化比較復雜、有嚴格時間限制的程序的設計過程。RTX51主要有兩個不同的可用版本:標準版(RTX51-Full)和精簡版(RTX51-Tiny)。在RTX51-Full中:既可以以輪循(Round-Robin)方式執(zhí)行任務,也可以按4級任務優(yōu)先級的方式切換不同優(yōu)先級的任務。以并行方式工作,支持中斷管理,信號和消息可以通過郵箱系統(tǒng)在不同任務之間傳遞。RTX51-Tiny是RTX51-Full的一個子集,支持RTX51中絕大多數(shù)的特性,且不需要外部RAM(XDATA)。RTX51-Tiny支持RTX51-Full的許多特性,但不具有以下功能:不支持優(yōu)先任務切換不包含信息子程序無存儲器庫分配子程序。15.2

RTX51的特點描述RTX51-FullRTX51-Tiny任務數(shù)量最多256個;可同時激活19個16個RAM需求40~46Byte的DATA空間20~200ByteIDATA空間(用戶堆棧)最小650字節(jié)XDATA空間7Byte的DATA空間3倍于任務數(shù)量的IDATA空間代碼要求6KB~8KB900Byte硬件要求定時器0或定時器1定時器0系統(tǒng)時鐘1000到40000個周期1000到65535個周期中斷請求時間小于50個周期小于20個周期任務切換時間快速任務:70~100個周期標準任務:180~700個周期(取決于堆棧負載)100~700個周期(取決于堆棧負載)郵箱系統(tǒng)8個分別帶有整數(shù)入口的信箱不提供內(nèi)存池最多16個內(nèi)存池不提供信號量8*1位不提供15.3

RTX51的程序設計由于Keil

C中自帶RTX51-Tiny版,下面就以Tiny版本為例,簡要介紹其軟件設計方法。軟件環(huán)境的要求:在使用RTX51-TINY時,需要以下軟件支持:1)C51編譯器2)BL51連接定位器3)A51宏匯編器庫文件RTX51TNY.LIB必須存儲在C51\LIB下,必須指定C51運行庫的路徑。頭文件RTX51TNY.h必須存儲在C51\INC下,必須指定C51包含文件的路徑。15.3

RTX51的程序設計

—運行機制RTX51Tiny通過輪循(Round-Robin)方式來實現(xiàn)多任務,以達到多個無限循環(huán)或任務的準并行執(zhí)行。這里的多任務并不是真正同時執(zhí)行的,而是使用不同的時間片來執(zhí)行,即只是宏觀上的同時執(zhí)行。它將可用的CPU周期分成多個時間片,由RTX51把這些時間片分配給每一個任務使用。每個任務只能在預定的時間片里運行,然后RTX51再切換到另一個己經(jīng)準備就緒的任務,讓它再執(zhí)行一定的時間片。時間片一般是比較短促的,一個時間片大約只有毫秒級時間。正是由于這個原因,在用戶看來,多個任務似乎是在同時執(zhí)行的。15.3

RTX51的程序設計

—運行機制RTX51利用了一個由定時器0的中斷信號驅(qū)動的定時程序來實現(xiàn)上述時間片的控制。定時器產(chǎn)生的周期性中斷信號用來驅(qū)動RTX51的定時節(jié)拍。SFR中的全局中斷允許位EA或定時器0中斷允許位ET0被屏蔽,都可能使RTX51-Tiny停止運行。因此,除非有特殊的應用目的,應該使定時器0的中斷始終開啟,以保證RTX51-Tiny的正常運行。15.3

RTX51的程序設計

—任務在RTX51系統(tǒng)中,一個任務體現(xiàn)為一個C51函數(shù),該函數(shù)不能有返回值,不能有參數(shù),且函數(shù)體必須是一個無限循環(huán),以保證該函數(shù)不能返回。實際應用中,一個復雜的系統(tǒng)往往被分解成若干可以并行處理的任務,每個任務只完成一個單一的操作(如鍵盤掃描、顯示、通信等),從而降低系統(tǒng)設計的難度。在RTX51-Tiny系統(tǒng)中一個具體的任務通過下面的格式定:15.3

RTX51的程序設計

—任務

voidtaskname(void)_task_num其中,num是任務號,取值為0-15;taskname是任務名稱(亦即函數(shù)名)。下面是一個具體的任務定義voidinit(void)_task_0{

/*操作語句*/ while(1){

/*操作語句*/ }}RTX51-Tiny最多只允許處理16個任務15.3

RTX51的程序設計

—任務RTX51區(qū)分2類任務:快速任務和標準任務??焖偃蝿沼泻芸斓捻憫俣?,每個快速任務使用8051一個單獨的寄存器組,并且有自己的堆棧區(qū)域。RTX51支持最大同時有3個快速任務。標準任務需要多一點的時間來進行任務切換,因此使用的內(nèi)部RAM相對快速任務要少,所有的標準任務共用1個寄存器組和堆棧。當任務切換的時候,當前任務的寄存器狀態(tài)和堆棧內(nèi)容轉(zhuǎn)移到外部存儲器中。RTX51-Full支持任務最多達64個;RTX51-Tiny僅支持標準任務,最多16個。這里我們僅討論標準任務15.3

RTX51的程序設計

—任務狀態(tài)RTX51-Tiny的用戶任務有5種狀態(tài),如下表所示。某一時刻用戶任務處在某個狀態(tài),在一定條件下任務狀態(tài)可以發(fā)生改變。狀態(tài)描述運行(RUNNING)當前正在運行的任務處于RUNNING態(tài),同一時刻只能有1個任務處于該狀態(tài)。就緒(READY)等待運行的任務處于READY態(tài),可能有多個。當前運行的任務時間片完成后,從READY態(tài)的任務隊列中選取下一個任務運行,使其進入RUNNING態(tài)。超時(TIMEOUT)任務由于時間片用完處于TIMEOUT態(tài),在僅具有時間片輪循調(diào)度方式的RTX51-Tiny中,該狀態(tài)等價于READY態(tài)。等待(WAITING)正在等待一個事件發(fā)生的任務處于WAITING態(tài)。如果該事件發(fā)生,則任務進入READY態(tài)。刪除(DELETED)尚未啟動的任務處于DELETED態(tài)15.3

RTX51的程序設計

—任務狀態(tài)5種狀態(tài)之間的轉(zhuǎn)化條件:READY態(tài)/TIMEOUT態(tài)RUNNING態(tài)WAITING態(tài)時間片到來時間片結束等待一個事件事件發(fā)生15.3

RTX51的程序設計

—一個示例#include<reg51.h>#include<rtx51tny.h>uintcounter0=0;uintcounter1=0;voidjob0()_task_0{ //程序的執(zhí)行從任務0開始 os_create_task(1); //將任務1標記為“READY”狀態(tài) while(1)counter0++; //任務函數(shù)內(nèi)部必須構成死循環(huán)}voidjob1()_task_1{ while(1)counter1++; //任務函數(shù)內(nèi)部必須構成死循環(huán)}思考:counter0和counter1是交替加1么?不能出現(xiàn)main()函數(shù)15.3

RTX51的程序設計

—用于任務管理的常見系統(tǒng)函數(shù)1、os_create_task函數(shù)原型:char

os_create_task(unsignedchartask_id);功能說明:啟動已定義的編號為task_id的任務,并標記為就緒,準備執(zhí)行。返回值:如果任務成功啟動,此函數(shù)返回0值;如果沒有task_id說明的任務,則返回-1。2、os_delete_task函數(shù)原型:char

os_delete_task(unsignedchartask_id);功能說明:停止編號為task_id的任務,并將此任務從任務表中刪除。返回值:如果任務被成功停止并刪除,函數(shù)返回0值;如果編號為task_id的任務沒有啟動或不存在,則返回-1。用于任務管理的常見系統(tǒng)函數(shù)3、os_running_task_id函數(shù)原型:char

os_running_task_id(void);功能說明:檢測當前處于運行態(tài)的任務編號。返回值:返回當前處于運行態(tài)的任務編號,返回值為0~15。4、os_set_ready函數(shù)原型:voidos_set_ready(unsignedchartask_id);功能說明:將編號為task_id的任務設置為就緒態(tài)。返回值:無用于任務管理的常見系統(tǒng)函數(shù)5、os_wait函數(shù)原型:char

os_wait(unsignedcharevent_sel,

/*等待的事件*/

unsignedcharticks,/*等待時長,即定時器的溢出次數(shù)*/ unsignedchardummy); /*Tiny版未用,恒為0*/功能說明:暫停當前執(zhí)行的任務,并等待一個或多個事件(如時間間隔、超時、從另一個任務或中斷發(fā)出的信號等)發(fā)生。參數(shù)event_sel說明所等待的一個或幾個事件的組合,事件種類如下表所示。事件描述K_SIG等待一個信號量K_TMO等待由ticks指定的超時時間K_IVL等待由ticks指定的時間間隔用于任務管理的常見系統(tǒng)函數(shù)5、os_wait返回值:當有一個指定的事件發(fā)生時,任務被置為就緒態(tài)。當任務繼續(xù)執(zhí)行時,os_wait返回重新啟動任務的特定事件。有以下可能的返回值:事件描述RDY_EVENT任務就緒標志被os_set_ready或isr_set_ready函數(shù)置位SIG_EVENT接收到一個信號量TMO_EVENT達到超時或間隔時間NOT_OKevent_sel參數(shù)無效用于任務管理的常見系統(tǒng)函數(shù)6、os_wait1函數(shù)原型:charos_wait1(unsignedcharevent_sel);

/*等待的事件*/功能說明:暫停當前執(zhí)行的任務,并等待一個事件發(fā)生。該函數(shù)是os_wait函數(shù)的一個子集,它不支持所有的事件,參數(shù)event_sel只能是K_SIG。返回值:與os_wait函數(shù)對比,缺少TMO_EVENT。7、os_wait2函數(shù)原型:charos_wait2(unsignedcharevent_sel,

/*等待的事件*/

unsignedcharticks);/*等待的定時器時標數(shù)*/功能說明:與os_wait函數(shù)相同,但沒有dummy參數(shù)。返回值:與os_wait函數(shù)相同用于任務管理的常見系統(tǒng)函數(shù)8、os_send_signal函數(shù)原型:char

os_send_signal(unsignedchartask_id);功能說明:該函數(shù)向編號task_id的任務發(fā)送一個信號。若該任務已經(jīng)在等待此信號,本函數(shù)將任務置為就緒態(tài);若該任務沒有準備接收此信號,則信號將存儲在任務的信號標志中。返回值:函數(shù)執(zhí)行成功返回0;若指定的任務不存在,返回-1。9、os_clear_signal函數(shù)原型:char

os_clear_signal(unsignedchartask_id);功能說明:該函數(shù)向清楚號task_id的任務的信號標志。返回值:若信號標志被成功清零,返回0;若指定的任務不存在,返回-1。用于任務管理的常見系統(tǒng)函數(shù)10、isr_send_signal函數(shù)原型:char

isr_send_signal(unsignedchartask_id);功能說明:該函數(shù)功能與os_send_signal函數(shù)完全相同,區(qū)別在于只能從中斷函數(shù)中調(diào)用。返回值:函數(shù)執(zhí)行成功返回0;若指定的任務不存在,返回-1。11、isr_set_ready函數(shù)原型:void

isr_set_ready(unsignedchartask_id);功能說明:將編號為task_id的任務設置為就緒態(tài)。僅能從中斷函數(shù)中調(diào)用。返回值:無。用于任務管理的常見系統(tǒng)函數(shù)12、os_switch_task函數(shù)原型:char

os_switch_task(void);功能說明:該函數(shù)讓調(diào)用它的任務暫時停止運行,轉(zhuǎn)而切換至另外一個任務運行。如果調(diào)用該函數(shù)的任務是唯一一個就緒任務,那么該任務將立即恢復運行。返回值:無。用于任務管理的常見系統(tǒng)函數(shù)13、os_reset_interval函數(shù)原型:void

os_reset_interval(unsignedcharticks);功能說明:用于糾正由于os_wait函數(shù)同時等待K_SIG和K_IVL事件而產(chǎn)生的時間問題。如果一個信號事件(K_SIG)引起os_wait退出,時間間隔定時器并不調(diào)整,這樣會導致后續(xù)的os_wait調(diào)用(等待一個時間間隔)延遲的不是預期的時間周期。該函數(shù)允許將時間間隔定時器復位,這樣,后續(xù)對os_wait的調(diào)用就會按預期的操作進行。返回值:無。15.4

RTX51的系統(tǒng)配置編寫RTX51程序需要包含RTX51TNY.h文件。在程序中,需要用一個關鍵字“_task_”來聲明一個函數(shù)的任務屬性。RTX51程序不需要main函數(shù)。在進行連接處理時,會將執(zhí)行任務0所需要的代碼連接進來,作為開始執(zhí)行的代碼。用戶可以更改配置文件CONF_TNY.A51中的以下幾個參數(shù):1)系統(tǒng)定時器中斷所用的寄存器組2)系統(tǒng)定時器的時間間隔3)Round-Robin的超時(time-out)值4)內(nèi)部數(shù)據(jù)存儲器的大小5)RTX5l啟動后的自由堆棧大小15.4

RTX51的系統(tǒng)配置以下是配置文件CONF_TNY.A51中的部分內(nèi)容;-----------------------------------------------------------------------------;RTX51-tiny的硬件定時器;用下面的EQU可預置RTX51的定時器時間常數(shù);用8051定時器0作為控制軟件的定時器;-----------------------------------------------------------------------------;定義定時器中斷用的寄存器組INT_REGBANK EQU 1 ;默認為寄存器1組;定義8051定時器0溢出所需的機器周期數(shù)INT_CLOCK EQU 10000 ;默認周期數(shù)為10000,即10ms;

溫馨提示

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

評論

0/150

提交評論