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

下載本文檔

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

文檔簡介

1、嵌入式實時操作系統(tǒng) 多任務(wù)實時操作系統(tǒng) 多任務(wù)實時操作系統(tǒng) 前后臺系統(tǒng) 前后臺系統(tǒng)的組成:前臺和前后臺系統(tǒng)的組成:前臺和 后臺程序后臺程序 后臺:后臺:是一個無限循環(huán)的應(yīng)是一個無限循環(huán)的應(yīng) 用程序,循環(huán)中調(diào)用相應(yīng)的任用程序,循環(huán)中調(diào)用相應(yīng)的任 務(wù)函數(shù)完成相應(yīng)的操作,各個務(wù)函數(shù)完成相應(yīng)的操作,各個 任務(wù)依次運行,沒有調(diào)度,運任務(wù)依次運行,沒有調(diào)度,運 行的次序不能改變。行的次序不能改變。 前臺:前臺:是中斷服務(wù)程序,處是中斷服務(wù)程序,處 理異步事件。理異步事件。 適用情形 一般不復(fù)雜或?qū)崟r性要求不高的小系統(tǒng)很適合采用前后臺系 統(tǒng),例如微波爐、電話機(jī)、玩具等。 在另外一些基于省電的應(yīng)用中,由于平時

2、微處理器處在停機(jī) 狀態(tài),所有的事都靠中斷服務(wù)來完成,因此也常常采用前后 臺系統(tǒng)模式。 操作系統(tǒng) 操作系統(tǒng)(操作系統(tǒng)(Operating SystemOperating System,簡稱,簡稱OSOS)是計算機(jī)中最基本的程序。操作)是計算機(jī)中最基本的程序。操作 系統(tǒng)負(fù)責(zé)計算機(jī)系統(tǒng)中全部軟、硬資源的分配以及回收、控制與協(xié)調(diào)等并發(fā)的系統(tǒng)負(fù)責(zé)計算機(jī)系統(tǒng)中全部軟、硬資源的分配以及回收、控制與協(xié)調(diào)等并發(fā)的 活動;操作系統(tǒng)提供用戶接口,使用戶獲得良好的工作環(huán)境;操作系統(tǒng)為用戶活動;操作系統(tǒng)提供用戶接口,使用戶獲得良好的工作環(huán)境;操作系統(tǒng)為用戶 擴(kuò)展新的系統(tǒng)功能提供軟件平臺。擴(kuò)展新的系統(tǒng)功能提供軟件平臺。

3、操作系統(tǒng)的主要包括四大功能:操作系統(tǒng)的主要包括四大功能: 處理機(jī)管理:解決處理機(jī)管理:解決CPUCPU的分時復(fù)用。的分時復(fù)用。 存儲管理:配合存儲管理:配合CPUCPU調(diào)度內(nèi)存。調(diào)度內(nèi)存。 設(shè)備管理:分配外設(shè)的使用,包括獨享、共享和虛擬。設(shè)備管理:分配外設(shè)的使用,包括獨享、共享和虛擬。 軟件資源管理:解決程序和信息的存取和管理等問題。軟件資源管理:解決程序和信息的存取和管理等問題。 實時操作系統(tǒng) 實時操作系統(tǒng)(實時操作系統(tǒng)(RTOSRTOS)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時,能夠接受并以)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時,能夠接受并以足夠足夠 快的速度快的速度予以處理,其處理的結(jié)果又能在予以處理,其處理的

4、結(jié)果又能在規(guī)定的時間規(guī)定的時間之內(nèi)來控制生產(chǎn)過程或?qū)χ畠?nèi)來控制生產(chǎn)過程或?qū)?處理系統(tǒng)作出快速響應(yīng),并控制所有實時任務(wù)協(xié)調(diào)一致運行的操作系統(tǒng)。處理系統(tǒng)作出快速響應(yīng),并控制所有實時任務(wù)協(xié)調(diào)一致運行的操作系統(tǒng)。 多任務(wù)實時操作系統(tǒng) 用戶用戶的應(yīng)用程序是運行于的應(yīng)用程序是運行于RTOSRTOS之上的各個任務(wù),之上的各個任務(wù),RTOSRTOS根據(jù)各個任務(wù)的根據(jù)各個任務(wù)的 要求,進(jìn)行資源(包括存儲器、外設(shè)等)管理、消息管理、任務(wù)調(diào)度和異要求,進(jìn)行資源(包括存儲器、外設(shè)等)管理、消息管理、任務(wù)調(diào)度和異 常處理等工作。常處理等工作。 多任務(wù)多任務(wù)實時操作系統(tǒng)實時操作系統(tǒng),以分時方式運行多個任務(wù),看上去好像是多

5、個,以分時方式運行多個任務(wù),看上去好像是多個 任務(wù)任務(wù)“同時同時”運行。任務(wù)之間的切換應(yīng)當(dāng)以優(yōu)先級為根據(jù),只有具有運行。任務(wù)之間的切換應(yīng)當(dāng)以優(yōu)先級為根據(jù),只有具有優(yōu)先優(yōu)先 服務(wù)方式服務(wù)方式的的RTOSRTOS才是真正的實時操作系統(tǒng),而時間分片方式和協(xié)作方式的才是真正的實時操作系統(tǒng),而時間分片方式和協(xié)作方式的 RTOSRTOS并不是真正的并不是真正的“實時實時”。 相關(guān)基本概念 資源與共享資源資源與共享資源內(nèi)核與內(nèi)核與任務(wù)任務(wù)切換切換 消息隊列消息隊列時鐘節(jié)拍時鐘節(jié)拍 調(diào)調(diào) 度度 死死 鎖鎖 臨界臨界 區(qū)區(qū) 中中 斷斷 任任 務(wù)務(wù) 函數(shù)的可重入性函數(shù)的可重入性 資源與共享資源 程序運行程序運行時

6、可使用的軟、硬件環(huán)境統(tǒng)稱為資源。資源可以是輸入時可使用的軟、硬件環(huán)境統(tǒng)稱為資源。資源可以是輸入/ /輸出設(shè)輸出設(shè) 備,例如打印機(jī)、鍵盤和顯示器;資源也可以是一個變量、一個結(jié)構(gòu)或備,例如打印機(jī)、鍵盤和顯示器;資源也可以是一個變量、一個結(jié)構(gòu)或 一個數(shù)組等一個數(shù)組等。 共享共享資源就是指可以被一個以上任務(wù)使用的資源。為防止數(shù)據(jù)被破壞,資源就是指可以被一個以上任務(wù)使用的資源。為防止數(shù)據(jù)被破壞, 每個任務(wù)在與共享資源打交道時,必須獨占該資源,這叫每個任務(wù)在與共享資源打交道時,必須獨占該資源,這叫互斥互斥。 任務(wù) 任務(wù),也稱為線程,是一任務(wù),也稱為線程,是一個程序個程序。一般地,每個任務(wù)都是一個無限的循環(huán)

7、。一般地,每個任務(wù)都是一個無限的循環(huán)。 任務(wù)任務(wù)有五種有五種狀態(tài),任何狀態(tài),任何時刻,一個任務(wù)都處于這五種狀態(tài)之一的狀態(tài)下時刻,一個任務(wù)都處于這五種狀態(tài)之一的狀態(tài)下。 休眠態(tài)休眠態(tài)相當(dāng)于該任務(wù)駐留在內(nèi)存中,但并不被多任務(wù)內(nèi)核所調(diào)度相當(dāng)于該任務(wù)駐留在內(nèi)存中,但并不被多任務(wù)內(nèi)核所調(diào)度。 就緒就緒態(tài)態(tài)意味著該任務(wù)已經(jīng)準(zhǔn)備好,可以運行了,但由于該任務(wù)的優(yōu)先級比正在運行的任務(wù)意味著該任務(wù)已經(jīng)準(zhǔn)備好,可以運行了,但由于該任務(wù)的優(yōu)先級比正在運行的任務(wù) 的優(yōu)先級低,還暫不能運行的優(yōu)先級低,還暫不能運行 。 運行運行態(tài)態(tài)的任務(wù)是指該任務(wù)掌握了的任務(wù)是指該任務(wù)掌握了CPUCPU的控制權(quán),正在運行的控制權(quán),正在運行

8、。 掛起掛起態(tài)態(tài)指該任務(wù)在等待,等待某一事件的發(fā)生指該任務(wù)在等待,等待某一事件的發(fā)生。 被被中斷狀態(tài)中斷狀態(tài)是指,發(fā)生中斷時,是指,發(fā)生中斷時,CPUCPU提供相應(yīng)的中斷服務(wù),原來正在運行的任務(wù)暫不能運提供相應(yīng)的中斷服務(wù),原來正在運行的任務(wù)暫不能運 行,就進(jìn)入了被中斷狀態(tài)行,就進(jìn)入了被中斷狀態(tài)。 內(nèi)核與任務(wù)切換 內(nèi)核是操作系統(tǒng)最基本的部分內(nèi)核是操作系統(tǒng)最基本的部分。 負(fù)責(zé)負(fù)責(zé)管理各個任務(wù)管理各個任務(wù),為,為每個每個任務(wù)任務(wù)分配資源分配資源,它,它 提供的基本服務(wù)是提供的基本服務(wù)是任務(wù)切換任務(wù)切換。 任務(wù)切換任務(wù)切換 當(dāng)當(dāng)多任務(wù)內(nèi)核決定運行另外的任務(wù)時,保存正多任務(wù)內(nèi)核決定運行另外的任務(wù)時,保存

9、正 在運行任務(wù)的當(dāng)前狀態(tài),即在運行任務(wù)的當(dāng)前狀態(tài),即保存保存CPUCPU寄存器中寄存器中 的全部內(nèi)容的全部內(nèi)容。這些內(nèi)容保存在任務(wù)的當(dāng)前狀態(tài)。這些內(nèi)容保存在任務(wù)的當(dāng)前狀態(tài) 保存區(qū),也就是任務(wù)自己的棧區(qū)之中保存區(qū),也就是任務(wù)自己的棧區(qū)之中。 入入棧工作完成以后,就把下一個將要運行的任棧工作完成以后,就把下一個將要運行的任 務(wù)的當(dāng)前狀態(tài)從任務(wù)的棧中務(wù)的當(dāng)前狀態(tài)從任務(wù)的棧中重新裝入重新裝入CPUCPU的寄的寄 存器存器,并開始下一個任務(wù)的運行。這個過程就,并開始下一個任務(wù)的運行。這個過程就 稱為任務(wù)切換稱為任務(wù)切換。 中斷 中斷是最基本的任務(wù)切換方式中斷是最基本的任務(wù)切換方式,停止,停止現(xiàn)行程序的運

10、行,轉(zhuǎn)向?qū)@些異常情現(xiàn)行程序的運行,轉(zhuǎn)向?qū)@些異常情 況或特殊請求的處理,處理結(jié)束后再返回到以下部分:況或特殊請求的處理,處理結(jié)束后再返回到以下部分: 1.1.在前后臺系統(tǒng)中,程序回到后臺程序;在前后臺系統(tǒng)中,程序回到后臺程序; 2.2.對非占先式內(nèi)核而言,程序回到被中斷了的任務(wù);對非占先式內(nèi)核而言,程序回到被中斷了的任務(wù); 3.3.對占先式內(nèi)核而言,讓進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)開始運行。對占先式內(nèi)核而言,讓進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)開始運行。 調(diào)度 任務(wù)任務(wù)的調(diào)度方式有的調(diào)度方式有基于時間片輪轉(zhuǎn)的調(diào)度基于時間片輪轉(zhuǎn)的調(diào)度和和基于優(yōu)先級的調(diào)度基于優(yōu)先級的調(diào)度。多數(shù)。多數(shù) 實時系統(tǒng)是基于優(yōu)先

11、級調(diào)度法的?;趦?yōu)先級的調(diào)度法指實時系統(tǒng)是基于優(yōu)先級調(diào)度法的?;趦?yōu)先級的調(diào)度法指CPUCPU總是讓處于就總是讓處于就 緒態(tài)的優(yōu)先級最高的任務(wù)先運行。至于何時讓高優(yōu)先級任務(wù)掌握緒態(tài)的優(yōu)先級最高的任務(wù)先運行。至于何時讓高優(yōu)先級任務(wù)掌握CPUCPU的使用的使用 權(quán),有兩種不同的權(quán),有兩種不同的情況:情況: 占先式調(diào)度占先式調(diào)度 任何任何時候具有最高優(yōu)先級且已就緒的任務(wù)先執(zhí)行時候具有最高優(yōu)先級且已就緒的任務(wù)先執(zhí)行。 非非占先式占先式調(diào)度調(diào)度 要求每個任務(wù)自我放棄要求每個任務(wù)自我放棄CPUCPU的所有權(quán)。的所有權(quán)。 臨界區(qū) 臨界資源:任何時候都只允許一個任務(wù)訪問的資源。臨界資源:任何時候都只允許一個任

12、務(wù)訪問的資源。 臨界區(qū)或臨界段:用于訪問臨界資源的代碼段。臨界區(qū)或臨界段:用于訪問臨界資源的代碼段。 臨界代碼段臨界代碼段不允許多個并發(fā)任務(wù)交叉執(zhí)行不允許多個并發(fā)任務(wù)交叉執(zhí)行,否則會產(chǎn)生嚴(yán)重后果,比如進(jìn)入中斷后的現(xiàn),否則會產(chǎn)生嚴(yán)重后果,比如進(jìn)入中斷后的現(xiàn) 場保護(hù)代碼等。場保護(hù)代碼等。 為確保臨界區(qū)代碼的安全執(zhí)行,在進(jìn)入臨界區(qū)之前要關(guān)中斷,而臨界區(qū)代碼執(zhí)行完以后為確保臨界區(qū)代碼的安全執(zhí)行,在進(jìn)入臨界區(qū)之前要關(guān)中斷,而臨界區(qū)代碼執(zhí)行完以后 要立即開中斷要立即開中斷 函數(shù)的可重入性 可重入可重入(Reentrant)(Reentrant)型函數(shù):是指可以被型函數(shù):是指可以被 多個任務(wù)并發(fā)使用,而數(shù)據(jù)

13、不會遭到破壞多個任務(wù)并發(fā)使用,而數(shù)據(jù)不會遭到破壞 的函數(shù)。的函數(shù)。 可重入型函數(shù)特征:可重入型函數(shù)特征: 只使用局部變量,變量保存在只使用局部變量,變量保存在CPUCPU寄存寄存 器或堆棧中,可以在任意時刻被中斷,器或堆棧中,可以在任意時刻被中斷, 再重新恢復(fù)運行時,數(shù)據(jù)不會被破壞;再重新恢復(fù)運行時,數(shù)據(jù)不會被破壞; 若使用全局變量,則需滿足互斥條件。若使用全局變量,則需滿足互斥條件。 可重入型函數(shù)實例可重入型函數(shù)實例 void func1(int* x, int* y) int temp; temp= *x; *x = *y; *y = temp; 不可重入型函數(shù)清單不可重入型函數(shù)清單 st

14、atic int temp; void func2(int* x, int* y) temp = *x; *x = *y; *y = temp; 死鎖 所謂所謂死鎖,是指各并發(fā)任務(wù)彼此等待對方所擁有的資源,且這死鎖,是指各并發(fā)任務(wù)彼此等待對方所擁有的資源,且這 些并發(fā)任務(wù)在得到對方的資源之前不會釋放自己所擁有的資源,些并發(fā)任務(wù)在得到對方的資源之前不會釋放自己所擁有的資源, 從而造成大家都想得到資源而又都得不到資源,各并發(fā)任務(wù)不從而造成大家都想得到資源而又都得不到資源,各并發(fā)任務(wù)不 能繼續(xù)向前推進(jìn)的狀態(tài)。能繼續(xù)向前推進(jìn)的狀態(tài)。 最最簡單的防止死鎖發(fā)生的方法有兩種:簡單的防止死鎖發(fā)生的方法有兩種:

15、 1. 1. 讓每個任務(wù)先得到全部需要的資源,再進(jìn)行下一步工作。讓每個任務(wù)先得到全部需要的資源,再進(jìn)行下一步工作。 2. 2. 讓每個任務(wù)用同樣的順序去申請多個資源,釋放資源時使用相反的順序。讓每個任務(wù)用同樣的順序去申請多個資源,釋放資源時使用相反的順序。 消息隊列和時鐘節(jié)拍 消息消息隊列是保存消息的容器。通過內(nèi)核提供的服務(wù),任務(wù)或中斷服務(wù)子程序可隊列是保存消息的容器。通過內(nèi)核提供的服務(wù),任務(wù)或中斷服務(wù)子程序可 以以將消息將消息放入消息隊列。同樣放入消息隊列。同樣,任務(wù),任務(wù)可以通過內(nèi)核服務(wù)從消息隊列中得到消息??梢酝ㄟ^內(nèi)核服務(wù)從消息隊列中得到消息。 通常,先進(jìn)入消息隊列的消息先給任務(wù),遵循先

16、進(jìn)先出原則(通常,先進(jìn)入消息隊列的消息先給任務(wù),遵循先進(jìn)先出原則(FIFOFIFO)。)。 內(nèi)核內(nèi)核提供的典型消息隊列服務(wù)如下提供的典型消息隊列服務(wù)如下: 1 1. .消息隊列初始化,隊列初始化時總是清為空消息隊列初始化,隊列初始化時總是清為空; 2 2. .放一則消息到隊列中去(放一則消息到隊列中去(POSTPOST); 3 3. .等待一則消息的到來(等待一則消息的到來(PENDPEND); 4 4. .無等待取得消息無等待取得消息。 基于RTX51操作系統(tǒng)的軟件設(shè)計 RTX51是Keil公司開發(fā)的專門針對于8051兼容MCU所作的多任務(wù)實時操作系統(tǒng),是Keil自帶的小操 作系統(tǒng)之一。 有

17、二個不同的RTX51版本,RTX51 Full 和RTX51 Tiny RTX51 Tiny是一個功能強(qiáng)大的RTOS,且易于使用,它用于8051系列的微控制器。該RTOS最多支持 16個任務(wù),基于RTX51 Tiny構(gòu)建的應(yīng)用程序沒有main( )函數(shù),是從任務(wù)0開始執(zhí)行的,也不支持搶 先任務(wù)切換和任務(wù)優(yōu)先級。 RTX51 Tiny的程序用標(biāo)準(zhǔn)的C語言構(gòu)造,由Keil C51 C編譯器編譯。用戶可以很容易的定義任務(wù)函數(shù), 而不需要進(jìn)行復(fù)雜的棧和變量結(jié)構(gòu)配置,只需包含一個指定的頭文件(rtx5 1tny.h)。 RTX51 Tiny使用定時器0、定時器0中斷,和寄存器組1。 描述 RTX51完全

18、模式 RTX51最小模式 任務(wù)數(shù) 最大256,19個激活任務(wù),其中16個標(biāo)準(zhǔn) 任務(wù),3個快速任務(wù) 16 RAM 4046字節(jié)RAM 20200字節(jié)IDATA 最少450字節(jié)XDATA 7字節(jié)DATA 3*任務(wù)數(shù)IDATA 不需要XDATA ROM6KB8KB900字節(jié) 定時器定時器0或1定時器0 單任務(wù)和偽多任務(wù) voidmain(void) while(1) do_something();/一直循環(huán)執(zhí)行一直循環(huán)執(zhí)行do_something任務(wù)任務(wù) voidmain(void) while(1) key_scan();/鍵盤掃描鍵盤掃描 do_key();/處理按鍵事件處理按鍵事件 ctr_a

19、dj();/調(diào)整控制器調(diào)整控制器 RTX51 Tiny的多任務(wù)(程序結(jié)構(gòu)) 1.voidjob0(void)_task_0 2. 3.os_create_task(1);/創(chuàng)建任務(wù)創(chuàng)建任務(wù)1 4.os_create_task(2);/創(chuàng)建任務(wù)創(chuàng)建任務(wù)2 5.os_create_task(3);/創(chuàng)建任務(wù)創(chuàng)建任務(wù)3 6.os_delete_task(0);/刪除任務(wù)刪除任務(wù)0 7. 8. 9.voidjob1(void)_task_1/鍵盤鍵盤 掃描任務(wù)掃描任務(wù) 10. 11.while(1) 12.key_scan(); 13. 14. 15. 16. 17.voidjob2(void)_ta

20、sk_2/處理按鍵處理按鍵 事件任務(wù)事件任務(wù) 18. 19.while(1) 20.do_key(); 21. 22. 23. 24.voidjob3(void)_task_3/調(diào)整控制調(diào)整控制 器任務(wù)器任務(wù) 25. 26.while(1) 27.ctr_adj(); 28. 29. RTX51的任務(wù)調(diào)度 RTX51RTX51利用任務(wù)狀態(tài)來管理各個任務(wù)利用任務(wù)狀態(tài)來管理各個任務(wù)。用戶為。用戶為RTX51RTX51定義的每個定義的每個 任務(wù)都會以各種狀態(tài)的某一種來運行。任務(wù)都會以各種狀態(tài)的某一種來運行。RTX51RTX51內(nèi)核為每個任務(wù)保內(nèi)核為每個任務(wù)保 留了適當(dāng)?shù)臓顟B(tài)如下表所示。留了適當(dāng)?shù)臓顟B(tài)

21、如下表所示。 RTX51RTX51的任務(wù)狀態(tài)表的任務(wù)狀態(tài)表 狀態(tài)狀態(tài)描述描述 Running運行狀態(tài)當(dāng)前正在執(zhí)行的任務(wù),在任一時刻只能有一個任務(wù)處于運行狀態(tài) Ready就緒狀態(tài)等待執(zhí)行的任務(wù),當(dāng)前任務(wù)執(zhí)行完后,接著執(zhí)行就緒狀態(tài)任務(wù) Waiting等待狀態(tài)等待某一事件的任務(wù),如事件發(fā)生,任務(wù)進(jìn)入就緒狀態(tài) Deleted刪除狀態(tài)沒有啟動的任務(wù) Time-out超時狀態(tài)與就緒狀態(tài)相似,放在round-robin中尚未執(zhí)行的任務(wù) RTX51的任務(wù)調(diào)度 RTX51 RTX51支持多個任務(wù)的支持多個任務(wù)的準(zhǔn)并行執(zhí)行準(zhǔn)并行執(zhí)行。任務(wù)不是被同時執(zhí)行,而是以。任務(wù)不是被同時執(zhí)行,而是以分分 時的方式輪片執(zhí)行時的

22、方式輪片執(zhí)行??捎玫摹?捎玫腃PUCPU時間被分成多個時間片,然后由時間被分成多個時間片,然后由RTX51 RTX51 將將 這些時間片分配給各個任務(wù)。每個任務(wù)只允許在預(yù)定的時間片中執(zhí)行,這些時間片分配給各個任務(wù)。每個任務(wù)只允許在預(yù)定的時間片中執(zhí)行, 時間片用完時,時間片用完時,RTX51RTX51就切換至另一個就緒的任務(wù),繼續(xù)執(zhí)行一段時間。就切換至另一個就緒的任務(wù),繼續(xù)執(zhí)行一段時間。 時間片的具體長度可以用配置函數(shù)時間片的具體長度可以用配置函數(shù)TIMESHARING來定義。來定義。 如果遇到因為一個任務(wù)處于等待并且占用了時間片而暫時無法往下如果遇到因為一個任務(wù)處于等待并且占用了時間片而暫時無

23、法往下 執(zhí)行,可以調(diào)用系統(tǒng)函數(shù)執(zhí)行,可以調(diào)用系統(tǒng)函數(shù)os_wait來通知來通知RTX51RTX51,以便將當(dāng)前的,以便將當(dāng)前的任務(wù)掛起任務(wù)掛起而而 提前執(zhí)行另一任務(wù)。提前執(zhí)行另一任務(wù)。 RTX51的任務(wù)調(diào)度 RTX51RTX51中處理任務(wù)分配的模塊稱為調(diào)度程序(中處理任務(wù)分配的模塊稱為調(diào)度程序(SchedulerScheduler)。調(diào)度程)。調(diào)度程 序驅(qū)動哪個任務(wù)運行是按照以下的規(guī)則進(jìn)行的:序驅(qū)動哪個任務(wù)運行是按照以下的規(guī)則進(jìn)行的: (1 1)如果發(fā)生以下情況時,當(dāng)前運行的任務(wù)將被中斷:)如果發(fā)生以下情況時,當(dāng)前運行的任務(wù)將被中斷: 調(diào)用調(diào)用os_waitos_wait函數(shù),而所等待的事件未

24、來到;函數(shù),而所等待的事件未來到; 任務(wù)的執(zhí)行時間已經(jīng)超過所定義的任務(wù)的執(zhí)行時間已經(jīng)超過所定義的Round-RobinRound-Robin循環(huán)時間間隔循環(huán)時間間隔 (2 2)如果發(fā)生以下情況時,另一個任務(wù)將被啟動:)如果發(fā)生以下情況時,另一個任務(wù)將被啟動: 已已沒有正在執(zhí)行的任務(wù);沒有正在執(zhí)行的任務(wù); 將要將要執(zhí)行的任務(wù)處在就緒狀態(tài)或超時狀態(tài)。執(zhí)行的任務(wù)處在就緒狀態(tài)或超時狀態(tài)。 RTX51系統(tǒng)的配置 編寫編寫RTX51RTX51程序需要包含程序需要包含RTX51TNY.H RTX51TNY.H 文件。在程序中,需要用一個關(guān)鍵字文件。在程序中,需要用一個關(guān)鍵字“_task_task_” 來聲明

25、一個函數(shù)來聲明一個函數(shù) 的任務(wù)屬性。的任務(wù)屬性。RTX51RTX51程序不需要程序不需要main main 函數(shù)。在進(jìn)行連接處理時,會將函數(shù)。在進(jìn)行連接處理時,會將啟動任務(wù)啟動任務(wù)0 0的執(zhí)行所需要的代碼連接的執(zhí)行所需要的代碼連接 進(jìn)來,作為開始執(zhí)行的代碼。進(jìn)來,作為開始執(zhí)行的代碼。 用戶可以更改配置文件用戶可以更改配置文件CONF_TNY.A51CONF_TNY.A51中的以下幾個參數(shù):中的以下幾個參數(shù): 系統(tǒng)定時器中斷所用的寄存器組系統(tǒng)定時器中斷所用的寄存器組 系統(tǒng)定時器的時間間隔系統(tǒng)定時器的時間間隔 Round-RobinRound-Robin的超時(的超時(time-outtime-o

26、ut)值)值 內(nèi)部數(shù)據(jù)存儲器的大小內(nèi)部數(shù)據(jù)存儲器的大小 RTX5lRTX5l啟動后的自由堆棧大小啟動后的自由堆棧大小 RTX51系統(tǒng)的配置 參數(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

27、為0FFH FREE_STACK 定義任務(wù)切換的堆棧自由空間體積字節(jié)數(shù)。 RTX51會檢驗堆棧體積是否合理。如太小,引用STACK_ERROR宏 STACK_ERROR當(dāng)RTX51檢測到堆棧出錯時執(zhí)行的宏,可以根據(jù)應(yīng)用程序需求更換這個宏 RTX51的功能函數(shù) 函數(shù)函數(shù)描述描述執(zhí)行周期數(shù)執(zhí)行周期數(shù) os_create_task將任務(wù)移入執(zhí)行隊列302 os_delete_task執(zhí)行隊列中移去某任務(wù)172 os_send_signal發(fā)送一信號到某任務(wù)(從某任務(wù)調(diào)用) 408(任務(wù)切換) 71(不含任務(wù)切換) os_clear_signal刪除一發(fā)送信號57 isr_send_signal發(fā)送一

28、信號到某任務(wù)(從中斷調(diào)用)46 os_running_task_id返回當(dāng)前執(zhí)行的任務(wù)號 os_wait等待某事件 68(對未就緒信號) 160(對未就緒消息) os_wait1等待某事件 os_wait2等待某事件 RTX51的功能函數(shù) isr_send_signal 函數(shù)原型函數(shù)原型 char isr_send_signal(unsigned char task_id); 功能說明功能說明 發(fā)送一個信號到發(fā)送一個信號到task_idtask_id任務(wù)。如果此任務(wù)已在等待一個信號,那么調(diào)用函數(shù)將使此任任務(wù)。如果此任務(wù)已在等待一個信號,那么調(diào)用函數(shù)將使此任 務(wù)就緒,準(zhǔn)備執(zhí)行。否則,信號將存儲在

29、此任務(wù)的信號標(biāo)志中。此函數(shù)只能從中斷函數(shù)中調(diào)用。務(wù)就緒,準(zhǔn)備執(zhí)行。否則,信號將存儲在此任務(wù)的信號標(biāo)志中。此函數(shù)只能從中斷函數(shù)中調(diào)用。 返返 回回 值值 如果執(zhí)行成功,此函數(shù)返回如果執(zhí)行成功,此函數(shù)返回0 0值;如果所指定的任務(wù)不存在,則返回值;如果所指定的任務(wù)不存在,則返回-1 -1 。 os_clear_signal 函數(shù)原型函數(shù)原型 char os_clear_signal(unsigned char task_id); 功能說明功能說明 清除由清除由task_idtask_id任務(wù)的信號任務(wù)的信號 返返 回回 值值 如果信號清除成功,此函數(shù)返回如果信號清除成功,此函數(shù)返回0 0值;如果所

30、指定的任務(wù)不存在,則返回值;如果所指定的任務(wù)不存在,則返回-1-1 os_send_signal 函數(shù)原型函數(shù)原型 char os_send_signal(unsigned char task_id); 功能說明功能說明 發(fā)送一個信號到發(fā)送一個信號到task_idtask_id任務(wù)。如果此任務(wù)已在等待一個信號,那么調(diào)用函數(shù)將使此任任務(wù)。如果此任務(wù)已在等待一個信號,那么調(diào)用函數(shù)將使此任 務(wù)就緒,準(zhǔn)備執(zhí)行。否則,信號將存儲在此任務(wù)的信號標(biāo)志中。此函數(shù)只能在任務(wù)函數(shù)中調(diào)用務(wù)就緒,準(zhǔn)備執(zhí)行。否則,信號將存儲在此任務(wù)的信號標(biāo)志中。此函數(shù)只能在任務(wù)函數(shù)中調(diào)用 返返 回回 值值 如果執(zhí)行成功,此函數(shù)返回如果

31、執(zhí)行成功,此函數(shù)返回0 0值;如果所指定的任務(wù)不存在,則返回值;如果所指定的任務(wù)不存在,則返回-1 -1 RTX51的功能函數(shù) os_create_task 函數(shù)原型函數(shù)原型 char os_create_task(unsigned char task_id); 功能說明功能說明 啟動已定義的由啟動已定義的由task_idtask_id任務(wù)任務(wù)。此任務(wù)根據(jù)。此任務(wù)根據(jù)RTX51RTX51運行規(guī)則,標(biāo)記為就緒,并準(zhǔn)備執(zhí)行。運行規(guī)則,標(biāo)記為就緒,并準(zhǔn)備執(zhí)行。 返返 回回 值值 如果任務(wù)成功啟動,此函數(shù)返回如果任務(wù)成功啟動,此函數(shù)返回0 0值;如果沒有值;如果沒有task_idtask_id任務(wù)任務(wù)

32、,則返回,則返回-1-1 os_delete_task 函數(shù)原型函數(shù)原型 char os_delete_task(unsigned char task_id); 功能說明功能說明 停止停止task_idtask_id任務(wù)任務(wù),此任務(wù)將從任務(wù)表中刪除。,此任務(wù)將從任務(wù)表中刪除。 返返 回回 值值 如果任務(wù)成功啟動,此函數(shù)返回如果任務(wù)成功啟動,此函數(shù)返回0 0值;如果沒有值;如果沒有task_idtask_id任務(wù)任務(wù),則返回,則返回-1-1。 os_running_task_id 函數(shù)原型函數(shù)原型 char os_running_task_id(unsigned char task_id); 功

33、能說明功能說明 判斷當(dāng)前執(zhí)行任務(wù)的編號判斷當(dāng)前執(zhí)行任務(wù)的編號 返返 回回 值值 返回當(dāng)前正在執(zhí)行的任務(wù)的編號,返回值為返回當(dāng)前正在執(zhí)行的任務(wù)的編號,返回值為0 01515。 RTX51的功能函數(shù) os_wait 函數(shù)原型函數(shù)原型 char os_wait( unsigned char event_sel, unsigned char tisks, unsigned char dummy ); /*將要等待的事件*/ /*將要等待的定時器時標(biāo)數(shù)*/ /*未用參數(shù)*/ 功能說明功能說明 停止當(dāng)前執(zhí)行的任務(wù),并等待一個或多個事件,如時間間隔、超時、從另一個任務(wù)停止當(dāng)前執(zhí)行的任務(wù),并等待一個或多個事件

34、,如時間間隔、超時、從另一個任務(wù) 或中斷發(fā)出的信號等。參數(shù)或中斷發(fā)出的信號等。參數(shù)event_selevent_sel說明所等待的一個事件或幾個事件的組合。事件說明所等待的一個事件或幾個事件的組合。事件種類及返種類及返 回值如下回值如下表所表所示:示: os_waitos_wait函數(shù)函數(shù)的事件參數(shù)表的事件參數(shù)表 os_waitos_wait函數(shù)的返回值表函數(shù)的返回值表 事件事件描述描述 K_IVL定時器溢出 K_SIG收到信號 K_TMO時間片超時 返回值返回值描述描述 SIG_EVENT信號被接收 TMO_EVENT發(fā)生超時或事件間隔已過 NOT_OKevent_sel的值非法 RTX51

35、的功能函數(shù) os_wait1 函數(shù)原型函數(shù)原型 char os_wait1(unsigned char event_sel); 功能說明功能說明 暫停當(dāng)前任務(wù),等待一個事件的發(fā)生。它是暫停當(dāng)前任務(wù),等待一個事件的發(fā)生。它是os_waitos_wait函數(shù)的一個子集,不接受針對函數(shù)的一個子集,不接受針對 os_waitos_wait函數(shù)提供的全部事件。參數(shù)函數(shù)提供的全部事件。參數(shù)event_selevent_sel指定了等待的事件,它只能是指定了等待的事件,它只能是K_SIGK_SIG。 返返 回回 值值 當(dāng)信號事件發(fā)生時,任務(wù)就被允許執(zhí)行,任務(wù)的執(zhí)行將恢復(fù)。返回用于識別事件、使當(dāng)信號事件發(fā)生時

36、,任務(wù)就被允許執(zhí)行,任務(wù)的執(zhí)行將恢復(fù)。返回用于識別事件、使 任務(wù)重新啟動的常量任務(wù)重新啟動的常量。 os_wait2 函數(shù)原型函數(shù)原型 char os_wait2( unsigned char event_sel, unsigned char tisks ); / /* *將要等待的事件將要等待的事件* */ / / /* *將要等待的定時器時標(biāo)數(shù)將要等待的定時器時標(biāo)數(shù)* */ / 功能功能說明說明 與與os_waitos_wait相同,但是不需要相同,但是不需要dummydummy參數(shù)。參數(shù)。 返返 回回 值值 與與os_waitos_wait相同相同 最好的學(xué)習(xí)資料 最好的學(xué)習(xí)資料是最好的

37、學(xué)習(xí)資料是Keil 中中自帶的用戶手冊自帶的用戶手冊 RTX51的應(yīng)用舉例 下面的代碼將要實現(xiàn)的功能是:使 LED0每隔1 1秒切換一次狀態(tài) (ON/OFF),LED1每0.70.7秒切換一次 狀態(tài),LED2每0.40.4秒切換一次狀態(tài), LED3每0.20.2秒切換一次狀態(tài)。 #include #include typedef unsigned char uchar; typedef unsigned int uint; sbit LED0 = P20; sbit LED1 = P21; sbit LED2 = P22; sbit LED3 = P23; sbit KEY0 = P17; v

38、oid job0(void) _task_ 0 LED0 = 1; LED1 = 1; LED2 = 1; LED3 = 1; /關(guān)閉四個LED os_create_task(1); /創(chuàng)建任務(wù)1 os_create_task(2); /創(chuàng)建任務(wù)2 os_create_task(3); /創(chuàng)建任務(wù)3 os_create_task(4); /創(chuàng)建任務(wù)4 os_create_task(5); /創(chuàng)建任務(wù)5 os_delete_task(0); /刪除自己(task0),使task0退出任務(wù)鏈表 void job1(void) _task_ 1 while(1) LED0 = !LED0; os_w

39、ait(K_TMO, 100, 0); /等待100個時鐘周期 void job2(void) _task_ 2 while(1) LED1 = !LED1; os_wait(K_TMO, 70, 0); /等待(延時)0.7s void job3(void) _task_ 3 while(1) LED2 = !LED2; os_wait(K_TMO, 40, 0); /等待(延時)0.4s void job4(void) _task_ 4 while(1) LED3 = !LED3; os_wait(K_TMO, 20, 0); /等待(延時)0.2s void job5(void) _task_ 5 while(1) if(0 = KEY0) /判斷按鍵是否按下 LED3 = 1; os_delete_task(4); /按鍵按下時關(guān)閉LED3,使task4退出任務(wù)鏈表,LED3不再閃爍 RTX51的應(yīng)用舉例 RTX51在單片機(jī)控制的GPS 接收板上的應(yīng)用 (1)系統(tǒng)硬件

溫馨提示

  • 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

提交評論