第十三章RTX51實(shí)時(shí)多任務(wù)操作系統(tǒng)_第1頁
第十三章RTX51實(shí)時(shí)多任務(wù)操作系統(tǒng)_第2頁
第十三章RTX51實(shí)時(shí)多任務(wù)操作系統(tǒng)_第3頁
第十三章RTX51實(shí)時(shí)多任務(wù)操作系統(tǒng)_第4頁
第十三章RTX51實(shí)時(shí)多任務(wù)操作系統(tǒng)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、單片機(jī)接口技術(shù)(c51版)第十三章 rtx51實(shí)時(shí)多任務(wù)操作系統(tǒng) 內(nèi)容概述內(nèi)容概述 主要介紹多任務(wù)編程思想、rtx51操作系統(tǒng)的特點(diǎn)、模式及運(yùn)行要求,rtx51 的工作原理、rtx51 tiny的配置及基于rtx51 tiny的鍵盤顯示系統(tǒng)設(shè)計(jì)。n教學(xué)目標(biāo)教學(xué)目標(biāo)1.了解多任務(wù)編程思想,理解多任務(wù)編程與單任務(wù)編程的區(qū)別及優(yōu)點(diǎn)。2.了解rtx51的完全模式和最小模式的區(qū)別。3. 理解任務(wù)的幾種狀態(tài)及其定義,掌握任務(wù)切換過程,能進(jìn)行簡單的任務(wù)切換程序設(shè)計(jì);理解事件的定義,了解rtx51系統(tǒng)中的超時(shí)、間隔、信號(hào)、消息、中斷等幾個(gè)事件,能使用os_wait()函數(shù)同步2個(gè)或幾個(gè)任務(wù),能使用信號(hào)控制任務(wù)

2、的啟動(dòng)和停止。4.了解rtx51處理中斷的中斷函數(shù)和rtx51的任務(wù)中斷(分為快速任務(wù)中斷和標(biāo)準(zhǔn)任務(wù)中斷)及實(shí)現(xiàn)過程。5.了解 rtx51 tiny的同步機(jī)制、調(diào)度規(guī)則、任務(wù)控制塊、存儲(chǔ)器管理等。掌握 rtx51 tiny的配置,能夠修改rtx51 tiny配置文件conf_tny.a51 。6. 掌握基于rtx51 tiny的鍵盤、顯示系統(tǒng)的程序設(shè)計(jì)。131 多任務(wù)編程思想n13.1.1 單任務(wù)機(jī)制工作原理單任務(wù)機(jī)制工作原理n在單任務(wù)機(jī)制下,各功能模塊按固定順序構(gòu)成一個(gè)整體,作為一個(gè)任務(wù)得到執(zhí)行。各個(gè)模塊要求的執(zhí)行頻率不一致時(shí)程序難以滿足。n需在運(yùn)行時(shí)動(dòng)態(tài)改變執(zhí)行結(jié)構(gòu)的系統(tǒng),程序需用許多條件

3、判斷和分枝轉(zhuǎn)移語句進(jìn)行控制,增加了程序的復(fù)雜性。 n其可讀性和可維護(hù)性很差,調(diào)試不便。增加了系統(tǒng)擴(kuò)充難度。 13.1.2 多任務(wù)機(jī)制工作原理多任務(wù)機(jī)制工作原理n各功能模塊處于等同地位。n各功能模塊執(zhí)行順序可在程序運(yùn)行過程中動(dòng)態(tài)地改變。n各功能模塊的執(zhí)行頻率表現(xiàn)為它們的優(yōu)先級。n各子任務(wù)在自已的時(shí)間片內(nèi)運(yùn)行,通過合理設(shè)計(jì)時(shí)間片大小和各任務(wù)的優(yōu)先級,可以自然地滿足系統(tǒng)內(nèi)各種復(fù)雜的時(shí)序要求。 13.2 rtx51的特點(diǎn)及運(yùn)行要求nrtx51 執(zhí)行循環(huán)多任務(wù)處理,允許幾個(gè)循環(huán)任務(wù)準(zhǔn)并行執(zhí)行。n任務(wù)并不同時(shí)執(zhí)行而是按時(shí)間分段執(zhí)行,有效的cpu 時(shí)間劃分成時(shí)間段并由rtx51 將時(shí)間段分配給每個(gè)任務(wù)。每個(gè)

4、任務(wù)允許執(zhí)行預(yù)定數(shù)量的時(shí)間,然后rtx51 切換到另一個(gè)任務(wù)運(yùn)行,時(shí)間段非常短,通常僅有幾個(gè)毫秒,因此任務(wù)看起來好象是同時(shí)執(zhí)行的。rtx51 使用一個(gè)定時(shí)子程序,其中斷驅(qū)動(dòng)是由8051的硬件定時(shí)器產(chǎn)生周期性中斷來驅(qū)動(dòng)rtx51時(shí)鐘。nrtx51 不要求程序中有主函數(shù)。它自動(dòng)從任務(wù)0 開始執(zhí)行,如果有主函數(shù),則必須使用os_create_task(rtx51 tiny)或os_start_system(rtx51 full)函數(shù)啟動(dòng)rtx51。13.2.1 rtx51的特點(diǎn) rtx51有2個(gè)模式:rtx51完全模式和最小模式。rtx51 tiny是rtx51的一個(gè)子集,支持rtx51中絕大多數(shù)的

5、特性,且不需要外部ram (xdata)。rtx51 tiny 支持rtx51 full 的許多特性,但不具有以下功能:n由循環(huán)多任務(wù)處理和信號(hào)實(shí)現(xiàn)任務(wù)切換n不支持優(yōu)先任務(wù)切換n不包含信息子程序n無存儲(chǔ)器庫分配子程序13.2.2 rtx51對硬件的要求 13.2.3 rtx51對軟件的要求 在使用實(shí)時(shí)多任務(wù)操作系統(tǒng) rtx51 tiny 時(shí),需要以下軟件支持: 1)c51 編譯器 2)bl51 連接定位器 3)a51 宏匯編器 庫文件 rtx51tny.lib 必須存儲(chǔ)在 c51lib 下,必須指定 c51 運(yùn)行庫的路徑。頭文件 rtx51tny.h 必須存儲(chǔ)在c51inc下,必須指定c51包

6、含文件的路徑。 rtx51 tiny 可以在沒有外部數(shù)據(jù)存儲(chǔ)器的單片機(jī)8051系統(tǒng)中運(yùn)行,但應(yīng)用程序可以存取外部存儲(chǔ)器。rtx51 tiny 可以使用 c51 編譯器支持的存儲(chǔ)器模式,存儲(chǔ)器模式的選擇僅影響應(yīng)用程序目標(biāo)文件的定位。rtx51 tiny 的系統(tǒng)變量以及應(yīng)用程序的堆棧區(qū)總是位于8051 的內(nèi)部數(shù)據(jù)存儲(chǔ)器中(data/idata),典型地,rtx51 tiny 應(yīng)用程序應(yīng)采用 small 編譯模式。13.3 rtx51基本概念及實(shí)例分析 n13.3.1 任務(wù)的狀態(tài)及定義 rtx51區(qū)分2類任務(wù):快速任務(wù)和標(biāo)準(zhǔn)任務(wù)??焖偃蝿?wù)有很快的響應(yīng)速度,每個(gè)快速任務(wù)使用8051一個(gè)單獨(dú)的寄存器組,

7、并且有自己的堆棧區(qū)域。rtx51支持最大同時(shí)有3個(gè)快速任務(wù)。標(biāo)準(zhǔn)任務(wù)需要多一點(diǎn)的時(shí)間來進(jìn)行任務(wù)切換,因此使用的內(nèi)部ram相對快速任務(wù)要少,所有的標(biāo)準(zhǔn)任務(wù)共用1個(gè)寄存器組和堆棧。當(dāng)任務(wù)切換的時(shí)候,當(dāng)前任務(wù)的寄存器狀態(tài)和堆棧內(nèi)容轉(zhuǎn)移到外部存儲(chǔ)器中。 rtx51 full支持任務(wù)最多達(dá)64個(gè),但一般rtx51 tiny支持最大16個(gè)標(biāo)準(zhǔn)任務(wù)。 rtx51任務(wù)狀態(tài) n1)運(yùn)行(running):當(dāng)前正在運(yùn)行的任務(wù)處于running狀態(tài),同一時(shí)間只有1個(gè)任務(wù)可以運(yùn)行。 n 2)就緒(ready):等待運(yùn)行的任務(wù)處于ready狀態(tài),在當(dāng)前運(yùn)行的任務(wù)退出運(yùn)行狀態(tài)后,就緒隊(duì)列中優(yōu)先級最高的任務(wù)進(jìn)入到運(yùn)行狀態(tài)。

8、n3)阻塞(blocked):等待一個(gè)事件的任務(wù)處于blocked狀態(tài),如果事件發(fā)生且優(yōu)先級比正在運(yùn)行的任務(wù)高,此任務(wù)進(jìn)入運(yùn)行狀態(tài);如果優(yōu)先級比正在運(yùn)行的任務(wù)低,此任務(wù)進(jìn)入ready狀態(tài)。 n4)刪除(deleted):沒有開始的任務(wù)處于刪除狀態(tài)。 rtx51任務(wù)狀態(tài)n5)任務(wù)切換 rtx51是搶占式多任務(wù)系統(tǒng);在時(shí)間片輪轉(zhuǎn)模式下,同級別的任務(wù)是按照時(shí)間片分別占用cpu 的。 rtx51任務(wù)有4個(gè)優(yōu)先級:0、1、2 可以分配給標(biāo)準(zhǔn)任務(wù),優(yōu)先級3是為快速任務(wù)保留的。每個(gè)任務(wù)都可以等待事件的發(fā)生,而并不增加系統(tǒng)的負(fù)擔(dān);任務(wù)可以等待消息、信號(hào)、 中斷、超時(shí)事件或者它們的組合。 任務(wù)切換是按照一定規(guī)則

9、進(jìn)行的,包括:進(jìn)入到“就緒”狀態(tài)的優(yōu)先級高的任務(wù)先執(zhí)行;如果“就緒” 狀態(tài)的幾個(gè)任務(wù)是同一個(gè)優(yōu)先級,那么最先進(jìn)入“就緒”狀態(tài)的先執(zhí)行。 任務(wù)狀態(tài)切換如圖13-3-1所示。 圖13-3-1 任務(wù)狀態(tài)切換圖例13-3-1 簡單的rtx51程序n該程序中的三個(gè)任務(wù)都是簡單的計(jì)數(shù)器循環(huán),并分別對p1.0、p1.1、p1.2取反。rtx51 開始執(zhí)行函數(shù)名為job0 的任務(wù)0 ,由該任務(wù)創(chuàng)建任務(wù)1和任務(wù)2。程序在任務(wù)0執(zhí)行一段時(shí)間后到任務(wù)1執(zhí)行一個(gè)時(shí)間段,再到任務(wù)2執(zhí)行,在任務(wù)2執(zhí)行一會(huì)兒后,rtx51 tiny切換到任務(wù)0。該處理過程無限重復(fù)下去。#include /* rtx-51 tiny 頭文件

10、 */#includelong counter0; /* 任務(wù)0的計(jì)數(shù)器 */long counter1; /*任務(wù)1的計(jì)數(shù)器 */long counter2; /*任務(wù)2的計(jì)數(shù)器 */sbit p1_0=p10;sbit p1_1=p11;sbit p1_2=p12; ob0 () _task_ 0 int i; os_create_task (1); /*啟動(dòng)任務(wù) 1 */ os_create_task (2); /*啟動(dòng)任務(wù) 2 */ while (1) /* 無窮循環(huán) */ counter0+; /* counter0 加1 */for(i=0;i1000;i+);p1_0=!p1_0

11、; job1 () _task_ 1 int i; while (1) /* 無窮循環(huán) */ counter1+; /* counter1加1 */for(i=0;i1000;i+);p1_1=!p1_1; job1 () _task_ 1 int i; while (1) /* 無窮循環(huán) */ counter1+; /* counter1加1 */for(i=0;i1000;i+);p1_1=!p1_1; 13.3.2 rtx51事件 在等待一個(gè)任務(wù)的時(shí)間片到達(dá)時(shí), rtx51使用os_wait函數(shù)通知rtx51,讓另一個(gè)任務(wù)開始執(zhí)行。這個(gè)功能終止正在運(yùn)行的當(dāng)前任務(wù),然后等待指定事件的發(fā)生。

12、這時(shí),任意數(shù)量的其它任務(wù)仍可以執(zhí)行。 rtx51的等待功能支持以下事件: *超時(shí)(timeout):掛起運(yùn)行的任務(wù)指定數(shù)量的時(shí)鐘周期。 *間隔(interval):類似于超時(shí),但是軟件定時(shí)器沒有復(fù)位,典型應(yīng)用是產(chǎn)生時(shí)鐘。 *信號(hào)(signal):用于任務(wù)內(nèi)部同步協(xié)調(diào)。 rtx51支持的事件 n*消息(message):適用于rtx51 full用于信息的交換。我們可以把一個(gè)消息發(fā)送到一個(gè)特定的郵箱。消息由2字節(jié)組成,可以是用戶按照自己的需求定義的數(shù)據(jù),也可以是指向數(shù)據(jù)的指針。 如果郵箱的消息列表已滿,而且是中斷發(fā)送消息,這個(gè)消息將會(huì)丟失;如果是任務(wù)發(fā)送消息,那么任務(wù)將會(huì)進(jìn)入到等待狀態(tài),直到郵箱

13、重新有了位置可以接收這一條信息。 郵箱是按照fifo的原則來管理消息的,如果幾個(gè)任務(wù)都在等待接收消息,那么最先進(jìn)入等待接收隊(duì)列的將接收消息。一個(gè)郵箱最多可以存儲(chǔ)8條消息。當(dāng)郵箱滿的時(shí)候,最多只能有16個(gè)等待任務(wù)。 rtx51支持的事件n*中斷(interrupt):適用于rtx51 full,一個(gè)任務(wù)可以等待8051硬件中斷。 n*信號(hào)量(semaphore):適用于rtx51 full,信號(hào)量用于管理共享的系統(tǒng)資源。通過使用“令牌”,允許在同一時(shí)刻只有一個(gè)任務(wù)使用某些資源。如果幾個(gè)任務(wù)申請?jiān)L問同一個(gè)資源,那么首先提出申請的將允許訪問,其它的任務(wù)進(jìn)入等待隊(duì)列,直到第1個(gè)任務(wù)操作完畢,下一個(gè)任務(wù)

14、才能繼續(xù)。1 使用os_wait函數(shù)nos_wait()函數(shù)掛起一個(gè)任務(wù)來等待一個(gè)事件的發(fā)生。這樣可以同步2個(gè)或幾個(gè)任務(wù)。它的工作過程如下:當(dāng)任務(wù)等待的事件沒有發(fā)生的時(shí)候,系統(tǒng)掛起這個(gè)任務(wù);當(dāng)事件發(fā)生時(shí),系統(tǒng)根據(jù)任務(wù)切換規(guī)則切換任務(wù)。使用os_wait函數(shù)等待的最簡單的事件是rtx51 時(shí)鐘報(bào)時(shí)信號(hào)中的超時(shí)周期,該類型的事件可用于需要產(chǎn)生延時(shí)的任務(wù)。這可用作代碼中的切換查詢在這樣的情況下只需要每50ms 檢查一次切換。n例13-3-2 下面的例子演示在允許其它任務(wù)執(zhí)行時(shí),如何使用os_wait 函數(shù)延遲執(zhí)行。 #include /* rtx-51 tiny functions & de

15、fines */long counter0; /*任務(wù)0的計(jì)數(shù)器 */long counter1; /*任務(wù)1的計(jì)數(shù)器 */ job0 () _task_ 0 os_create_task (1); /* 啟動(dòng)任務(wù)1 */ while (1) /* 無窮循環(huán) */ counter0+; /* counter0加1 */ os_wait (k_tmo, 5, 0); /*等待超時(shí)信號(hào): 5個(gè)時(shí)鐘報(bào)時(shí) */ job1 () _task_ 1 while (1) /* 無窮循環(huán) */ counter1+; /*counter1加1 */ os_wait (k_tmo, 10, 0); /*等待超時(shí)信

16、號(hào): 10個(gè)時(shí)鐘報(bào)時(shí) */ job0先啟動(dòng) job1, 然后在counter0加1計(jì)數(shù)以后job0呼叫 os_wait函數(shù)暫停5個(gè)時(shí)鐘報(bào)時(shí)信號(hào)。這時(shí)rtx51切換到下一個(gè)任務(wù) job1。在 job1增加counter1計(jì)數(shù)以后,它也調(diào)用 os_wait以暫停10個(gè)時(shí)鐘報(bào)時(shí)信號(hào)?,F(xiàn)在rtx51沒有其他的任務(wù)需要執(zhí)行。因此在它可以延續(xù)執(zhí)行 job0之前,它進(jìn)入一個(gè)空循環(huán),等待5個(gè)時(shí)鐘報(bào)時(shí)信號(hào)過去。 本例子的結(jié)果是 counter0每5個(gè)時(shí)鐘報(bào)時(shí)周期加1,而 counter1每10個(gè)時(shí)鐘報(bào)時(shí)周期加 1。 2 使用rtx51的信號(hào) 可以使用 os_wait功能暫停一個(gè)任務(wù)并等待從另一個(gè)任務(wù)發(fā)出的信號(hào)或

17、旗標(biāo)。這可以用于協(xié)調(diào)兩個(gè)或更多的任務(wù),等待一個(gè)信號(hào)會(huì)系統(tǒng)會(huì)執(zhí)行如下工作:如果一任務(wù)在等待一個(gè)信號(hào)并且信號(hào)標(biāo)志是0,在這個(gè)信號(hào)被發(fā)送之前,這個(gè)任務(wù)將一直處于掛起狀態(tài);如果信號(hào)標(biāo)志已經(jīng)是1,當(dāng)任務(wù)查詢信號(hào)時(shí),信號(hào)標(biāo)志會(huì)被清除并且繼續(xù)執(zhí)行任務(wù)。例13-3-3 信號(hào)使用示例。#include long counter0; /*任務(wù)0的計(jì)數(shù)器 */long counter1; /*任務(wù)1的計(jì)數(shù)器 */long counter2; /*任務(wù)2的計(jì)數(shù)器 */long counter3; /*任務(wù)3的計(jì)數(shù)器 */job0 () _task_ 0 os_create_task (1); /* 啟動(dòng)任務(wù)1 */

18、os_create_task (2); /* 啟動(dòng)任務(wù)2 */ os_create_task (3); /* 啟動(dòng)任務(wù)3 */ while (1) /* 無窮循環(huán) */ counter0+; /* counter0加1 */ os_wait (k_tmo, 5, 0); /*等待超時(shí)信號(hào): 5個(gè)時(shí)鐘報(bào)時(shí) */ job1 () _task_ 1 while (1) /* 無窮循環(huán) */ counter1+; /*counter1加1 */ os_wait (k_tmo, 10, 0); /*等待超時(shí)信號(hào): 10個(gè)時(shí)鐘報(bào)時(shí) */ job2 () _task_ 2 while (1) /* 無窮循環(huán)

19、 */ counter2+; /*counter2加1 */ if (counter2 & 0 xffff) = 0) /* 如果counter2=0 */ os_send_signal (3); /* 發(fā)信號(hào)至任務(wù)3 */ job3 () _task_ 3 while (1) /* 無窮循環(huán) */ os_wait (k_sig, 0, 0); /* 等待信號(hào) */ counter3+; /* 收到信號(hào)后,counter3加1 */ job0中啟動(dòng)任務(wù)1、任務(wù)2、任務(wù)3,counter0和counter1變化同例13-3-2。任務(wù)2沒有調(diào)用os_wait函數(shù),當(dāng)counter2 加1直

20、到counter2等于0時(shí),任務(wù)2發(fā)信號(hào)給任務(wù)3,任務(wù)3收到信號(hào)后將counter3加1。因此counter2的值是couner3的2的16次方倍 。13.3.3 rtx51中斷處理 rtx51完全模式提供2種方法來處理中斷:一種是c51的中斷函數(shù),另一種是rtx51的任務(wù)中斷。它又可以分為快速任務(wù)中斷和標(biāo)準(zhǔn)任務(wù)中斷。 中斷函數(shù)可以在不使用rtx51的情況下使用,當(dāng)中斷發(fā)生的時(shí)候,程序就跳到了相應(yīng)的中斷函數(shù),它和正在運(yùn)行的任務(wù)是相互獨(dú)立的,中斷的處理是在rtx51系統(tǒng)之外,和任務(wù)切換規(guī)則沒有關(guān)聯(lián)。 對于任務(wù)中斷的方法,不管使用快速還是標(biāo)準(zhǔn)任務(wù)來處理中斷,如果中斷發(fā)生,等待中斷的任務(wù)就從“等待”

21、狀態(tài)進(jìn)入到就緒狀態(tài),并按照任務(wù)切換規(guī)則進(jìn)行切換。這種中斷處理是完全集成在rtx51的內(nèi)部,硬件中斷事件的處理和信號(hào)、消息的處理是完全相同的。在系統(tǒng)響應(yīng)時(shí)間上中斷函數(shù)是最快的。rtx51必須完全控制中斷使能寄存器,這樣才能遵守任務(wù)的切換規(guī)則并保證中斷程序的無誤進(jìn)行。必須注意中斷使能寄存器是由rtx51完全控制的,禁止用戶手動(dòng)修改。 13.3.4 rtx51 tiny的配置 用戶可以修改rtx51 tiny配置文件conf_tny.a51 ,在該文件中可以修改以下參數(shù):n用于系統(tǒng)時(shí)鐘報(bào)時(shí)中斷的寄存器組n系統(tǒng)計(jì)時(shí)器的間隔時(shí)間n時(shí)間片輪轉(zhuǎn)超時(shí)值n內(nèi)部數(shù)據(jù)存儲(chǔ)器容量nrtx51 tiny運(yùn)行之后釋放的堆

22、棧大小配置文件部分配置說明int_regbank equ 1 ; 定義定時(shí)器中斷時(shí)默認(rèn)寄存器組1; 定義定時(shí)器溢出的機(jī)器周期數(shù)int_clockequ10000 ; 默認(rèn)值為10000個(gè)機(jī)器周期數(shù); 用硬件定時(shí)器的脈沖定義任務(wù)循環(huán)切換時(shí)間timesharingequ 0; 默認(rèn)值為5個(gè)脈沖long_usr_intrequ 0; 用戶的中斷服務(wù)程序執(zhí)行時(shí)間比任務(wù)循環(huán)切換時(shí)間短,設(shè)為0,否則為1code_banking equ 0 ; 用戶程序不需要分頁,設(shè)為0,否則為1;定義cpu堆棧的最高ram地址ramtop equ 0ffh ; 默認(rèn)值為地址(2561)free_stack equ 20

23、; 默認(rèn)值為堆棧中20個(gè)字節(jié)的自由空間stack_errormacroclrea; 禁止中斷sjmp $; 堆棧耗盡,則無窮循環(huán)endm偽指令的變量說明 nint_regbank。指示哪些寄存器組將用于rtx51 tiny的系統(tǒng)中斷。nint_clock。定義系統(tǒng)時(shí)鐘間隔。系統(tǒng)時(shí)鐘使用這個(gè)間隔產(chǎn)生中斷,定義的數(shù)目確定了每一中斷的cpu周期數(shù)量。ntimesharing。定義時(shí)間片輪轉(zhuǎn)任務(wù)切換的超時(shí)時(shí)間timeout。它的值表明了在 rtx51 tiny切換到另一任務(wù)之前時(shí)間報(bào)時(shí)信號(hào)中斷的數(shù)目,如果這個(gè)值是 0,時(shí)間片輪轉(zhuǎn)多重任務(wù)將被禁止。nramtop。表明8051派生系列內(nèi)存儲(chǔ)器存儲(chǔ)單元的最

24、大尺寸。用于8051,這個(gè)值應(yīng)設(shè)定為 7fh;用于8052,這個(gè)值應(yīng)設(shè)定為 0ffh。nfree_stack。按字節(jié)定義了自由堆棧區(qū)的大小。當(dāng)切換任務(wù)時(shí),rtx51 tiny檢驗(yàn)堆棧區(qū)指定數(shù)量的有效字節(jié),如果堆棧區(qū)太小,rtx51 tiny將激活 stack_error宏,用于 free_stack的缺省值是20,允許值為0-0ffh。nstack_error。rtx51 tiny檢查到一個(gè)堆棧問題時(shí)是運(yùn)行的宏 你可以把這個(gè)宏改為你的應(yīng)用程序需要完成的任何操作。13.4 rtx51 tiny的內(nèi)核原理的內(nèi)核原理n13.4.1 同步機(jī)制 為了能保證任務(wù)在執(zhí)行次序上的協(xié)調(diào),必須采用同步機(jī)制。內(nèi)核用

25、以下事件進(jìn)行任務(wù)間的通信和同步。n1) signal:用于任務(wù)之間通信的位,可以用系統(tǒng)函數(shù)置位或清除。如果一個(gè)任務(wù)調(diào)用了os_wait 函數(shù)等待 signal 而s ignal 未置位,則該任務(wù)被掛起直到signal置位,才返回到ready狀態(tài),并可被再次執(zhí)行。n2) timeout:由 os_wait 函數(shù)開始的時(shí)間延時(shí),其持續(xù)時(shí)間可由定時(shí)節(jié)拍數(shù)確定。帶有timeout值調(diào)用 os_wait 函數(shù)的任務(wù)將被掛起,直到延時(shí)結(jié)束,才返回到ready狀態(tài),并可被再次執(zhí)行。n3) interval:由 os_wait 函數(shù)開始的時(shí)間間隔,其間隔時(shí)間可由定時(shí)節(jié)拍數(shù)確定。帶有interval值調(diào)用 os

26、_wait函數(shù)的任務(wù)將被掛起,直到間隔時(shí)間結(jié)束,然后返回到ready狀態(tài),并可被再次執(zhí)行。與timeout不同的是,任務(wù)的節(jié)拍計(jì)數(shù)器不復(fù)位。13.4.2 調(diào)度規(guī)則 rtx51 tiny使用8051內(nèi)部定時(shí)器to來產(chǎn)生定時(shí)節(jié)拍,各任務(wù)只在各自分配的定時(shí)節(jié)拍數(shù)(時(shí)間片) 內(nèi)執(zhí)行。當(dāng)時(shí)間片用完后,切換至下一任務(wù)運(yùn)行, 因此,各任務(wù)是并發(fā)執(zhí)行的。 調(diào)度規(guī)則如下:如果 任務(wù)調(diào)用了os_wait 函數(shù),且特定事件還沒有發(fā)生, 任務(wù)執(zhí)行比循環(huán)切換所規(guī)定的時(shí)間長,則運(yùn)行任務(wù)被中斷:如果 沒有其它任務(wù)正在運(yùn)行; 任務(wù)處于“ready” 或“timeout” 狀態(tài)下等待運(yùn)行,則另一個(gè)任務(wù)開始。13.4.3 任務(wù)控

27、制塊 為了能描述和控制任務(wù)的運(yùn)行,內(nèi)核為每個(gè)任務(wù)定義了稱作任務(wù)控制塊的數(shù)據(jù)結(jié)構(gòu), 主要包括三項(xiàng)內(nèi)容:n1) entrytask_id:task_id任務(wù)的代碼入口地址,位于code空間,2字節(jié)為個(gè)單位;n2) stkptask_id:taskid任務(wù)所使用堆棧棧底位置,位于idata空間,字節(jié)為個(gè)單位;n3) statetaskidtimer和statetaskedstate:前者表示任務(wù)的定時(shí)節(jié)拍計(jì)數(shù)器, 在每一次定時(shí)節(jié)拍中斷后都自減一次;后者表示任務(wù)狀態(tài)寄存器,用其各個(gè)位來表示任務(wù)所處的狀態(tài)。位于idata空間,以2字節(jié)為一單位。13.4.4 存儲(chǔ)器管理 內(nèi)核使用了 keil c51 編譯

28、器的對全局變量和局部變量采取靜態(tài)分配存儲(chǔ)空間的策略, 因此存儲(chǔ)器管理簡化為堆棧管理。內(nèi)核為每個(gè)任務(wù)都保留一個(gè)單獨(dú)的堆棧區(qū),全部堆棧管理都在idata空間進(jìn)行。為了給當(dāng)前正在運(yùn)行的任務(wù)分配盡可能大的棧區(qū), 所以各個(gè)任務(wù)所用的堆棧位置是動(dòng)態(tài)的,并用stkptask_id來記錄各任務(wù)的堆棧棧底位置。當(dāng)堆棧自由空間小于 freestack (默認(rèn)為2o)個(gè)字節(jié)時(shí),就會(huì)調(diào)用宏stack- error,進(jìn)行堆棧出錯(cuò)處理。 在以下情況會(huì)進(jìn)行堆棧管理:n1) 任務(wù)切換,將全部自由堆??臻g分配給正在運(yùn)行的任務(wù);n2) 任務(wù)創(chuàng)建,將自由堆??臻g的2個(gè)字節(jié),分配給新創(chuàng)建的任務(wù)task_id,并將 entrytask

29、_id,放入其堆棧;n3) 任務(wù)刪除,回收被刪除的任務(wù)task_id的堆棧空間,并轉(zhuǎn)換為自由堆??臻g。堆棧管理圖示注:(a)任務(wù)a正在運(yùn)行; (b)切換至任務(wù)b運(yùn)行; (c) 刪除任務(wù)c后自由空間增加; (d)創(chuàng)建任務(wù)d 后, 自由空間減少2字節(jié) 13.4.5 代碼分析 內(nèi)核代碼用匯編語言寫成,可讀性差,但代碼效率較高,主要由兩個(gè)源程序文件conf_tnya51和rtxtnya51組成。 前者是一個(gè)配置文件,用來定義系統(tǒng)運(yùn)行所需要的全局變量和堆棧出錯(cuò)的宏stackerror,這些全局變量和宏,用戶都可以根據(jù)自己的系統(tǒng)配置靈活修改;后者是系統(tǒng)內(nèi)核,完成系統(tǒng)調(diào)用的所有函數(shù)。13.3.5.1 主程序

30、mainn主程序main的主要任務(wù)是初始化各任務(wù)堆棧棧底指針stkp、狀態(tài)字state和定時(shí)器to,創(chuàng)建任務(wù)0并將其導(dǎo)入運(yùn)行隊(duì)列。這個(gè)過程加上keil c5 1的啟動(dòng)代碼cstartup正是一般嵌入式系統(tǒng)中bsp所作的工作。13.3.5.2定時(shí)器t0中斷服務(wù)程序n內(nèi)核使用定時(shí)器t0作為定時(shí)節(jié)拍發(fā)生器,是任務(wù)切換、時(shí)間片輪轉(zhuǎn)的依據(jù)。中斷服務(wù)程序有三個(gè)任務(wù)。n 更新各個(gè)任務(wù)節(jié)拍數(shù):將statetaskidtimer減1, 如果某任務(wù)超時(shí)(statetaskidtimer:0),并且該任務(wù)正在等待超時(shí)事件, 則將該任務(wù)置為“ready” 狀態(tài),使其返回任務(wù)隊(duì)列。n 檢查自由堆??臻g:若自由堆??臻g范

31、圍小于freestack (默認(rèn)為2 0字節(jié))時(shí), 可以調(diào)用宏stack_error,進(jìn)行堆棧出錯(cuò)處理。n 檢查當(dāng)前任務(wù)(處于running狀態(tài))的時(shí)間片是否到時(shí)。若當(dāng)前任務(wù)的時(shí)間片到時(shí), 將程序轉(zhuǎn)到任務(wù)切換程序段(taskswitching)切換下一任務(wù)運(yùn)行。定時(shí)器t0中斷服務(wù)程序流程圖圖13-4-2 定時(shí)器t0中斷服務(wù)程序流程圖13.3.5.3任務(wù)切換程序段 整個(gè)內(nèi)核中最核心的程序段,主要功能是完成任務(wù)切換。它共有兩個(gè)入口taskswitching和switchingnow 。前者供定時(shí)器to的中斷服務(wù)程序調(diào)用,后能供系統(tǒng)函數(shù)os_delete和os_wait調(diào)用。相應(yīng)也有兩個(gè)不同的出口。 工作流程是首先將當(dāng)前任務(wù)置為“timeout” 狀態(tài),等待下一次時(shí)間片循環(huán),其次找到下一個(gè)處于“ready”狀態(tài)的任務(wù)并使其成為當(dāng)前任務(wù)。然后進(jìn)行堆棧管理, 將自由堆棧

溫馨提示

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

評論

0/150

提交評論