關(guān)于RTX51 TINY的分析與探討

發(fā)布時(shí)間:2010-9-25 23:29    發(fā)布者:eetech
關(guān)鍵詞: RTX51 , Tiny
1 概述

RTX51 TINY是一種應用于MCS51系列單片機的小型多任務(wù)實(shí)時(shí)操作系統。它完全集成在Keil C5l編譯器中,具有運行速度快、對硬件要求不高、使用方便靈活等優(yōu)點(diǎn),因此越來(lái)越廣泛地應用到單片機的軟件開(kāi)發(fā)中。它可以在單個(gè)CPU上管理幾個(gè)作業(yè)(任務(wù)),同時(shí)可以在沒(méi)有擴展外部存儲器的單片機系統上運行。

RTX51 TINY允許同時(shí)“準并行”地執行多個(gè)任務(wù):各個(gè)任務(wù)并非持續運行,而是在預先設定的時(shí)間片(time slice)內執行。CPU執行時(shí)間被劃分為若干時(shí)間片,RTX51 TINY為每個(gè)任務(wù)分配一個(gè)時(shí)間片,在一個(gè)時(shí)間片內允許執行某個(gè)任務(wù),然后RTX51 TINY切換到另一個(gè)就緒的任務(wù)并允許它在其規定的時(shí)間片內執行。由于各個(gè)時(shí)間片非常短,通常只有幾ms,因此各個(gè)任務(wù)看起來(lái)似乎就是被同時(shí)執行了。

RTX51 TINY利用單片機內部定時(shí)器0的中斷功能實(shí)現定時(shí),用周期性定時(shí)中斷驅動(dòng)RTX51 TINY的時(shí)鐘。它最多可以定義16個(gè)任務(wù),所有的任務(wù)可以同時(shí)被激活,允許循環(huán)任務(wù)切換,僅支持非搶占式的任務(wù)切換,操作系統為每一個(gè)任務(wù)分配一個(gè)獨立的堆棧區,在任務(wù)切換的同時(shí)改變堆棧的指針,并保存和恢復寄存器的值。RTX51 TINY沒(méi)有專(zhuān)門(mén)的時(shí)間服務(wù)函數和任務(wù)掛起函數,而是通過(guò)os_wait()中的參數設定實(shí)現的。使用RTX51 TINY時(shí)用戶(hù)程序中不需要包含main()函數,它會(huì )自動(dòng)地從任務(wù)0開(kāi)始運行。如果用戶(hù)程序中包含有main()函數,則需要利用os_create_task函數來(lái)啟動(dòng)RTX51實(shí)時(shí)操作系統。

2 任務(wù)切換

2.1 RTX51 TINY任務(wù)狀態(tài)

RTX51 TINY的用戶(hù)任務(wù)具有以下幾個(gè)狀態(tài):

① 運行(RUNNING)——任務(wù)正處于運行中。同一時(shí)刻只有一個(gè)任務(wù)可以處于“RUNNING”狀態(tài)。

② 就緒(READY)——等待運行的任務(wù)處于“READY”狀態(tài)。在當前運行的任務(wù)退出運行狀態(tài)后,就緒隊列中的任務(wù)根據調度策略被調度執行,進(jìn)入到運行狀態(tài)。

③ 阻塞(BLOCKED)——等待一個(gè)事件的任務(wù)處于“BLOCKED”狀態(tài)。如果等待的事件發(fā)生,則此任務(wù)進(jìn)入“READY”狀態(tài),等待被調度。

④ 休眠(SLEEPING)——被聲明過(guò)但沒(méi)有開(kāi)始運行的任務(wù)處于休眠狀態(tài)。運行過(guò)但已經(jīng)被刪除的任務(wù)也處在休眠狀態(tài)中。

⑤ 超時(shí)(TIMEOUT)——任務(wù)由于時(shí)間片用完而處于“TIMEOUT”狀態(tài),并等待再次運行。該狀態(tài)與“READY”狀態(tài)相似,但由于是內部操作過(guò)程使一個(gè)循環(huán)任務(wù)被切換,因而單獨算作一個(gè)狀態(tài)。

處于“READY/TIMEOUT”、“RUNNING”和“BLOCKED”狀態(tài)的任務(wù)被認為是激活的狀態(tài),三者之間可以進(jìn)行切換!癝LEEPING”狀態(tài)的任務(wù)是非激活的,不能被執行或認為已經(jīng)終止。

2.2 RTX51 TINY任務(wù)切換

任務(wù)切換是RTX51 TINY提供的基本服務(wù)。RTX51 TINY是基于時(shí)間片調度算法的操作系統,它支持的是非搶占式的任務(wù)切換。所以在一個(gè)任務(wù)被執行時(shí)不能對其進(jìn)行中斷,除非該任務(wù)主動(dòng)放棄CPU的資源,中斷才可以打斷當前的任務(wù),中斷完成后把CPU的控制權再交還該被中斷的任務(wù)。任務(wù)切換有兩種情況,一種是當前任務(wù)主動(dòng)讓出CPU資源;另一種情況是在當前任務(wù)的時(shí)間片已經(jīng)用完的情況下,進(jìn)行任務(wù)切換。CPU執行時(shí)間被分成若干個(gè)時(shí)間片,RTX51 TINY為每個(gè)任務(wù)分配一個(gè)時(shí)間片。時(shí)間片是通過(guò)對變量TIMESHARING的設置來(lái)確定的,即用“TIMESHARING EQU 5;”設置多少個(gè)系統時(shí)鐘周期為一個(gè)時(shí)間片。系統默認5個(gè)系統時(shí)鐘為一個(gè)時(shí)間片,如果晶振頻率為11.0592 MHz,則時(shí)間片為10.8507×5=54.2535 ms。

RTX51 TINY的任務(wù)切換共有TASKSWITCHING和SWITCHINGNOW兩個(gè)入口,前者供定時(shí)器T0的中斷服務(wù)程序調用,后者供系統函數os_delete和os_wait調用。相應地也有兩個(gè)不同的出口,分別是恢復保護現場(chǎng)和清除狀態(tài)標志位。系統首先將當前任務(wù)置為“TIMEOUT”狀態(tài),等待下一次時(shí)間片循環(huán),然后找到下一個(gè)處于“READY”狀態(tài)的任務(wù),通過(guò)堆棧管理,將自由堆?臻g分配給該任務(wù),使其成為當前任務(wù)。清除使該任務(wù)進(jìn)入“READY”或“TIMEOUT”狀態(tài)的相關(guān)位后,執行該任務(wù)。任務(wù)切換的流程如圖1所示。



圖1 任務(wù)切換流程

3 共享資源實(shí)現

RTX51 TINY由于是一個(gè)多任務(wù)的操作系統,那么就不免會(huì )有幾個(gè)任務(wù)使用同一個(gè)資源,這些資源可能是一個(gè)變量,也可能是輸入/輸出設備。這就要求一個(gè)任務(wù)在使用共享資源時(shí)必須獨占該資源,否則可能會(huì )造成數據被破壞。

在RTX51 TINY中實(shí)現共享資源獨占的方法比較多。比如,可以通過(guò)TIMESHARING這個(gè)變量來(lái)禁止時(shí)間片輪轉,使其值為0,就可以實(shí)現禁止任務(wù)切換,從而當前任務(wù)就可以獨占共享資源。還可以關(guān)閉中斷來(lái)實(shí)現,使EA=0,定時(shí)器T0的中斷被關(guān)閉,不能再為時(shí)間片輪轉提供基準,從而禁止了任務(wù)切換。但這兩種方法都帶有一定的局限性,前一種方法只能適用于實(shí)時(shí)性要求不高的場(chǎng)合,后一種方法由于T0中斷關(guān)閉時(shí)間不能太長(cháng),只能適用于一些簡(jiǎn)單變量操作的場(chǎng)合;谝陨锨闆r,下面通過(guò)另一種方法來(lái)實(shí)現共享資源的使用。

在RTX51 full中可以利用信號量很好地實(shí)現對共享資源的操作,也可以把這種思想應用到RTX51 TINY中;而在RTX51 TINY中不支持信號量,這就要求用戶(hù)自己定義信號量及其操作過(guò)程。以下是部分代碼:






有了以上幾個(gè)函數的定義和實(shí)現,就可以應用等待信號量和釋放信號量來(lái)完成對共享資源的獨占。例如:



應用信號量來(lái)實(shí)現共享資源的使用,不用禁止時(shí)間片輪轉和關(guān)閉T0中斷,可以有效地實(shí)現對共享資源的獨占;但增加了代碼,等待和釋放信號量花費了一定的時(shí)間,在具體應用中要視情況而定。

需要注意的問(wèn)題

在應用RTX51 TINY時(shí)應注意以下幾點(diǎn):

① 盡可能不使用循環(huán)任務(wù)切換。使用循環(huán)任務(wù)切換時(shí)要求有13個(gè)字節的堆棧區來(lái)保存任務(wù)內容(工作寄存器等)。如果由os_wait()函數來(lái)進(jìn)行任務(wù)觸發(fā),則不需要保存任務(wù)內容。由于正處于等待運行的任務(wù)并不需要等待全部循環(huán)切換時(shí)間結束,因此os_wait()函數可以產(chǎn)生一種改進(jìn)的系統響應時(shí)間。

② 不要將時(shí)鐘節拍中斷速率設置得太高,設定為一個(gè)較低的數值可以增加每秒的時(shí)鐘節拍個(gè)數。每次時(shí)鐘節拍中斷大約需要100"200個(gè)CPU周期,因此應將時(shí)鐘節拍率設定得足夠高,以便使中斷響應時(shí)間達到最小化。

③ 在os_wait()函數中有3個(gè)參數: K_TMO、K_IVL和K_SIG。其中對于K_TMO和K_IVL的使用要加以區別。在使用時(shí),兩者似乎差別不是很大。其實(shí)不然,兩者存在很大的區別:K_TMO是指等待一個(gè)超時(shí)信號,只有時(shí)間到了,才會(huì )產(chǎn)生一個(gè)信號。它產(chǎn)生的信號是不會(huì )累計的,產(chǎn)生信號后,任務(wù)進(jìn)入就緒狀態(tài)。而K_IVL是指周期信號,每隔一個(gè)指定的周期,就會(huì )產(chǎn)生一次信號,產(chǎn)生的信號是可以累計的。這樣就使得在指定事件內沒(méi)有響應的信號,通過(guò)信號次數的疊加,在以后信號處理時(shí),重新得以響應,從而保證了信號不會(huì )被丟失。而通過(guò)K_TMO方式進(jìn)行延時(shí)的任務(wù),由于某種原因信號沒(méi)有得到及時(shí)的響應,那么這樣就可能會(huì )丟失一部分沒(méi)有響應的信號。不過(guò)兩者都是有效的任務(wù)切換方式,在使用時(shí)要根據應用場(chǎng)合來(lái)確定對兩者的使用。

結語(yǔ)

RTX51 TINY實(shí)時(shí)操作系統既能保證對外界的信息以足夠快的速度進(jìn)行相應處理,又能并行運行多個(gè)任務(wù),具有實(shí)時(shí)性和并行性的特點(diǎn),因此能很好地完成對多個(gè)信息的實(shí)時(shí)測量、處理,并進(jìn)行相應的多個(gè)實(shí)時(shí)控制。任務(wù)切換是RTX51 TINY的一個(gè)基本服務(wù)。本文對任務(wù)切換做了詳細的分析,在實(shí)際應用中還要對任務(wù)切換時(shí)的堆棧管理有一定了解,這樣才能更好地掌握任務(wù)切換的機制。共享資源的使用在多任務(wù)操作系統中是不可避免的,RTX51 TINY中沒(méi)有專(zhuān)門(mén)的處理共享資源函數,所以在實(shí)際應用中要視情況來(lái)應用文中提到的幾種方法。
本文地址:http://selenalain.com/thread-29176-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页