




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式實(shí)時(shí)操作系統(tǒng) 多任務(wù)實(shí)時(shí)操作系統(tǒng) 多任務(wù)實(shí)時(shí)操作系統(tǒng) 前后臺(tái)系統(tǒng) 前后臺(tái)系統(tǒng)的組成:前臺(tái)和前后臺(tái)系統(tǒng)的組成:前臺(tái)和 后臺(tái)程序后臺(tái)程序 后臺(tái):后臺(tái):是一個(gè)無限循環(huán)的應(yīng)是一個(gè)無限循環(huán)的應(yīng) 用程序,循環(huán)中調(diào)用相應(yīng)的任用程序,循環(huán)中調(diào)用相應(yīng)的任 務(wù)函數(shù)完成相應(yīng)的操作,各個(gè)務(wù)函數(shù)完成相應(yīng)的操作,各個(gè) 任務(wù)依次運(yùn)行,沒有調(diào)度,運(yùn)任務(wù)依次運(yùn)行,沒有調(diào)度,運(yùn) 行的次序不能改變。行的次序不能改變。 前臺(tái):前臺(tái):是中斷服務(wù)程序,處是中斷服務(wù)程序,處 理異步事件。理異步事件。 適用情形 一般不復(fù)雜或?qū)崟r(shí)性要求不高的小系統(tǒng)很適合采用前后臺(tái)系 統(tǒng),例如微波爐、電話機(jī)、玩具等。 在另外一些基于省電的應(yīng)用中,由于平時(shí)
2、微處理器處在停機(jī) 狀態(tài),所有的事都靠中斷服務(wù)來完成,因此也常常采用前后 臺(tái)系統(tǒng)模式。 操作系統(tǒng) 操作系統(tǒng)(操作系統(tǒng)(Operating SystemOperating System,簡(jiǎn)稱,簡(jiǎn)稱OSOS)是計(jì)算機(jī)中最基本的程序。操作)是計(jì)算機(jī)中最基本的程序。操作 系統(tǒng)負(fù)責(zé)計(jì)算機(jī)系統(tǒng)中全部軟、硬資源的分配以及回收、控制與協(xié)調(diào)等并發(fā)的系統(tǒng)負(fù)責(zé)計(jì)算機(jī)系統(tǒng)中全部軟、硬資源的分配以及回收、控制與協(xié)調(diào)等并發(fā)的 活動(dòng);操作系統(tǒng)提供用戶接口,使用戶獲得良好的工作環(huán)境;操作系統(tǒng)為用戶活動(dòng);操作系統(tǒng)提供用戶接口,使用戶獲得良好的工作環(huán)境;操作系統(tǒng)為用戶 擴(kuò)展新的系統(tǒng)功能提供軟件平臺(tái)。擴(kuò)展新的系統(tǒng)功能提供軟件平臺(tái)。
3、操作系統(tǒng)的主要包括四大功能:操作系統(tǒng)的主要包括四大功能: 處理機(jī)管理:解決處理機(jī)管理:解決CPUCPU的分時(shí)復(fù)用。的分時(shí)復(fù)用。 存儲(chǔ)管理:配合存儲(chǔ)管理:配合CPUCPU調(diào)度內(nèi)存。調(diào)度內(nèi)存。 設(shè)備管理:分配外設(shè)的使用,包括獨(dú)享、共享和虛擬。設(shè)備管理:分配外設(shè)的使用,包括獨(dú)享、共享和虛擬。 軟件資源管理:解決程序和信息的存取和管理等問題。軟件資源管理:解決程序和信息的存取和管理等問題。 實(shí)時(shí)操作系統(tǒng) 實(shí)時(shí)操作系統(tǒng)(實(shí)時(shí)操作系統(tǒng)(RTOSRTOS)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時(shí),能夠接受并以)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時(shí),能夠接受并以足夠足夠 快的速度快的速度予以處理,其處理的結(jié)果又能在予以處理,其處理的
4、結(jié)果又能在規(guī)定的時(shí)間規(guī)定的時(shí)間之內(nèi)來控制生產(chǎn)過程或?qū)χ畠?nèi)來控制生產(chǎn)過程或?qū)?處理系統(tǒng)作出快速響應(yīng),并控制所有實(shí)時(shí)任務(wù)協(xié)調(diào)一致運(yùn)行的操作系統(tǒng)。處理系統(tǒng)作出快速響應(yīng),并控制所有實(shí)時(shí)任務(wù)協(xié)調(diào)一致運(yùn)行的操作系統(tǒng)。 多任務(wù)實(shí)時(shí)操作系統(tǒng) 用戶用戶的應(yīng)用程序是運(yùn)行于的應(yīng)用程序是運(yùn)行于RTOSRTOS之上的各個(gè)任務(wù),之上的各個(gè)任務(wù),RTOSRTOS根據(jù)各個(gè)任務(wù)的根據(jù)各個(gè)任務(wù)的 要求,進(jìn)行資源(包括存儲(chǔ)器、外設(shè)等)管理、消息管理、任務(wù)調(diào)度和異要求,進(jìn)行資源(包括存儲(chǔ)器、外設(shè)等)管理、消息管理、任務(wù)調(diào)度和異 常處理等工作。常處理等工作。 多任務(wù)多任務(wù)實(shí)時(shí)操作系統(tǒng)實(shí)時(shí)操作系統(tǒng),以分時(shí)方式運(yùn)行多個(gè)任務(wù),看上去好像是多
5、個(gè),以分時(shí)方式運(yùn)行多個(gè)任務(wù),看上去好像是多個(gè) 任務(wù)任務(wù)“同時(shí)同時(shí)”運(yùn)行。任務(wù)之間的切換應(yīng)當(dāng)以優(yōu)先級(jí)為根據(jù),只有具有運(yùn)行。任務(wù)之間的切換應(yīng)當(dāng)以優(yōu)先級(jí)為根據(jù),只有具有優(yōu)先優(yōu)先 服務(wù)方式服務(wù)方式的的RTOSRTOS才是真正的實(shí)時(shí)操作系統(tǒng),而時(shí)間分片方式和協(xié)作方式的才是真正的實(shí)時(shí)操作系統(tǒng),而時(shí)間分片方式和協(xié)作方式的 RTOSRTOS并不是真正的并不是真正的“實(shí)時(shí)實(shí)時(shí)”。 相關(guān)基本概念 資源與共享資源資源與共享資源內(nèi)核與內(nèi)核與任務(wù)任務(wù)切換切換 消息隊(duì)列消息隊(duì)列時(shí)鐘節(jié)拍時(shí)鐘節(jié)拍 調(diào)調(diào) 度度 死死 鎖鎖 臨界臨界 區(qū)區(qū) 中中 斷斷 任任 務(wù)務(wù) 函數(shù)的可重入性函數(shù)的可重入性 資源與共享資源 程序運(yùn)行程序運(yùn)行時(shí)
6、可使用的軟、硬件環(huán)境統(tǒng)稱為資源。資源可以是輸入時(shí)可使用的軟、硬件環(huán)境統(tǒng)稱為資源。資源可以是輸入/ /輸出設(shè)輸出設(shè) 備,例如打印機(jī)、鍵盤和顯示器;資源也可以是一個(gè)變量、一個(gè)結(jié)構(gòu)或備,例如打印機(jī)、鍵盤和顯示器;資源也可以是一個(gè)變量、一個(gè)結(jié)構(gòu)或 一個(gè)數(shù)組等一個(gè)數(shù)組等。 共享共享資源就是指可以被一個(gè)以上任務(wù)使用的資源。為防止數(shù)據(jù)被破壞,資源就是指可以被一個(gè)以上任務(wù)使用的資源。為防止數(shù)據(jù)被破壞, 每個(gè)任務(wù)在與共享資源打交道時(shí),必須獨(dú)占該資源,這叫每個(gè)任務(wù)在與共享資源打交道時(shí),必須獨(dú)占該資源,這叫互斥互斥。 任務(wù) 任務(wù),也稱為線程,是一任務(wù),也稱為線程,是一個(gè)程序個(gè)程序。一般地,每個(gè)任務(wù)都是一個(gè)無限的循環(huán)
7、。一般地,每個(gè)任務(wù)都是一個(gè)無限的循環(huán)。 任務(wù)任務(wù)有五種有五種狀態(tài),任何狀態(tài),任何時(shí)刻,一個(gè)任務(wù)都處于這五種狀態(tài)之一的狀態(tài)下時(shí)刻,一個(gè)任務(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)備好,可以運(yùn)行了,但由于該任務(wù)的優(yōu)先級(jí)比正在運(yùn)行的任務(wù)意味著該任務(wù)已經(jīng)準(zhǔn)備好,可以運(yùn)行了,但由于該任務(wù)的優(yōu)先級(jí)比正在運(yùn)行的任務(wù) 的優(yōu)先級(jí)低,還暫不能運(yùn)行的優(yōu)先級(jí)低,還暫不能運(yùn)行 。 運(yùn)行運(yùn)行態(tài)態(tài)的任務(wù)是指該任務(wù)掌握了的任務(wù)是指該任務(wù)掌握了CPUCPU的控制權(quán),正在運(yùn)行的控制權(quán),正在運(yùn)行
8、。 掛起掛起態(tài)態(tài)指該任務(wù)在等待,等待某一事件的發(fā)生指該任務(wù)在等待,等待某一事件的發(fā)生。 被被中斷狀態(tài)中斷狀態(tài)是指,發(fā)生中斷時(shí),是指,發(fā)生中斷時(shí),CPUCPU提供相應(yīng)的中斷服務(wù),原來正在運(yùn)行的任務(wù)暫不能運(yùn)提供相應(yīng)的中斷服務(wù),原來正在運(yùn)行的任務(wù)暫不能運(yùn) 行,就進(jìn)入了被中斷狀態(tài)行,就進(jìn)入了被中斷狀態(tài)。 內(nèi)核與任務(wù)切換 內(nèi)核是操作系統(tǒng)最基本的部分內(nèi)核是操作系統(tǒng)最基本的部分。 負(fù)責(zé)負(fù)責(zé)管理各個(gè)任務(wù)管理各個(gè)任務(wù),為,為每個(gè)每個(gè)任務(wù)任務(wù)分配資源分配資源,它,它 提供的基本服務(wù)是提供的基本服務(wù)是任務(wù)切換任務(wù)切換。 任務(wù)切換任務(wù)切換 當(dāng)當(dāng)多任務(wù)內(nèi)核決定運(yùn)行另外的任務(wù)時(shí),保存正多任務(wù)內(nèi)核決定運(yùn)行另外的任務(wù)時(shí),保存
9、正 在運(yùn)行任務(wù)的當(dāng)前狀態(tài),即在運(yùn)行任務(wù)的當(dāng)前狀態(tài),即保存保存CPUCPU寄存器中寄存器中 的全部?jī)?nèi)容的全部?jī)?nèi)容。這些內(nèi)容保存在任務(wù)的當(dāng)前狀態(tài)。這些內(nèi)容保存在任務(wù)的當(dāng)前狀態(tài) 保存區(qū),也就是任務(wù)自己的棧區(qū)之中保存區(qū),也就是任務(wù)自己的棧區(qū)之中。 入入棧工作完成以后,就把下一個(gè)將要運(yùn)行的任棧工作完成以后,就把下一個(gè)將要運(yùn)行的任 務(wù)的當(dāng)前狀態(tài)從任務(wù)的棧中務(wù)的當(dāng)前狀態(tài)從任務(wù)的棧中重新裝入重新裝入CPUCPU的寄的寄 存器存器,并開始下一個(gè)任務(wù)的運(yùn)行。這個(gè)過程就,并開始下一個(gè)任務(wù)的運(yùn)行。這個(gè)過程就 稱為任務(wù)切換稱為任務(wù)切換。 中斷 中斷是最基本的任務(wù)切換方式中斷是最基本的任務(wù)切換方式,停止,停止現(xiàn)行程序的運(yùn)
10、行,轉(zhuǎn)向?qū)@些異常情現(xiàn)行程序的運(yùn)行,轉(zhuǎn)向?qū)@些異常情 況或特殊請(qǐng)求的處理,處理結(jié)束后再返回到以下部分:況或特殊請(qǐng)求的處理,處理結(jié)束后再返回到以下部分: 1.1.在前后臺(tái)系統(tǒng)中,程序回到后臺(tái)程序;在前后臺(tái)系統(tǒng)中,程序回到后臺(tái)程序; 2.2.對(duì)非占先式內(nèi)核而言,程序回到被中斷了的任務(wù);對(duì)非占先式內(nèi)核而言,程序回到被中斷了的任務(wù); 3.3.對(duì)占先式內(nèi)核而言,讓進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)開始運(yùn)行。對(duì)占先式內(nèi)核而言,讓進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)開始運(yùn)行。 調(diào)度 任務(wù)任務(wù)的調(diào)度方式有的調(diào)度方式有基于時(shí)間片輪轉(zhuǎn)的調(diào)度基于時(shí)間片輪轉(zhuǎn)的調(diào)度和和基于優(yōu)先級(jí)的調(diào)度基于優(yōu)先級(jí)的調(diào)度。多數(shù)。多數(shù) 實(shí)時(shí)系統(tǒng)是基于優(yōu)先
11、級(jí)調(diào)度法的?;趦?yōu)先級(jí)的調(diào)度法指實(shí)時(shí)系統(tǒng)是基于優(yōu)先級(jí)調(diào)度法的?;趦?yōu)先級(jí)的調(diào)度法指CPUCPU總是讓處于就總是讓處于就 緒態(tài)的優(yōu)先級(jí)最高的任務(wù)先運(yùn)行。至于何時(shí)讓高優(yōu)先級(jí)任務(wù)掌握緒態(tài)的優(yōu)先級(jí)最高的任務(wù)先運(yùn)行。至于何時(shí)讓高優(yōu)先級(jí)任務(wù)掌握CPUCPU的使用的使用 權(quán),有兩種不同的權(quán),有兩種不同的情況:情況: 占先式調(diào)度占先式調(diào)度 任何任何時(shí)候具有最高優(yōu)先級(jí)且已就緒的任務(wù)先執(zhí)行時(shí)候具有最高優(yōu)先級(jí)且已就緒的任務(wù)先執(zhí)行。 非非占先式占先式調(diào)度調(diào)度 要求每個(gè)任務(wù)自我放棄要求每個(gè)任務(wù)自我放棄CPUCPU的所有權(quán)。的所有權(quán)。 臨界區(qū) 臨界資源:任何時(shí)候都只允許一個(gè)任務(wù)訪問的資源。臨界資源:任何時(shí)候都只允許一個(gè)任
12、務(wù)訪問的資源。 臨界區(qū)或臨界段:用于訪問臨界資源的代碼段。臨界區(qū)或臨界段:用于訪問臨界資源的代碼段。 臨界代碼段臨界代碼段不允許多個(gè)并發(fā)任務(wù)交叉執(zhí)行不允許多個(gè)并發(fā)任務(wù)交叉執(zhí)行,否則會(huì)產(chǎn)生嚴(yán)重后果,比如進(jìn)入中斷后的現(xiàn),否則會(huì)產(chǎn)生嚴(yán)重后果,比如進(jìn)入中斷后的現(xiàn) 場(chǎng)保護(hù)代碼等。場(chǎng)保護(hù)代碼等。 為確保臨界區(qū)代碼的安全執(zhí)行,在進(jìn)入臨界區(qū)之前要關(guān)中斷,而臨界區(qū)代碼執(zhí)行完以后為確保臨界區(qū)代碼的安全執(zhí)行,在進(jìn)入臨界區(qū)之前要關(guān)中斷,而臨界區(qū)代碼執(zhí)行完以后 要立即開中斷要立即開中斷 函數(shù)的可重入性 可重入可重入(Reentrant)(Reentrant)型函數(shù):是指可以被型函數(shù):是指可以被 多個(gè)任務(wù)并發(fā)使用,而數(shù)據(jù)
13、不會(huì)遭到破壞多個(gè)任務(wù)并發(fā)使用,而數(shù)據(jù)不會(huì)遭到破壞 的函數(shù)。的函數(shù)。 可重入型函數(shù)特征:可重入型函數(shù)特征: 只使用局部變量,變量保存在只使用局部變量,變量保存在CPUCPU寄存寄存 器或堆棧中,可以在任意時(shí)刻被中斷,器或堆棧中,可以在任意時(shí)刻被中斷, 再重新恢復(fù)運(yùn)行時(shí),數(shù)據(jù)不會(huì)被破壞;再重新恢復(fù)運(yùn)行時(shí),數(shù)據(jù)不會(huì)被破壞; 若使用全局變量,則需滿足互斥條件。若使用全局變量,則需滿足互斥條件。 可重入型函數(shù)實(shí)例可重入型函數(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ù)彼此等待對(duì)方所擁有的資源,且這死鎖,是指各并發(fā)任務(wù)彼此等待對(duì)方所擁有的資源,且這 些并發(fā)任務(wù)在得到對(duì)方的資源之前不會(huì)釋放自己所擁有的資源,些并發(fā)任務(wù)在得到對(duì)方的資源之前不會(huì)釋放自己所擁有的資源, 從而造成大家都想得到資源而又都得不到資源,各并發(fā)任務(wù)不從而造成大家都想得到資源而又都得不到資源,各并發(fā)任務(wù)不 能繼續(xù)向前推進(jìn)的狀態(tài)。能繼續(xù)向前推進(jìn)的狀態(tài)。 最最簡(jiǎn)單的防止死鎖發(fā)生的方法有兩種:簡(jiǎn)單的防止死鎖發(fā)生的方法有兩種:
15、 1. 1. 讓每個(gè)任務(wù)先得到全部需要的資源,再進(jìn)行下一步工作。讓每個(gè)任務(wù)先得到全部需要的資源,再進(jìn)行下一步工作。 2. 2. 讓每個(gè)任務(wù)用同樣的順序去申請(qǐng)多個(gè)資源,釋放資源時(shí)使用相反的順序。讓每個(gè)任務(wù)用同樣的順序去申請(qǐng)多個(gè)資源,釋放資源時(shí)使用相反的順序。 消息隊(duì)列和時(shí)鐘節(jié)拍 消息消息隊(duì)列是保存消息的容器。通過內(nèi)核提供的服務(wù),任務(wù)或中斷服務(wù)子程序可隊(duì)列是保存消息的容器。通過內(nèi)核提供的服務(wù),任務(wù)或中斷服務(wù)子程序可 以以將消息將消息放入消息隊(duì)列。同樣放入消息隊(duì)列。同樣,任務(wù),任務(wù)可以通過內(nèi)核服務(wù)從消息隊(duì)列中得到消息??梢酝ㄟ^內(nèi)核服務(wù)從消息隊(duì)列中得到消息。 通常,先進(jìn)入消息隊(duì)列的消息先給任務(wù),遵循先
16、進(jìn)先出原則(通常,先進(jìn)入消息隊(duì)列的消息先給任務(wù),遵循先進(jìn)先出原則(FIFOFIFO)。)。 內(nèi)核內(nèi)核提供的典型消息隊(duì)列服務(wù)如下提供的典型消息隊(duì)列服務(wù)如下: 1 1. .消息隊(duì)列初始化,隊(duì)列初始化時(shí)總是清為空消息隊(duì)列初始化,隊(duì)列初始化時(shí)總是清為空; 2 2. .放一則消息到隊(duì)列中去(放一則消息到隊(duì)列中去(POSTPOST); 3 3. .等待一則消息的到來(等待一則消息的到來(PENDPEND); 4 4. .無等待取得消息無等待取得消息。 基于RTX51操作系統(tǒng)的軟件設(shè)計(jì) RTX51是Keil公司開發(fā)的專門針對(duì)于8051兼容MCU所作的多任務(wù)實(shí)時(shí)操作系統(tǒng),是Keil自帶的小操 作系統(tǒng)之一。 有
17、二個(gè)不同的RTX51版本,RTX51 Full 和RTX51 Tiny RTX51 Tiny是一個(gè)功能強(qiáng)大的RTOS,且易于使用,它用于8051系列的微控制器。該RTOS最多支持 16個(gè)任務(wù),基于RTX51 Tiny構(gòu)建的應(yīng)用程序沒有main( )函數(shù),是從任務(wù)0開始執(zhí)行的,也不支持搶 先任務(wù)切換和任務(wù)優(yōu)先級(jí)。 RTX51 Tiny的程序用標(biāo)準(zhǔn)的C語(yǔ)言構(gòu)造,由Keil C51 C編譯器編譯。用戶可以很容易的定義任務(wù)函數(shù), 而不需要進(jìn)行復(fù)雜的棧和變量結(jié)構(gòu)配置,只需包含一個(gè)指定的頭文件(rtx5 1tny.h)。 RTX51 Tiny使用定時(shí)器0、定時(shí)器0中斷,和寄存器組1。 描述 RTX51完全
18、模式 RTX51最小模式 任務(wù)數(shù) 最大256,19個(gè)激活任務(wù),其中16個(gè)標(biāo)準(zhǔn) 任務(wù),3個(gè)快速任務(wù) 16 RAM 4046字節(jié)RAM 20200字節(jié)IDATA 最少450字節(jié)XDATA 7字節(jié)DATA 3*任務(wù)數(shù)IDATA 不需要XDATA ROM6KB8KB900字節(jié) 定時(shí)器定時(shí)器0或1定時(shí)器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)來管理各個(gè)任務(wù)利用任務(wù)狀態(tài)來管理各個(gè)任務(wù)。用戶為。用戶為RTX51RTX51定義的每個(gè)定義的每個(gè) 任務(wù)都會(huì)以各種狀態(tài)的某一種來運(yùn)行。任務(wù)都會(huì)以各種狀態(tài)的某一種來運(yùn)行。RTX51RTX51內(nèi)核為每個(gè)任務(wù)保內(nèi)核為每個(gè)任務(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運(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)沒有啟動(dòng)的任務(wù) Time-out超時(shí)狀態(tài)與就緒狀態(tài)相似,放在round-robin中尚未執(zhí)行的任務(wù) RTX51的任務(wù)調(diào)度 RTX51 RTX51支持多個(gè)任務(wù)的支持多個(gè)任務(wù)的準(zhǔn)并行執(zhí)行準(zhǔn)并行執(zhí)行。任務(wù)不是被同時(shí)執(zhí)行,而是以。任務(wù)不是被同時(shí)執(zhí)行,而是以分分 時(shí)的方式輪片執(zhí)行時(shí)的
22、方式輪片執(zhí)行??捎玫???捎玫腃PUCPU時(shí)間被分成多個(gè)時(shí)間片,然后由時(shí)間被分成多個(gè)時(shí)間片,然后由RTX51 RTX51 將將 這些時(shí)間片分配給各個(gè)任務(wù)。每個(gè)任務(wù)只允許在預(yù)定的時(shí)間片中執(zhí)行,這些時(shí)間片分配給各個(gè)任務(wù)。每個(gè)任務(wù)只允許在預(yù)定的時(shí)間片中執(zhí)行, 時(shí)間片用完時(shí),時(shí)間片用完時(shí),RTX51RTX51就切換至另一個(gè)就緒的任務(wù),繼續(xù)執(zhí)行一段時(shí)間。就切換至另一個(gè)就緒的任務(wù),繼續(xù)執(zhí)行一段時(shí)間。 時(shí)間片的具體長(zhǎng)度可以用配置函數(shù)時(shí)間片的具體長(zhǎng)度可以用配置函數(shù)TIMESHARING來定義。來定義。 如果遇到因?yàn)橐粋€(gè)任務(wù)處于等待并且占用了時(shí)間片而暫時(shí)無法往下如果遇到因?yàn)橐粋€(gè)任務(wù)處于等待并且占用了時(shí)間片而暫時(shí)無
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ū)動(dòng)哪個(gè)任務(wù)運(yùn)行是按照以下的規(guī)則進(jìn)行的:序驅(qū)動(dòng)哪個(gè)任務(wù)運(yùn)行是按照以下的規(guī)則進(jìn)行的: (1 1)如果發(fā)生以下情況時(shí),當(dāng)前運(yùn)行的任務(wù)將被中斷:)如果發(fā)生以下情況時(shí),當(dāng)前運(yùn)行的任務(wù)將被中斷: 調(diào)用調(diào)用os_waitos_wait函數(shù),而所等待的事件未
24、來到;函數(shù),而所等待的事件未來到; 任務(wù)的執(zhí)行時(shí)間已經(jīng)超過所定義的任務(wù)的執(zhí)行時(shí)間已經(jīng)超過所定義的Round-RobinRound-Robin循環(huán)時(shí)間間隔循環(huán)時(shí)間間隔 (2 2)如果發(fā)生以下情況時(shí),另一個(gè)任務(wù)將被啟動(dòng):)如果發(fā)生以下情況時(shí),另一個(gè)任務(wù)將被啟動(dòng): 已已沒有正在執(zhí)行的任務(wù);沒有正在執(zhí)行的任務(wù); 將要將要執(zhí)行的任務(wù)處在就緒狀態(tài)或超時(shí)狀態(tài)。執(zhí)行的任務(wù)處在就緒狀態(tài)或超時(shí)狀態(tài)。 RTX51系統(tǒng)的配置 編寫編寫RTX51RTX51程序需要包含程序需要包含RTX51TNY.H RTX51TNY.H 文件。在程序中,需要用一個(gè)關(guān)鍵字文件。在程序中,需要用一個(gè)關(guān)鍵字“_task_task_” 來聲明
25、一個(gè)函數(shù)來聲明一個(gè)函數(shù) 的任務(wù)屬性。的任務(wù)屬性。RTX51RTX51程序不需要程序不需要main main 函數(shù)。在進(jìn)行連接處理時(shí),會(huì)將函數(shù)。在進(jìn)行連接處理時(shí),會(huì)將啟動(dòng)任務(wù)啟動(dòng)任務(wù)0 0的執(zhí)行所需要的代碼連接的執(zhí)行所需要的代碼連接 進(jìn)來,作為開始執(zhí)行的代碼。進(jìn)來,作為開始執(zhí)行的代碼。 用戶可以更改配置文件用戶可以更改配置文件CONF_TNY.A51CONF_TNY.A51中的以下幾個(gè)參數(shù):中的以下幾個(gè)參數(shù): 系統(tǒng)定時(shí)器中斷所用的寄存器組系統(tǒng)定時(shí)器中斷所用的寄存器組 系統(tǒng)定時(shí)器的時(shí)間間隔系統(tǒng)定時(shí)器的時(shí)間間隔 Round-RobinRound-Robin的超時(shí)(的超時(shí)(time-outtime-o
26、ut)值)值 內(nèi)部數(shù)據(jù)存儲(chǔ)器的大小內(nèi)部數(shù)據(jù)存儲(chǔ)器的大小 RTX5lRTX5l啟動(dòng)后的自由堆棧大小啟動(dòng)后的自由堆棧大小 RTX51系統(tǒng)的配置 參數(shù)參數(shù)描述描述 INT_REGBANK說明RTX51系統(tǒng)所用的寄存器組 INT_CLOCK 定義系統(tǒng)時(shí)間間隔,系統(tǒng)用這個(gè)間隔產(chǎn)生一個(gè)中斷信號(hào),定義的數(shù)據(jù)是指每次中斷發(fā)生 所需的CPU周期數(shù) TIMESHARING 定義Round-Robin任務(wù)切換的超時(shí)間隔(time-out),它是定時(shí)器溢出中斷次數(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會(huì)檢驗(yàn)堆棧體積是否合理。如太小,引用STACK_ERROR宏 STACK_ERROR當(dāng)RTX51檢測(cè)到堆棧出錯(cuò)時(shí)執(zhí)行的宏,可以根據(jù)應(yīng)用程序需求更換這個(gè)宏 RTX51的功能函數(shù) 函數(shù)函數(shù)描述描述執(zhí)行周期數(shù)執(zhí)行周期數(shù) os_create_task將任務(wù)移入執(zhí)行隊(duì)列302 os_delete_task執(zhí)行隊(duì)列中移去某任務(wù)172 os_send_signal發(fā)送一信號(hào)到某任務(wù)(從某任務(wù)調(diào)用) 408(任務(wù)切換) 71(不含任務(wù)切換) os_clear_signal刪除一發(fā)送信號(hào)57 isr_send_signal發(fā)送一
28、信號(hào)到某任務(wù)(從中斷調(diào)用)46 os_running_task_id返回當(dāng)前執(zhí)行的任務(wù)號(hào) os_wait等待某事件 68(對(duì)未就緒信號(hào)) 160(對(duì)未就緒消息) os_wait1等待某事件 os_wait2等待某事件 RTX51的功能函數(shù) isr_send_signal 函數(shù)原型函數(shù)原型 char isr_send_signal(unsigned char task_id); 功能說明功能說明 發(fā)送一個(gè)信號(hào)到發(fā)送一個(gè)信號(hào)到task_idtask_id任務(wù)。如果此任務(wù)已在等待一個(gè)信號(hào),那么調(diào)用函數(shù)將使此任任務(wù)。如果此任務(wù)已在等待一個(gè)信號(hào),那么調(diào)用函數(shù)將使此任 務(wù)就緒,準(zhǔn)備執(zhí)行。否則,信號(hào)將存儲(chǔ)在
29、此任務(wù)的信號(hào)標(biāo)志中。此函數(shù)只能從中斷函數(shù)中調(diào)用。務(wù)就緒,準(zhǔn)備執(zhí)行。否則,信號(hào)將存儲(chǔ)在此任務(wù)的信號(hào)標(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ù)的信號(hào)任務(wù)的信號(hào) 返返 回回 值值 如果信號(hào)清除成功,此函數(shù)返回如果信號(hào)清除成功,此函數(shù)返回0 0值;如果所
30、指定的任務(wù)不存在,則返回值;如果所指定的任務(wù)不存在,則返回-1-1 os_send_signal 函數(shù)原型函數(shù)原型 char os_send_signal(unsigned char task_id); 功能說明功能說明 發(fā)送一個(gè)信號(hào)到發(fā)送一個(gè)信號(hào)到task_idtask_id任務(wù)。如果此任務(wù)已在等待一個(gè)信號(hào),那么調(diào)用函數(shù)將使此任任務(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)用務(wù)就緒,準(zhǔn)備執(zhí)行。否則,信號(hào)將存儲(chǔ)在此任務(wù)的信號(hào)標(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); 功能說明功能說明 啟動(dòng)已定義的由啟動(dòng)已定義的由task_idtask_id任務(wù)任務(wù)。此任務(wù)根據(jù)。此任務(wù)根據(jù)RTX51RTX51運(yùn)行規(guī)則,標(biāo)記為就緒,并準(zhǔn)備執(zhí)行。運(yùn)行規(guī)則,標(biāo)記為就緒,并準(zhǔn)備執(zhí)行。 返返 回回 值值 如果任務(wù)成功啟動(dòng),此函數(shù)返回如果任務(wù)成功啟動(dòng),此函數(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ù)成功啟動(dòng),此函數(shù)返回如果任務(wù)成功啟動(dòng),此函數(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ù)的編號(hào)判斷當(dāng)前執(zhí)行任務(wù)的編號(hào) 返返 回回 值值 返回當(dāng)前正在執(zhí)行的任務(wù)的編號(hào),返回值為返回當(dāng)前正在執(zhí)行的任務(wù)的編號(hào),返回值為0 01515。 RTX51的功能函數(shù) os_wait 函數(shù)原型函數(shù)原型 char os_wait( unsigned char event_sel, unsigned char tisks, unsigned char dummy ); /*將要等待的事件*/ /*將要等待的定時(shí)器時(shí)標(biāo)數(shù)*/ /*未用參數(shù)*/ 功能說明功能說明 停止當(dāng)前執(zhí)行的任務(wù),并等待一個(gè)或多個(gè)事件,如時(shí)間間隔、超時(shí)、從另一個(gè)任務(wù)停止當(dāng)前執(zhí)行的任務(wù),并等待一個(gè)或多個(gè)事件
34、,如時(shí)間間隔、超時(shí)、從另一個(gè)任務(wù) 或中斷發(fā)出的信號(hào)等。參數(shù)或中斷發(fā)出的信號(hào)等。參數(shù)event_selevent_sel說明所等待的一個(gè)事件或幾個(gè)事件的組合。事件說明所等待的一個(gè)事件或幾個(gè)事件的組合。事件種類及返種類及返 回值如下回值如下表所表所示:示: os_waitos_wait函數(shù)函數(shù)的事件參數(shù)表的事件參數(shù)表 os_waitos_wait函數(shù)的返回值表函數(shù)的返回值表 事件事件描述描述 K_IVL定時(shí)器溢出 K_SIG收到信號(hào) K_TMO時(shí)間片超時(shí) 返回值返回值描述描述 SIG_EVENT信號(hào)被接收 TMO_EVENT發(fā)生超時(shí)或事件間隔已過 NOT_OKevent_sel的值非法 RTX51
35、的功能函數(shù) os_wait1 函數(shù)原型函數(shù)原型 char os_wait1(unsigned char event_sel); 功能說明功能說明 暫停當(dāng)前任務(wù),等待一個(gè)事件的發(fā)生。它是暫停當(dāng)前任務(wù),等待一個(gè)事件的發(fā)生。它是os_waitos_wait函數(shù)的一個(gè)子集,不接受針對(duì)函數(shù)的一個(gè)子集,不接受針對(duì) os_waitos_wait函數(shù)提供的全部事件。參數(shù)函數(shù)提供的全部事件。參數(shù)event_selevent_sel指定了等待的事件,它只能是指定了等待的事件,它只能是K_SIGK_SIG。 返返 回回 值值 當(dāng)信號(hào)事件發(fā)生時(shí),任務(wù)就被允許執(zhí)行,任務(wù)的執(zhí)行將恢復(fù)。返回用于識(shí)別事件、使當(dāng)信號(hào)事件發(fā)生時(shí)
36、,任務(wù)就被允許執(zhí)行,任務(wù)的執(zhí)行將恢復(fù)。返回用于識(shí)別事件、使 任務(wù)重新啟動(dòng)的常量任務(wù)重新啟動(dòng)的常量。 os_wait2 函數(shù)原型函數(shù)原型 char os_wait2( unsigned char event_sel, unsigned char tisks ); / /* *將要等待的事件將要等待的事件* */ / / /* *將要等待的定時(shí)器時(shí)標(biāo)數(shù)將要等待的定時(shí)器時(shí)標(biāo)數(shù)* */ / 功能功能說明說明 與與os_waitos_wait相同,但是不需要相同,但是不需要dummydummy參數(shù)。參數(shù)。 返返 回回 值值 與與os_waitos_wait相同相同 最好的學(xué)習(xí)資料 最好的學(xué)習(xí)資料是最好的
37、學(xué)習(xí)資料是Keil 中中自帶的用戶手冊(cè)自帶的用戶手冊(cè) RTX51的應(yīng)用舉例 下面的代碼將要實(shí)現(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)閉四個(gè)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個(gè)時(shí)鐘周期 void job2(void) _task_ 2 while(1) LED1 = !LED1; os_wait(K_TMO, 70, 0); /等待(延時(shí))0.7s void job3(void) _task_ 3 while(1) LED2 = !LED2; os_wait(K_TMO, 40, 0); /等待(延時(shí))0.4s void job4(void) _task_ 4 while(1) LED3 = !LED3; os_wait(K_TMO, 20, 0); /等待(延時(shí))0.2s void job5(void) _task_ 5 while(1) if(0 = KEY0) /判斷按鍵是否按下 LED3 = 1; os_delete_task(4); /按鍵按下時(shí)關(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 跨國(guó)公司授權(quán)經(jīng)銷合同范例
- 電子產(chǎn)品采購(gòu)合同(簡(jiǎn)易范本)
- 房屋托管合同版:條款詳解
- 建筑幕墻維修保養(yǎng)合同
- 合同:國(guó)產(chǎn)化項(xiàng)目-進(jìn)口直流電機(jī)電刷
- 新建停車場(chǎng)業(yè)主與開發(fā)商委托合同
- 婚內(nèi)子女撫養(yǎng)合同范本
- 基礎(chǔ)設(shè)施建設(shè)項(xiàng)目土地征用合同樣本
- 家庭分家析產(chǎn)合同全文
- 20 蜘蛛開店(教學(xué)設(shè)計(jì))-2023-2024學(xué)年統(tǒng)編版語(yǔ)文二年級(jí)下冊(cè)
- 高考英語(yǔ)語(yǔ)法考點(diǎn)梳理
- 《護(hù)患溝通》課件
- 《籃球防守腳步移動(dòng)技術(shù) 滑步》教案
- 完整版項(xiàng)目部組織機(jī)構(gòu)圖
- 人工智能客服機(jī)器人使用手冊(cè)
- (新版)拖拉機(jī)駕駛證科目一知識(shí)考試題庫(kù)500題(含答案)
- (人衛(wèi)版第九版?zhèn)魅静W(xué)總論(一))課件
- 工業(yè)機(jī)器人仿真與離線編程項(xiàng)目-8-KUKA-Sim-Pro-軟件的介紹及基本操作
- 2023年江蘇省鎮(zhèn)江市中考數(shù)學(xué)試卷及答案
- 高校輔導(dǎo)員招聘筆試試題及答案
- 密目網(wǎng)覆蓋施工方案
評(píng)論
0/150
提交評(píng)論