




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第10章 RTX51實(shí)時(shí)操作系統(tǒng)主要內(nèi)容 操作系統(tǒng)基本概念RTX51系統(tǒng)特點(diǎn) RTX51的程序結(jié)構(gòu)RTX51的功能函數(shù)RTX51的任務(wù)調(diào)度RTX51的系統(tǒng)配置 RTX51的應(yīng)用舉例第1頁(yè),共47頁(yè)。10.1 操作系統(tǒng)基本概念10.1.1 前后臺(tái)系統(tǒng)前后臺(tái)系統(tǒng)的組成:前臺(tái)和后臺(tái)程序后臺(tái):是一個(gè)無(wú)限循環(huán)的應(yīng)用程序,循環(huán)中調(diào)用相應(yīng)的任務(wù)函數(shù)完成相應(yīng)的操作,各個(gè)任務(wù)依次運(yùn)行,沒(méi)有調(diào)度,運(yùn)行的次序不能改變。前臺(tái):是中斷服務(wù)程序,處理異步事件。第2頁(yè),共47頁(yè)。適用情形:一般不復(fù)雜且實(shí)時(shí)性要求不高的小系統(tǒng)很適合采用前后臺(tái)系統(tǒng),例如微波爐、電話機(jī)、玩具等。在另外一些基于省電的應(yīng)用中,由于平時(shí)微處理器處在停機(jī)
2、狀態(tài),所有的事都靠中斷服務(wù)來(lái)完成,因此也常常采用前后臺(tái)系統(tǒng)模式。第3頁(yè),共47頁(yè)。10.1.2 操作系統(tǒng) 操作系統(tǒng)(Operating System,簡(jiǎn)稱OS)是計(jì)算機(jī)中最基本的程序。操作系統(tǒng)負(fù)責(zé)計(jì)算機(jī)系統(tǒng)中全部軟、硬資源的分配以及回收、控制與協(xié)調(diào)等并發(fā)的活動(dòng);操作系統(tǒng)提供用戶接口,使用戶獲得良好的工作環(huán)境;操作系統(tǒng)為用戶擴(kuò)展新的系統(tǒng)功能提供軟件平臺(tái)。 操作系統(tǒng)的主要包括四大功能:處理機(jī)管理:解決CPU的分時(shí)復(fù)用。存儲(chǔ)管理:配合CPU調(diào)度內(nèi)存。設(shè)備管理:分配外設(shè)的使用,包括獨(dú)享、共享和虛擬。軟件資源管理:解決程序和信息的存取和管理等問(wèn)題。第4頁(yè),共47頁(yè)。 實(shí)時(shí)操作系統(tǒng)(RTOS)是指當(dāng)外界事
3、件或數(shù)據(jù)產(chǎn)生時(shí),能夠接受并以足夠快的速度予以處理,其處理的結(jié)果又能在規(guī)定的時(shí)間之內(nèi)來(lái)控制生產(chǎn)過(guò)程或?qū)μ幚硐到y(tǒng)作出快速響應(yīng),并控制所有實(shí)時(shí)任務(wù)協(xié)調(diào)一致運(yùn)行的操作系統(tǒng)。 用戶的應(yīng)用程序是運(yùn)行于RTOS之上的各個(gè)任務(wù),RTOS根據(jù)各個(gè)任務(wù)的要求,進(jìn)行資源(包括存儲(chǔ)器、外設(shè)等)管理、消息管理、任務(wù)調(diào)度和異常處理等工作。 實(shí)時(shí)多任務(wù)操作系統(tǒng),以分時(shí)方式運(yùn)行多個(gè)任務(wù),看上去好像是多個(gè)任務(wù)“同時(shí)”運(yùn)行。任務(wù)之間的切換應(yīng)當(dāng)以優(yōu)先級(jí)為根據(jù),只有具有優(yōu)先服務(wù)方式的RTOS才是真正的實(shí)時(shí)操作系統(tǒng),而時(shí)間分片方式和協(xié)作方式的RTOS并不是真正的“實(shí)時(shí)”。10.1.3 實(shí)時(shí)操作系統(tǒng)第5頁(yè),共47頁(yè)。10.1.4 臨界區(qū)
4、臨界資源:任何時(shí)候都只允許一個(gè)任務(wù)訪問(wèn)的資源。臨界區(qū)或臨界段:用于訪問(wèn)臨界資源的代碼段。臨界代碼段不允許多個(gè)并發(fā)任務(wù)交叉執(zhí)行,否則會(huì)產(chǎn)生嚴(yán)重后果,比如進(jìn)入中斷后的現(xiàn)場(chǎng)保護(hù)代碼等。為確保臨界區(qū)代碼的安全執(zhí)行,在進(jìn)入臨界區(qū)之前要關(guān)中斷,而臨界區(qū)代碼執(zhí)行完以后要立即開中斷第6頁(yè),共47頁(yè)。 程序運(yùn)行時(shí)可使用的軟、硬件環(huán)境統(tǒng)稱為資源。資源可以是輸入/輸出設(shè)備,例如打印機(jī)、鍵盤和顯示器;資源也可以是一個(gè)變量、一個(gè)結(jié)構(gòu)或一個(gè)數(shù)組等。 共享資源就是指可以被一個(gè)以上任務(wù)使用的資源。為防止數(shù)據(jù)被破壞,每個(gè)任務(wù)在與共享資源打交道時(shí),必須獨(dú)占該資源,這叫互斥。10.1.5 資源與共享資源第7頁(yè),共47頁(yè)。 任務(wù),也
5、稱為線程,是一個(gè)簡(jiǎn)單的程序。一般地,每個(gè)任務(wù)都是一個(gè)無(wú)限的循環(huán)。 任務(wù)有五種狀態(tài):休眠態(tài)、就緒態(tài)、運(yùn)行態(tài)、掛起態(tài)(等待某一事件發(fā)生)和被中斷態(tài)。任何時(shí)刻,一個(gè)任務(wù)都處于這五種狀態(tài)之一的狀態(tài)下。 休眠態(tài)相當(dāng)于該任務(wù)駐留在內(nèi)存中,但并不被多任務(wù)內(nèi)核所調(diào)度。就緒態(tài)意味著該任務(wù)已經(jīng)準(zhǔn)備好,可以運(yùn)行了,但由于該任務(wù)的優(yōu)先級(jí)比正在運(yùn)行的任務(wù)的優(yōu)先級(jí)低,還暫不能運(yùn)行 。運(yùn)行態(tài)的任務(wù)是指該任務(wù)掌握了CPU的控制權(quán),正在運(yùn)行。掛起態(tài)指該任務(wù)在等待,等待某一事件的發(fā)生。被中斷狀態(tài)是指,發(fā)生中斷時(shí),CPU提供相應(yīng)的中斷服務(wù),原來(lái)正在運(yùn)行的任務(wù)暫不能運(yùn)行,就進(jìn)入了被中斷狀態(tài)。 10.1.6 任務(wù)第8頁(yè),共47頁(yè)。10
6、.1.7 內(nèi)核與任務(wù)切換內(nèi)核 內(nèi)核是操作系統(tǒng)最基本的部分。多任務(wù)系統(tǒng)中,內(nèi)核負(fù)責(zé)管理各個(gè)任務(wù),或者說(shuō)為每個(gè)任務(wù)分配CPU時(shí)間,并且內(nèi)核決定一個(gè)程序在什么時(shí)候?qū)δ巢糠钟布僮鞫嚅L(zhǎng)時(shí)間。內(nèi)核負(fù)責(zé)任務(wù)之間的通信,它提供的基本服務(wù)是任務(wù)切換。任務(wù)切換 當(dāng)多任務(wù)內(nèi)核決定運(yùn)行另外的任務(wù)時(shí),保存正在運(yùn)行任務(wù)的當(dāng)前狀態(tài),即保存CPU寄存器中的全部?jī)?nèi)容。這些內(nèi)容保存在任務(wù)的當(dāng)前狀態(tài)保存區(qū),也就是任務(wù)自己的棧區(qū)之中。入棧工作完成以后,就把下一個(gè)將要運(yùn)行的任務(wù)的當(dāng)前狀態(tài)從任務(wù)的棧中重新裝入CPU的寄存器,并開始下一個(gè)任務(wù)的運(yùn)行。這個(gè)過(guò)程就稱為任務(wù)切換。 第9頁(yè),共47頁(yè)。多任務(wù)切換示意圖第10頁(yè),共47頁(yè)。 調(diào)度是
7、內(nèi)核的主要職責(zé)之一,調(diào)度就是決定該輪到哪個(gè)任務(wù)運(yùn)行了。任務(wù)的調(diào)度方式有基于時(shí)間片輪轉(zhuǎn)的調(diào)度和基于優(yōu)先級(jí)的調(diào)度。多數(shù)實(shí)時(shí)系統(tǒng)是基于優(yōu)先級(jí)調(diào)度法的?;趦?yōu)先級(jí)的調(diào)度法指CPU總是讓處于就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)先運(yùn)行。至于何時(shí)讓高優(yōu)先級(jí)任務(wù)掌握CPU的使用權(quán),有兩種不同的情況。 占先式調(diào)度;非占先式調(diào)度。10.1.8 調(diào)度第11頁(yè),共47頁(yè)。占先式調(diào)度 任何時(shí)候具有最高優(yōu)先級(jí)且已就緒的任務(wù)先執(zhí)行。一個(gè)正在執(zhí)行的任務(wù)放棄處理器的條件為:自愿放棄處理器(等待資源或執(zhí)行完畢);有高優(yōu)先級(jí)任務(wù)啟動(dòng),該高優(yōu)先級(jí)任務(wù)將搶占其執(zhí)行。當(dāng)一個(gè)運(yùn)行著的任務(wù)使一個(gè)比它優(yōu)先級(jí)更高的任務(wù)進(jìn)入了就緒狀態(tài)時(shí),當(dāng)前任務(wù)的CPU使用
8、權(quán)就被剝奪了,或者說(shuō)被掛起了,那個(gè)高優(yōu)先級(jí)的任務(wù)立刻得到了CPU的控制權(quán)。如果是中斷服務(wù)子程序是一個(gè)高優(yōu)先級(jí)的任務(wù)進(jìn)入了就緒態(tài),則中斷完成時(shí),中斷了的任務(wù)被掛起,優(yōu)先級(jí)高的那個(gè)任務(wù)開始運(yùn)行。 占先式調(diào)度的優(yōu)點(diǎn)是實(shí)時(shí)性好、反應(yīng)快,調(diào)度算法相對(duì)簡(jiǎn)單,可優(yōu)先保證高優(yōu)先級(jí)任務(wù)的時(shí)間約束,其缺點(diǎn)是上下文切換多。第12頁(yè),共47頁(yè)。非占先式調(diào)度 非占先式調(diào)度要求每個(gè)任務(wù)自我放棄CPU的所有權(quán)。這種方式下,異步事件還是由中斷服務(wù)來(lái)處理。中斷服務(wù)可以使一個(gè)高優(yōu)先級(jí)的任務(wù)由掛起狀態(tài)變?yōu)榫途w狀態(tài),但中斷服務(wù)以后控制權(quán)還是回到原來(lái)被中斷了的那個(gè)任務(wù),直到該任務(wù)主動(dòng)放棄CPU的使用權(quán)時(shí),那個(gè)高優(yōu)先級(jí)的任務(wù)才能獲得CP
9、U的使用權(quán)。 非占先式調(diào)度的優(yōu)點(diǎn)是上下文切換少,幾乎不需要使用信號(hào)量保護(hù)共享數(shù)據(jù);缺點(diǎn)是處理器有效資源利用率低,任務(wù)級(jí)響應(yīng)時(shí)間不確定,可調(diào)度性不好。第13頁(yè),共47頁(yè)。10.1.9 函數(shù)的可重入性可重入(Reentrant)型函數(shù):是指可以被多個(gè)任務(wù)并發(fā)使用,而數(shù)據(jù)不會(huì)遭到破壞的函數(shù)??芍厝胄秃瘮?shù)特征:只使用局部變量,變量保存在CPU寄存器或堆棧中,可以在任意時(shí)刻被中斷,再重新恢復(fù)運(yùn)行時(shí),數(shù)據(jù)不會(huì)被破壞;若使用全局變量,則需滿足互斥條件。第14頁(yè),共47頁(yè)??芍厝胄秃瘮?shù)實(shí)例void func1(int* x, int* y) int temp;temp= *x;*x = *y;*y = tem
10、p;不可重入型函數(shù)清單static int temp;void func2(int* x, int* y) temp = *x;*x = *y;*y = temp; 第15頁(yè),共47頁(yè)。不可重入型函數(shù)運(yùn)行示意圖 使用以下技術(shù)之一可使函數(shù)func2()具有可重入性:(1) 將temp定義為局部變量;(2) 在調(diào)用前,禁止中斷,執(zhí)行完畢后再開中斷;(3) 在調(diào)用過(guò)程中,應(yīng)用信號(hào)量獨(dú)占使用該函數(shù)。第16頁(yè),共47頁(yè)。10.1.10 信號(hào)量信號(hào)量 信號(hào)與信號(hào)量在英文中都是同一個(gè)詞Semaphore,并不加以區(qū)別。是一種通信機(jī)制。主要用來(lái)實(shí)現(xiàn)任務(wù)間同步以及標(biāo)識(shí)某類資源的可用個(gè)數(shù)。兩種類型: 只取0和1兩
11、個(gè)值的二值(Binary)信號(hào)量,這種信號(hào)量也稱為信號(hào); 由若干位組合而成的計(jì)數(shù)式(Counting)信號(hào)量,一般有8位、16位或者32位等若干種,具體是多少位取決于內(nèi)核。作用: 滿足互斥條件,實(shí)現(xiàn)共享資源的獨(dú)占使用; 標(biāo)志某事件的發(fā)生; 使兩個(gè)任務(wù)的行為同步。第17頁(yè),共47頁(yè)。(1)初始化信號(hào)量,也可稱為建立(CREATE)信號(hào)量。信號(hào)量初始化時(shí),要給信號(hào)量賦初值,等待信號(hào)量的任務(wù)列表應(yīng)清空。(2)等信號(hào)或申請(qǐng)信號(hào)量,可稱做掛起(PEND)。對(duì)于執(zhí)行等待信號(hào)量的任務(wù)來(lái)說(shuō),若該信號(hào)量有效,則信號(hào)量值減1,任務(wù)繼續(xù)執(zhí)行;若信號(hào)量值為0,則任務(wù)繼續(xù)被掛起。若內(nèi)核允許定義等待超時(shí),則超時(shí)后,該任務(wù)
12、轉(zhuǎn)入就緒,同時(shí)返回錯(cuò)誤代碼以示發(fā)生了超時(shí)錯(cuò)誤。(3)給信號(hào),可稱做發(fā)信號(hào)(POST)。若沒(méi)有任務(wù)等待該信號(hào)量,則信號(hào)量的值僅簡(jiǎn)單加1;若只有一個(gè)任務(wù)等待該信號(hào)量,則該任務(wù)轉(zhuǎn)入就緒狀態(tài),信號(hào)量的值不加1;若有多個(gè)任務(wù)等待信號(hào)量,至于誰(shuí)先得到信號(hào)量,那就要看內(nèi)核是如何調(diào)度的了。一般有兩種可能:一是按優(yōu)先級(jí)原則,等待信號(hào)量的任務(wù)中優(yōu)先級(jí)最高的先得到;二是按先進(jìn)先出的原則,最早開始等待信號(hào)量的那個(gè)任務(wù)先得到。工作原理第18頁(yè),共47頁(yè)。 所謂死鎖,是指各并發(fā)任務(wù)彼此等待對(duì)方所擁有的資源,且這些并發(fā)任務(wù)在得到對(duì)方的資源之前不會(huì)釋放自己所擁有的資源,從而造成大家都想得到資源而又都得不到資源,各并發(fā)任務(wù)不能
13、繼續(xù)向前推進(jìn)的狀態(tài)。 最簡(jiǎn)單的防止死鎖發(fā)生的方法有兩種:1. 讓每個(gè)任務(wù)先得到全部需要的資源,再進(jìn)行下一步工作。2. 讓每個(gè)任務(wù)用同樣的順序去申請(qǐng)多個(gè)資源,釋放資源時(shí)使用相反的順序。10.1.11 死鎖第19頁(yè),共47頁(yè)。10.1.12 消息隊(duì)列 消息用于兩個(gè)任務(wù)之間的通信,消息隊(duì)列是保存消息的容器。通過(guò)內(nèi)核提供的服務(wù),任務(wù)或中斷服務(wù)子程序可以將一個(gè)消息放入消息隊(duì)列。同樣,一個(gè)或多個(gè)任務(wù)可以通過(guò)內(nèi)核服務(wù)從消息隊(duì)列中得到消息。 通常,先進(jìn)入消息隊(duì)列的消息先給任務(wù),遵循先進(jìn)先出原則(FIFO)。 內(nèi)核提供的典型消息隊(duì)列服務(wù)如下:1.消息隊(duì)列初始化,隊(duì)列初始化時(shí)總是清為空;2.放一則消息到隊(duì)列中去(
14、POST);3.等待一則消息的到來(lái)(PEND);4.無(wú)等待取得消息。如果隊(duì)列中有消息則任務(wù)可以取得消息,消息從隊(duì)列中取走;但如果此時(shí)隊(duì)列為空,則內(nèi)核不將該任務(wù)掛起,只是用特別的返回代碼通知調(diào)用者,隊(duì)列中沒(méi)有消息。第20頁(yè),共47頁(yè)。 中斷是指計(jì)算機(jī)在執(zhí)行程序的過(guò)程中,當(dāng)出現(xiàn)異常情況或特殊請(qǐng)求時(shí),計(jì)算機(jī)停止現(xiàn)行程序的運(yùn)行,轉(zhuǎn)向?qū)@些異常情況或特殊請(qǐng)求的處理,處理結(jié)束后再返回到以下部分:1.在前后臺(tái)系統(tǒng)中,程序回到后臺(tái)程序;2.對(duì)非占先式內(nèi)核而言,程序回到被中斷了的任務(wù);3.對(duì)占先式內(nèi)核而言,讓進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)開始運(yùn)行。10.1.13 中斷第21頁(yè),共47頁(yè)。 時(shí)鐘節(jié)拍是特定的周期性中
15、斷。這個(gè)中斷可以看作是系統(tǒng)心臟的脈動(dòng)。中斷之間的時(shí)間間隔取決于不同應(yīng)用,是機(jī)器周期的一個(gè)整數(shù)倍,一般為10200ms,視系統(tǒng)的復(fù)雜性和對(duì)實(shí)時(shí)性的要求而定。內(nèi)核對(duì)任務(wù)的切換和延時(shí)等操作都是基于時(shí)鐘節(jié)拍的。時(shí)鐘節(jié)拍的頻率越快,系統(tǒng)的額外開銷就越大。10.1.14 時(shí)鐘節(jié)拍第22頁(yè),共47頁(yè)。 RTX51是一款小巧的針對(duì)基于8051系列嵌入式系統(tǒng)的多任務(wù)實(shí)時(shí)操作系統(tǒng)。它的使用可以簡(jiǎn)化比較復(fù)雜、有嚴(yán)格時(shí)間限制的軟件的設(shè)計(jì)過(guò)程。RTX51主要有兩個(gè)不同的可用版本: RTX5lFull標(biāo)準(zhǔn)版,既可以以循環(huán)(Round 一Robin )方式執(zhí)行任務(wù),也可以按4級(jí)任務(wù)優(yōu)先級(jí)的方式切換不同優(yōu)先級(jí)的任務(wù)。標(biāo)準(zhǔn)版以
16、并行方式工作,支持中斷管理,信號(hào)和消息可以通過(guò)郵箱系統(tǒng)在不同任務(wù)之間傳遞。 RTX5lTiny精簡(jiǎn)版,是其標(biāo)準(zhǔn)版的一個(gè)子集。它可以很容易地運(yùn)行在8051的單芯片系統(tǒng)而不需要任何外部數(shù)據(jù)存儲(chǔ)器。通用性強(qiáng),系統(tǒng)需求低,但功能上受到限制。它只支持循環(huán)方式和信號(hào)方式的任務(wù)切換,而不支持優(yōu)先級(jí)方式的任務(wù)切換。 KEIL C中自帶了RTX5lTiny,以下只講解RTX5lTiny的內(nèi)容,出現(xiàn)RTX51的地方默認(rèn)為其精簡(jiǎn)版RTX51Tiny。10.2 RTX51 系統(tǒng)特點(diǎn)第23頁(yè),共47頁(yè)。 RTX51 可以在所有的8051 系列芯片上運(yùn)行。用戶只需要用標(biāo)準(zhǔn)的C語(yǔ)言編寫RTX51 程序,然后用C51編譯器編
17、譯即可生成代碼。 RTX51 程序設(shè)計(jì)需要包含實(shí)時(shí)運(yùn)行頭文件和必要的庫(kù)文件,并且要用BL51 連接定位器來(lái)實(shí)現(xiàn)連接。 在Keil中,你只需要在目標(biāo)選項(xiàng)的Target標(biāo)簽中的Operating中選擇RTX-51 Tiny,在你的頭文件中加上#include 即可。 第24頁(yè),共47頁(yè)。在RTX51 TINY環(huán)境下生成代碼,需要用到下列工具:C51編譯器BL51連接/定位器A51宏匯編器 此外,庫(kù)文件RTX51TNY.LIB必須存放在環(huán)境變量C51LIB所指定的路徑下。 RTX51 Tiny版可以運(yùn)行在8051的單芯片嵌入式系統(tǒng)上,且不需要任何外部數(shù)據(jù)存儲(chǔ)器,但也不排斥應(yīng)用程序訪問(wèn)外部的數(shù)據(jù)存儲(chǔ)器
18、。RTX51 Tiny版本可以使用C51所支持的所有存儲(chǔ)模式。所使用的存儲(chǔ)模式只影響應(yīng)用對(duì)象的存儲(chǔ)位置。RTX51 Tiny的系統(tǒng)變量和應(yīng)用程序的堆棧區(qū)總是存儲(chǔ)在8051的片內(nèi)RAM中(即DATA和IDATA)。典型的RTX51 Tiny應(yīng)用程序一般運(yùn)行于SMALL存儲(chǔ)模式下。第25頁(yè),共47頁(yè)。 RTX51 Tiny版本使用了8051的定時(shí)器0和定時(shí)器0的中斷信號(hào)。SFR中的全局中斷允許位或定時(shí)器0中斷屏蔽位都可能使RTX51 Tiny停止運(yùn)行。因此,除非有特殊的應(yīng)用目的,應(yīng)該使定時(shí)器0的中斷始終開啟,以保證RTX51 Tiny的正常運(yùn)行。 實(shí)時(shí)操作系統(tǒng)的性能參數(shù)對(duì)嵌入式系統(tǒng)的應(yīng)用開發(fā)也有著
19、直接影響,RTX51的性能參數(shù)如下表所示。描述RTX51 TINY 版本任務(wù)數(shù)16RAM 需求7 Byte data, 3(任務(wù)數(shù)) Byte idata代碼要求900 Byte硬件要求定時(shí)器0系統(tǒng)時(shí)鐘10065535周期中斷響應(yīng)時(shí)間20周期任務(wù)切換時(shí)間100700周期依賴于堆棧裝載第26頁(yè),共47頁(yè)。10.3 RTX51 的程序結(jié)構(gòu) RTX51Tiny通過(guò)循環(huán)(Round-Robin)方式來(lái)實(shí)現(xiàn)多任務(wù),以達(dá)到多個(gè)無(wú)限循環(huán)或任務(wù)的準(zhǔn)并行執(zhí)行。這里的多任務(wù)并不是真正同時(shí)執(zhí)行的,而是使用不同的時(shí)間片來(lái)執(zhí)行,即只是宏觀上的同時(shí)執(zhí)行。它將可用的CPU周期分成多個(gè)時(shí)間片,由RTX51把這些時(shí)間片分配給每
20、一個(gè)任務(wù)使用。每個(gè)任務(wù)只能在預(yù)定的時(shí)間片里運(yùn)行。然后,RTX51再切換到另一個(gè)己經(jīng)準(zhǔn)備就緒的任務(wù),讓它再執(zhí)行一定的時(shí)間片。 時(shí)間片一般是比較短促的,一個(gè)時(shí)間片大約只有毫秒級(jí)時(shí)間。正是由于這個(gè)原因,在用戶看來(lái),多個(gè)任務(wù)似乎是在同時(shí)執(zhí)行的。第27頁(yè),共47頁(yè)。 RTX51 利用了一個(gè)由8051定時(shí)器中斷信號(hào)驅(qū)動(dòng)的定時(shí)程序來(lái)實(shí)現(xiàn)控制。定時(shí)器產(chǎn)生的周期性中斷信號(hào)用來(lái)驅(qū)動(dòng)RTX51的定時(shí)節(jié)拍。 RTX51與用戶程序中的main函數(shù)是無(wú)關(guān)的。用戶程序中即使沒(méi)有main 程序,操作系統(tǒng)也會(huì)自動(dòng)從設(shè)定的任務(wù)0開始執(zhí)行。如果用戶程序中已經(jīng)有了main 函數(shù),就必須用人工方式來(lái)啟動(dòng)RTX51。這對(duì)于RTX51 T
21、iny版,可以調(diào)用os_create_task函數(shù)來(lái)完成. 例:使用RTX51的Round-Robin任務(wù)方式實(shí)現(xiàn)兩個(gè)任務(wù)的調(diào)度執(zhí)行。程序中的兩個(gè)任務(wù)都是簡(jiǎn)單的計(jì)數(shù)循環(huán)。第28頁(yè),共47頁(yè)。#include int counter0;int counter1;void job0(void) _task_ 0os_create_task(1); /*任務(wù)l 己準(zhǔn)備就緒*/while (1) /*無(wú)限循環(huán)*/ counter0+; /*更新計(jì)數(shù)值counter0*/ void job1(void) _task_ 1while(1) /*無(wú)限循環(huán)*/counter1+; /*更新計(jì)數(shù)值counter
22、1*/第29頁(yè),共47頁(yè)。10.4 RTX51的功能函數(shù) RTX51精簡(jiǎn)版支持的功能函數(shù)表 函數(shù)描述執(zhí)行周期數(shù)os_create_task將任務(wù)移入執(zhí)行隊(duì)列302os_delete_task執(zhí)行隊(duì)列中移去某任務(wù)172os_send_signal發(fā)送一信號(hào)到某任務(wù)(從某任務(wù)調(diào)用)408(任務(wù)切換)316(快速任務(wù)切換)71(不含任務(wù)切換)os_clear_signal刪除一發(fā)送信號(hào)57isr_send_signal發(fā)送一信號(hào)到某任務(wù)(從中斷調(diào)用)46os_running_task_id返回當(dāng)前執(zhí)行的任務(wù)號(hào)os_wait等待某事件68(對(duì)未就緒信號(hào))160(對(duì)未就緒消息)os_wait1等待某事件
23、os_wait2等待某事件第30頁(yè),共47頁(yè)。10.4.1 信號(hào)控制函數(shù) isr_send_signal函數(shù)原型 char isr_send_signal(unsigned char task_id);功能說(shuō)明 發(fā)送一個(gè)信號(hào)到task_id說(shuō)明的任務(wù)。如果此任務(wù)已在等待一個(gè)信號(hào),那么調(diào)用函數(shù)將使此任務(wù)就緒,準(zhǔn)備執(zhí)行。否則,信號(hào)將存儲(chǔ)在此任務(wù)的信號(hào)標(biāo)志中。此函數(shù)只能從中斷函數(shù)中調(diào)用。返 回 值 如果執(zhí)行成功,此函數(shù)返回0值;如果所指定的任務(wù)不存在,則返回-1 。第31頁(yè),共47頁(yè)。 os_clear_signal函數(shù)原型 char os_clear_signal(unsigned char ta
24、sk_id);功能說(shuō)明 清除由task_id說(shuō)明的任務(wù)的信號(hào)返 回 值 如果信號(hào)清除成功,此函數(shù)返回0值;如果所指定的任務(wù)不存在,則返回-1 os_send_signal函數(shù)原型 char os_send_signal(unsigned char task_id);功能說(shuō)明 發(fā)送一個(gè)信號(hào)到task_id說(shuō)明的任務(wù)。如果此任務(wù)已在等待一個(gè)信號(hào),那么調(diào)用函數(shù)將使此任務(wù)就緒,準(zhǔn)備執(zhí)行。否則,信號(hào)將存儲(chǔ)在此任務(wù)的信號(hào)標(biāo)志中。此函數(shù)只能在任務(wù)函數(shù)中調(diào)用返 回 值 如果執(zhí)行成功,此函數(shù)返回0值;如果所指定的任務(wù)不存在,則返回-1 第32頁(yè),共47頁(yè)。10.4.2 任務(wù)控制函數(shù) os_create_task
25、函數(shù)原型 char os_create_task(unsigned char task_id);功能說(shuō)明 啟動(dòng)已定義的由task_id說(shuō)明的任務(wù)。此任務(wù)根據(jù)RTX51運(yùn)行規(guī)則,標(biāo)記為就緒,并準(zhǔn)備執(zhí)行。返 回 值 如果任務(wù)成功啟動(dòng),此函數(shù)返回0值;如果沒(méi)有task_id說(shuō)明的任務(wù),則返回-1 第33頁(yè),共47頁(yè)。 os_delete_task函數(shù)原型 char os_delete_task(unsigned char task_id);功能說(shuō)明 停止task_id說(shuō)明的任務(wù),此任務(wù)將從任務(wù)表中刪除。返 回 值 如果任務(wù)成功啟動(dòng),此函數(shù)返回0值;如果沒(méi)有task_id說(shuō)明的任務(wù),則返回-1。 os
26、_running_task_id函數(shù)原型 char os_running_task_id(unsigned char task_id);功能說(shuō)明 判斷當(dāng)前執(zhí)行任務(wù)的編號(hào)返 回 值 返回當(dāng)前正在執(zhí)行的任務(wù)的編號(hào),返回值為015。 第34頁(yè),共47頁(yè)。10.4.3 延時(shí)控制函數(shù) os_wait函數(shù)原型 char os_wait( unsigned char event_sel, /*將要等待的事件*/ unsigned char tisks, /*將要等待的定時(shí)器時(shí)標(biāo)數(shù)*/ unsigned char dummy ); /*未用參數(shù)*/ 功能說(shuō)明 停止當(dāng)前執(zhí)行的任務(wù),并等待一個(gè)或多個(gè)事件,如時(shí)間間
27、隔、超時(shí)、從另一個(gè)任務(wù)或中斷發(fā)出的信號(hào)等。參數(shù)event_sel說(shuō)明所等待的一個(gè)事件或幾個(gè)事件的組合。事件種類如下表所示。 事件描述K_IVL定時(shí)器溢出K_SIG收到信號(hào)K_TMO時(shí)間片超時(shí)RTX51的事件類別第35頁(yè),共47頁(yè)。os_wait函數(shù)的返回值表 os_wait1 函數(shù)原型 char os_wait1(unsigned char event_sel);功能說(shuō)明 暫停當(dāng)前任務(wù),等待一個(gè)事件的發(fā)生。它是os_wait函數(shù)的一個(gè)子集,不接受針對(duì)os_wait函數(shù)提供的全部事件。參數(shù)event_sel指定了等待的事件,它只能是K_SIG。返 回 值 當(dāng)信號(hào)事件發(fā)生時(shí),任務(wù)就被允許執(zhí)行,任務(wù)
28、的執(zhí)行將恢復(fù)。返回用于識(shí)別事件、使任務(wù)重新啟動(dòng)的常量。 返回值描述SIG_EVENT信號(hào)被接收TMO_EVENT發(fā)生超時(shí)或事件間隔已過(guò)NOT_OKevent_sel的值非法第36頁(yè),共47頁(yè)。 os_wait2函數(shù)原型 char os_wait2( unsigned char event_sel, /*將要等待的事件*/ unsigned char tisks ); /*將要等待的定時(shí)器時(shí)標(biāo)數(shù)*/功能說(shuō)明 與os_wait相同,但是不需要dummy參數(shù)。 返 回 值 與os_wait相同 第37頁(yè),共47頁(yè)。10.5 RTX51的任務(wù)調(diào)度 RTX51利用任務(wù)狀態(tài)來(lái)管理各個(gè)任務(wù)。用戶為RTX51
29、定義的每個(gè)任務(wù)都會(huì)以各種狀態(tài)的某一種來(lái)運(yùn)行。RTX51內(nèi)核為每個(gè)任務(wù)保留了適當(dāng)?shù)臓顟B(tài)如下表所示。RTX51的任務(wù)狀態(tài)表 狀態(tài)描述Running運(yùn)行狀態(tài)當(dāng)前正在執(zhí)行的任務(wù),在任一時(shí)刻只能有一個(gè)任務(wù)處于運(yùn)行狀態(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)沒(méi)有啟動(dòng)的任務(wù)Time-out超時(shí)狀態(tài)與就緒狀態(tài)相似,放在round-robin中尚未執(zhí)行的任務(wù)第38頁(yè),共47頁(yè)。 RTX51以round-robin多任務(wù)方式執(zhí)行程序,它支持多個(gè)無(wú)限循環(huán)或任務(wù)的準(zhǔn)并行執(zhí)行。任務(wù)不是被同時(shí)執(zhí)行,
30、而是以分時(shí)的方式輪片執(zhí)行??捎玫腃PU時(shí)鐘周期被分成多個(gè)時(shí)間片,然后由RTX51 將這些時(shí)間片分配給各個(gè)任務(wù)。每個(gè)任務(wù)只允許在預(yù)定的時(shí)間片中執(zhí)行,時(shí)間片用完時(shí),RTX51就切換至另一個(gè)就緒的任務(wù),繼續(xù)執(zhí)行一段時(shí)間。時(shí)間片的具體長(zhǎng)度可以用配置函數(shù)TIMESHARING來(lái)定義。 如果遇到因?yàn)橐粋€(gè)任務(wù)處于等待并且占用了時(shí)間片而暫時(shí)無(wú)法往下執(zhí)行,可以調(diào)用系統(tǒng)函數(shù)os_wait來(lái)通知RTX51,以便將當(dāng)前的任務(wù)掛起而提前執(zhí)行另一任務(wù)。 第39頁(yè),共47頁(yè)。RTX51中處理任務(wù)分配的模塊稱為調(diào)度程序(Scheduler)。調(diào)度程序驅(qū)動(dòng)哪個(gè)任務(wù)運(yùn)行是按照以下的規(guī)則進(jìn)行的:(1)如果發(fā)生以下情況時(shí),當(dāng)前運(yùn)行的
31、任務(wù)將被中斷: 調(diào)用os_wait函數(shù),而所等待的事件未來(lái)到; 任務(wù)的執(zhí)行時(shí)間已經(jīng)超過(guò)所定義的Round-Robin循環(huán)時(shí)間間隔(2)如果發(fā)生以下情況時(shí),另一個(gè)任務(wù)將被啟動(dòng): 已沒(méi)有正在執(zhí)行的任務(wù); 將要執(zhí)行的任務(wù)處在就緒狀態(tài)或超時(shí)狀態(tài)。 第40頁(yè),共47頁(yè)。10.6 RTX51的系統(tǒng)配置 編寫RTX51程序需要包含RTX51TNY.H 文件。在程序中,需要用一個(gè)關(guān)鍵字“_task_” 來(lái)聲明一個(gè)函數(shù)的任務(wù)屬性。RTX51程序不需要main 函數(shù)。在進(jìn)行連接處理時(shí),會(huì)將啟動(dòng)任務(wù)0的執(zhí)行所需要的代碼連接進(jìn)來(lái),作為開始執(zhí)行的代碼。 用戶可以更改配置文件CONF_TNY.A51中的以下幾個(gè)參數(shù): 系
32、統(tǒng)定時(shí)器中斷所用的寄存器組 系統(tǒng)定時(shí)器的時(shí)間間隔 Round-Robin的超時(shí)(time-out)值 內(nèi)部數(shù)據(jù)存儲(chǔ)器的大小 RTX5l啟動(dòng)后的自由堆棧大小 第41頁(yè),共47頁(yè)。以下是配置文件的部分內(nèi)容:;RTX51 的硬件定時(shí)器;用下面的EQU可預(yù)置RTX51的定時(shí)器時(shí)間常數(shù);用8051 定時(shí)器0 作為控制軟件的定時(shí)器;定義定時(shí)器中斷用的寄存器組INT_REGBANK EQU 1 ;默認(rèn)為寄存器1組;定義8051定時(shí)器0溢出所需的機(jī)器周期數(shù)INT_CLOCK EQU 10000 ;默認(rèn)周期數(shù)為10000 ;定義Round-Robin 的Timeout 所需的定時(shí)器溢出數(shù)TIMESHARINGEQU 5 ;默認(rèn)為5次;注意:Round-Robin任務(wù)切換可用TIMESHARING為0來(lái)屏蔽 第42頁(yè),共47頁(yè)。;RTX51 堆??臻g;以下的EQU語(yǔ)句定
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 無(wú)錫地鐵鋼支撐施工方案
- 上海杉達(dá)學(xué)院《現(xiàn)代食品工程》2023-2024學(xué)年第二學(xué)期期末試卷
- 武漢光谷職業(yè)學(xué)院《中醫(yī)藥文獻(xiàn)檢索》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西科技學(xué)院《工程(應(yīng)用)》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川化工職業(yè)技術(shù)學(xué)院《視覺(jué)藝術(shù)形式構(gòu)建》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州工商學(xué)院《藥物合成反應(yīng)A》2023-2024學(xué)年第二學(xué)期期末試卷
- 規(guī)范漁船用工方案范本
- 蘭州工業(yè)學(xué)院《給排水施工》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川電影電視學(xué)院《中華射藝》2023-2024學(xué)年第一學(xué)期期末試卷
- 中國(guó)農(nóng)業(yè)大學(xué)《漢字文化及應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 專利檢索ppt課件(PPT 54頁(yè))
- 建筑立面十八式,你用過(guò)幾個(gè)?
- 三只小豬的真實(shí)故事
- (高清正版)T-CAGHP 031—2018 地質(zhì)災(zāi)害危險(xiǎn)性評(píng)估及咨詢?cè)u(píng)估預(yù)算標(biāo)準(zhǔn)(試行)
- 第九章 放射線對(duì)人體影響
- 屋面防水翻新改造工程施工方案(全面完整版)
- 教案(餐巾折花)
- 有限公司章程(AB股架構(gòu)).docx
- 北京市中小學(xué)生天文知識(shí)競(jìng)賽復(fù)習(xí)題庫(kù)
- GJB300797靜電標(biāo)準(zhǔn)doc
- 《把課堂還給學(xué)生》論文
評(píng)論
0/150
提交評(píng)論