




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第15章RTX51實時操作系統
RTOS概述
RTX51系統特點
RTX51的程序設計
RTX51的系統配置
RTX51的應用舉例15.1
RTOS概述單任務系統的設計思路:傳統的單片機程序多為單任務系統,其業務邏輯順序安排在主函數中。主函數是整個程序的入口,一般包含一個死循環,循環過程中通過調用函數來完成相應的操作,而對于一些較短的實時任務則通過中斷方式進行處理。此種程序結構簡單、直觀、易于實現,但對于較復雜的應用,此種結構極為不便,并且不能滿足實時性要求較高的場合15.1.1單任務/多任務順序執行的單任務程序設計voidmain(){ intcounter=0; while(1){ check_serial_io(); //檢查串行輸入
process_serial_cmds();
//處理串行輸入
check_kbd_io(); //檢查鍵盤輸入
process_kbd_cmds();//處理鍵盤輸入
app_execute(); //應用程序執行
counter++; //循環計數
}}順序執行的單任務程序設計該例中,每個函數執行一個獨立操作或任務。任務依次按順序執行。當任務數量增加時,調度會成為問題。例如,若process_kbd_cmds()函數的執行耗費大量時間,主循環會很慢才執行到check_serial_io(),此時串口數據可能已經丟失。多任務系統的執行特點多任務系統的設計思路:各功能模塊(如顯示、鍵盤掃描等等)處于等同地位。各功能模塊執行順序可在程序運行過程中動態地改變。各子任務在自已的時間片內運行,通過合理設計時間片大小和各任務的優先級,可以自然地滿足系統內各種復雜的時序要求。類似這樣的任務管理和調度,就是多任務OS的核心。多任務系統的執行特點check_serial_io(
)process_serial_cmds(
)check_kbd_io(
)process_kbd_cmds(
)app1_execute(
)app2_execute(
)任務調度時間片輪轉、任務優先級設定等功能15.1.2什么是RTOS實時操作系統(Real-Time
Operating
System,RTOS),是指當外界事件或數據產生時,能夠接受并以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,并控制所有實時任務協調一致運行的操作系統。RTOS廣泛應用于嵌入式計算機技術領域,比如μCOS、VxWork、Linux、WinCE等,51單片機上常用的SmallRTOS51,還有目前手機中廣泛使用的Android、iOS,都是典型的RTOS。15.2
RTX51的特點RTX51是一款小巧的針對基于8051核心的嵌入式系統的多任務RTOS。使用它可以簡化比較復雜、有嚴格時間限制的程序的設計過程。RTX51主要有兩個不同的可用版本:標準版(RTX51-Full)和精簡版(RTX51-Tiny)。在RTX51-Full中:既可以以輪循(Round-Robin)方式執行任務,也可以按4級任務優先級的方式切換不同優先級的任務。以并行方式工作,支持中斷管理,信號和消息可以通過郵箱系統在不同任務之間傳遞。RTX51-Tiny是RTX51-Full的一個子集,支持RTX51中絕大多數的特性,且不需要外部RAM(XDATA)。RTX51-Tiny支持RTX51-Full的許多特性,但不具有以下功能:不支持優先任務切換不包含信息子程序無存儲器庫分配子程序。15.2
RTX51的特點描述RTX51-FullRTX51-Tiny任務數量最多256個;可同時激活19個16個RAM需求40~46Byte的DATA空間20~200ByteIDATA空間(用戶堆棧)最小650字節XDATA空間7Byte的DATA空間3倍于任務數量的IDATA空間代碼要求6KB~8KB900Byte硬件要求定時器0或定時器1定時器0系統時鐘1000到40000個周期1000到65535個周期中斷請求時間小于50個周期小于20個周期任務切換時間快速任務:70~100個周期標準任務:180~700個周期(取決于堆棧負載)100~700個周期(取決于堆棧負載)郵箱系統8個分別帶有整數入口的信箱不提供內存池最多16個內存池不提供信號量8*1位不提供15.3
RTX51的程序設計由于Keil
C中自帶RTX51-Tiny版,下面就以Tiny版本為例,簡要介紹其軟件設計方法。軟件環境的要求:在使用RTX51-TINY時,需要以下軟件支持:1)C51編譯器2)BL51連接定位器3)A51宏匯編器庫文件RTX51TNY.LIB必須存儲在C51\LIB下,必須指定C51運行庫的路徑。頭文件RTX51TNY.h必須存儲在C51\INC下,必須指定C51包含文件的路徑。15.3
RTX51的程序設計
—運行機制RTX51Tiny通過輪循(Round-Robin)方式來實現多任務,以達到多個無限循環或任務的準并行執行。這里的多任務并不是真正同時執行的,而是使用不同的時間片來執行,即只是宏觀上的同時執行。它將可用的CPU周期分成多個時間片,由RTX51把這些時間片分配給每一個任務使用。每個任務只能在預定的時間片里運行,然后RTX51再切換到另一個己經準備就緒的任務,讓它再執行一定的時間片。時間片一般是比較短促的,一個時間片大約只有毫秒級時間。正是由于這個原因,在用戶看來,多個任務似乎是在同時執行的。15.3
RTX51的程序設計
—運行機制RTX51利用了一個由定時器0的中斷信號驅動的定時程序來實現上述時間片的控制。定時器產生的周期性中斷信號用來驅動RTX51的定時節拍。SFR中的全局中斷允許位EA或定時器0中斷允許位ET0被屏蔽,都可能使RTX51-Tiny停止運行。因此,除非有特殊的應用目的,應該使定時器0的中斷始終開啟,以保證RTX51-Tiny的正常運行。15.3
RTX51的程序設計
—任務在RTX51系統中,一個任務體現為一個C51函數,該函數不能有返回值,不能有參數,且函數體必須是一個無限循環,以保證該函數不能返回。實際應用中,一個復雜的系統往往被分解成若干可以并行處理的任務,每個任務只完成一個單一的操作(如鍵盤掃描、顯示、通信等),從而降低系統設計的難度。在RTX51-Tiny系統中一個具體的任務通過下面的格式定:15.3
RTX51的程序設計
—任務
voidtaskname(void)_task_num其中,num是任務號,取值為0-15;taskname是任務名稱(亦即函數名)。下面是一個具體的任務定義voidinit(void)_task_0{
/*操作語句*/ while(1){
/*操作語句*/ }}RTX51-Tiny最多只允許處理16個任務15.3
RTX51的程序設計
—任務RTX51區分2類任務:快速任務和標準任務。快速任務有很快的響應速度,每個快速任務使用8051一個單獨的寄存器組,并且有自己的堆棧區域。RTX51支持最大同時有3個快速任務。標準任務需要多一點的時間來進行任務切換,因此使用的內部RAM相對快速任務要少,所有的標準任務共用1個寄存器組和堆棧。當任務切換的時候,當前任務的寄存器狀態和堆棧內容轉移到外部存儲器中。RTX51-Full支持任務最多達64個;RTX51-Tiny僅支持標準任務,最多16個。這里我們僅討論標準任務15.3
RTX51的程序設計
—任務狀態RTX51-Tiny的用戶任務有5種狀態,如下表所示。某一時刻用戶任務處在某個狀態,在一定條件下任務狀態可以發生改變。狀態描述運行(RUNNING)當前正在運行的任務處于RUNNING態,同一時刻只能有1個任務處于該狀態。就緒(READY)等待運行的任務處于READY態,可能有多個。當前運行的任務時間片完成后,從READY態的任務隊列中選取下一個任務運行,使其進入RUNNING態。超時(TIMEOUT)任務由于時間片用完處于TIMEOUT態,在僅具有時間片輪循調度方式的RTX51-Tiny中,該狀態等價于READY態。等待(WAITING)正在等待一個事件發生的任務處于WAITING態。如果該事件發生,則任務進入READY態。刪除(DELETED)尚未啟動的任務處于DELETED態15.3
RTX51的程序設計
—任務狀態5種狀態之間的轉化條件:READY態/TIMEOUT態RUNNING態WAITING態時間片到來時間片結束等待一個事件事件發生15.3
RTX51的程序設計
—一個示例#include<reg51.h>#include<rtx51tny.h>uintcounter0=0;uintcounter1=0;voidjob0()_task_0{ //程序的執行從任務0開始 os_create_task(1); //將任務1標記為“READY”狀態 while(1)counter0++; //任務函數內部必須構成死循環}voidjob1()_task_1{ while(1)counter1++; //任務函數內部必須構成死循環}思考:counter0和counter1是交替加1么?不能出現main()函數15.3
RTX51的程序設計
—用于任務管理的常見系統函數1、os_create_task函數原型:char
os_create_task(unsignedchartask_id);功能說明:啟動已定義的編號為task_id的任務,并標記為就緒,準備執行。返回值:如果任務成功啟動,此函數返回0值;如果沒有task_id說明的任務,則返回-1。2、os_delete_task函數原型:char
os_delete_task(unsignedchartask_id);功能說明:停止編號為task_id的任務,并將此任務從任務表中刪除。返回值:如果任務被成功停止并刪除,函數返回0值;如果編號為task_id的任務沒有啟動或不存在,則返回-1。用于任務管理的常見系統函數3、os_running_task_id函數原型:char
os_running_task_id(void);功能說明:檢測當前處于運行態的任務編號。返回值:返回當前處于運行態的任務編號,返回值為0~15。4、os_set_ready函數原型:voidos_set_ready(unsignedchartask_id);功能說明:將編號為task_id的任務設置為就緒態。返回值:無用于任務管理的常見系統函數5、os_wait函數原型:char
os_wait(unsignedcharevent_sel,
/*等待的事件*/
unsignedcharticks,/*等待時長,即定時器的溢出次數*/ unsignedchardummy); /*Tiny版未用,恒為0*/功能說明:暫停當前執行的任務,并等待一個或多個事件(如時間間隔、超時、從另一個任務或中斷發出的信號等)發生。參數event_sel說明所等待的一個或幾個事件的組合,事件種類如下表所示。事件描述K_SIG等待一個信號量K_TMO等待由ticks指定的超時時間K_IVL等待由ticks指定的時間間隔用于任務管理的常見系統函數5、os_wait返回值:當有一個指定的事件發生時,任務被置為就緒態。當任務繼續執行時,os_wait返回重新啟動任務的特定事件。有以下可能的返回值:事件描述RDY_EVENT任務就緒標志被os_set_ready或isr_set_ready函數置位SIG_EVENT接收到一個信號量TMO_EVENT達到超時或間隔時間NOT_OKevent_sel參數無效用于任務管理的常見系統函數6、os_wait1函數原型:charos_wait1(unsignedcharevent_sel);
/*等待的事件*/功能說明:暫停當前執行的任務,并等待一個事件發生。該函數是os_wait函數的一個子集,它不支持所有的事件,參數event_sel只能是K_SIG。返回值:與os_wait函數對比,缺少TMO_EVENT。7、os_wait2函數原型:charos_wait2(unsignedcharevent_sel,
/*等待的事件*/
unsignedcharticks);/*等待的定時器時標數*/功能說明:與os_wait函數相同,但沒有dummy參數。返回值:與os_wait函數相同用于任務管理的常見系統函數8、os_send_signal函數原型:char
os_send_signal(unsignedchartask_id);功能說明:該函數向編號task_id的任務發送一個信號。若該任務已經在等待此信號,本函數將任務置為就緒態;若該任務沒有準備接收此信號,則信號將存儲在任務的信號標志中。返回值:函數執行成功返回0;若指定的任務不存在,返回-1。9、os_clear_signal函數原型:char
os_clear_signal(unsignedchartask_id);功能說明:該函數向清楚號task_id的任務的信號標志。返回值:若信號標志被成功清零,返回0;若指定的任務不存在,返回-1。用于任務管理的常見系統函數10、isr_send_signal函數原型:char
isr_send_signal(unsignedchartask_id);功能說明:該函數功能與os_send_signal函數完全相同,區別在于只能從中斷函數中調用。返回值:函數執行成功返回0;若指定的任務不存在,返回-1。11、isr_set_ready函數原型:void
isr_set_ready(unsignedchartask_id);功能說明:將編號為task_id的任務設置為就緒態。僅能從中斷函數中調用。返回值:無。用于任務管理的常見系統函數12、os_switch_task函數原型:char
os_switch_task(void);功能說明:該函數讓調用它的任務暫時停止運行,轉而切換至另外一個任務運行。如果調用該函數的任務是唯一一個就緒任務,那么該任務將立即恢復運行。返回值:無。用于任務管理的常見系統函數13、os_reset_interval函數原型:void
os_reset_interval(unsignedcharticks);功能說明:用于糾正由于os_wait函數同時等待K_SIG和K_IVL事件而產生的時間問題。如果一個信號事件(K_SIG)引起os_wait退出,時間間隔定時器并不調整,這樣會導致后續的os_wait調用(等待一個時間間隔)延遲的不是預期的時間周期。該函數允許將時間間隔定時器復位,這樣,后續對os_wait的調用就會按預期的操作進行。返回值:無。15.4
RTX51的系統配置編寫RTX51程序需要包含RTX51TNY.h文件。在程序中,需要用一個關鍵字“_task_”來聲明一個函數的任務屬性。RTX51程序不需要main函數。在進行連接處理時,會將執行任務0所需要的代碼連接進來,作為開始執行的代碼。用戶可以更改配置文件CONF_TNY.A51中的以下幾個參數:1)系統定時器中斷所用的寄存器組2)系統定時器的時間間隔3)Round-Robin的超時(time-out)值4)內部數據存儲器的大小5)RTX5l啟動后的自由堆棧大小15.4
RTX51的系統配置以下是配置文件CONF_TNY.A51中的部分內容;-----------------------------------------------------------------------------;RTX51-tiny的硬件定時器;用下面的EQU可預置RTX51的定時器時間常數;用8051定時器0作為控制軟件的定時器;-----------------------------------------------------------------------------;定義定時器中斷用的寄存器組INT_REGBANK EQU 1 ;默認為寄存器1組;定義8051定時器0溢出所需的機器周期數INT_CLOCK EQU 10000 ;默認周期數為10000,即10ms;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 青浦高三語文一模作文
- 玻璃纖維增強塑料的注射成型技術考核試卷
- 紙漿改性技術對紙張性能的影響分析考核試卷
- 磷肥產業環保責任與綠色生產考核試卷
- 小學三年級上冊口算練習500題
- 液體外滲的預防與處理 2
- 四川司法警官職業學院《Excel統計實踐》2023-2024學年第二學期期末試卷
- 四川省巴中學市平昌縣市級名校2025屆初三下-開學考試物理試題試卷含解析
- 江西科技師范大學《制圖》2023-2024學年第二學期期末試卷
- 吉林農業大學《馬克思主義發展史》2023-2024學年第二學期期末試卷
- GB/T 14388-1993木工硬質合金圓鋸片
- 衛生院B超、心電圖室危急值報告制度及流程
- 腫瘤化療-課件
- 第三節鋼筋混凝土排架結構單層工業廠房結構吊裝課件
- 普通高中學生綜合素質評價檔案
- 產品路標規劃-綜述2.1
- 2023年鄭州工業應用技術學院單招考試面試題庫及答案解析
- 《電子制造技術-電子封裝》配套教學課件
- 二月份循證護理查房課件
- 粉筆國考行測模考大賽第八季
- JJF(湘) 09-2018 純水-超純水系統監測儀表(電導率)計量校準規范-(高清現行)
評論
0/150
提交評論