高通ARM平臺(tái) REX操作系統(tǒng)指南_第1頁(yè)
高通ARM平臺(tái) REX操作系統(tǒng)指南_第2頁(yè)
高通ARM平臺(tái) REX操作系統(tǒng)指南_第3頁(yè)
高通ARM平臺(tái) REX操作系統(tǒng)指南_第4頁(yè)
高通ARM平臺(tái) REX操作系統(tǒng)指南_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Real-TimeExecutive(REX)吏用手冊(cè)▲第一章序言1.1目的本文描述了基于ARM平臺(tái)的Real-TimeExecutive(REX)操作系統(tǒng)特性及使用方法。REX是專為小型嵌入式系統(tǒng)設(shè)計(jì)的簡(jiǎn)單高效的搶占式多任務(wù)實(shí)時(shí)操作系統(tǒng)(RTOS)。該系統(tǒng)最初是為Intel80186處理器設(shè)計(jì)的,隨后被移植到ARM處理器。本文提供了REX的指南,第7章為編程參考。1.2適用范圍本手冊(cè)適用于需要在REX系統(tǒng)上編寫(xiě)應(yīng)用程序的讀者。1.3內(nèi)容組織本文按以下結(jié)構(gòu)編寫(xiě):■第2章REX概述■第3-6章REX的詳細(xì)敘述及內(nèi)部工作機(jī)制■第7章編程指南1.4字形習(xí)慣函數(shù)聲明,函數(shù)名,類型聲明,示例代碼使用特殊的字體,例如:#inelude程序變量用尖括號(hào)包圍,例如<number>1.5版本歷史版本日期說(shuō)明1999年1月初始版本Rev.A1999年3月內(nèi)容更新Rev.B2001年6月刪除了與80186有關(guān)的部分,更新了REX的API,更新了中斷處理的章節(jié)Rev.C2001年9月刪除了成型信息1.6參考資料1REXPortationGuide80-24880-1X11999年3月2REX++REXExtensionsUsersGuide80-V3083-1X12001年4月1.7技術(shù)支持如需要求了解本文未詳細(xì)說(shuō)明的信息可通過(guò)高通的CDMA技術(shù)支持郵箱聯(lián)系:asicapps@。asicapps@。1.8術(shù)語(yǔ)及習(xí)慣用語(yǔ)本文使用以下術(shù)語(yǔ)及習(xí)慣用語(yǔ)APCSARM調(diào)用規(guī)范。為了支持不同廠家編譯系統(tǒng)及匯編語(yǔ)言混合編程,ARM規(guī)定了程序調(diào)用的入口、出口處理及寄存器的使用規(guī)范。APIARM應(yīng)用程序接口。AdvancedRISCMachinesLimited,ARM系列處理器制造商,通常也指ARM系列微處理器。ARM7TDMICPSRARM7系列處理器中的一款。當(dāng)前程序狀態(tài)寄存器,該寄存器保存了旗語(yǔ),中斷控制位和處理器當(dāng)前操作模式。criticalsection臨界區(qū),代碼中訪問(wèn)共享資源的部分。

FIQ快速中斷,由ARM支持的中斷之一,F(xiàn)IQ中斷服務(wù)程序正在進(jìn)行時(shí)也可用來(lái)標(biāo)志處理器工作模式。IRQ普通中斷,由ARM支持的中斷之一,IRQ中斷服務(wù)程序正在進(jìn)行時(shí)也可用來(lái)標(biāo)志處理器工作模式。ISRIdleTask中斷服務(wù)程序,也稱為interrupttrampolinefunction。操作系統(tǒng)中的優(yōu)先級(jí)最低的任務(wù),空閑任務(wù)的優(yōu)先級(jí)為0,為一個(gè)空等待循環(huán),只能由中斷搶奪其CPU控制權(quán)。PCPSRREXRTOSSPSR程序當(dāng)前指令寄存器程序狀態(tài)寄存器高通的實(shí)時(shí)操作系統(tǒng)實(shí)時(shí)操作系統(tǒng)受保護(hù)的程序狀態(tài)寄存器,每一個(gè)處理器模式提供一個(gè)SPSR用以保存處理器切換到其它模式前的CPSR。TCBtimerblocktrampolinefunction任務(wù)控制塊,REX內(nèi)部的數(shù)據(jù)結(jié)構(gòu),用于存放任務(wù)的信息。定時(shí)器的別名。REX之外的中斷服務(wù)函數(shù),同ISR。第二章REX概述REX是一個(gè)搶先的多任務(wù)實(shí)時(shí)操作系統(tǒng),為任務(wù)的控制,同步,互斥,定時(shí)和中斷控制提供了相應(yīng)的API,所有的函數(shù)在調(diào)用它們的任務(wù)提供的設(shè)備環(huán)境下運(yùn)行。2.1任務(wù)REX將每個(gè)任務(wù)視為獨(dú)立的實(shí)體句柄,有獨(dú)享的堆棧和優(yōu)先級(jí)并共同組成任務(wù)的設(shè)備環(huán)境,每個(gè)任務(wù)有一組數(shù)據(jù)組成的結(jié)構(gòu),稱為任務(wù)控制塊(TCB),REX通過(guò)任務(wù)控制塊記錄任務(wù)運(yùn)行的設(shè)備環(huán)境。REX運(yùn)行期間允許在任何時(shí)候動(dòng)態(tài)創(chuàng)建任意數(shù)量的任務(wù),盡管更多的任務(wù)造成了遍歷任務(wù)鏈表的時(shí)間延長(zhǎng),但新增任務(wù)對(duì)REX性能造成的損失是微乎其微的。不過(guò)仍要注意盡量使任務(wù)的數(shù)量保持最小。REX所能負(fù)擔(dān)的任務(wù)最終取決于處理器種類,時(shí)鐘速率以及特定應(yīng)用下的中斷響應(yīng)指標(biāo)。2.2堆棧前一節(jié)提到過(guò)每個(gè)任務(wù)有獨(dú)立的堆??臻g,任務(wù)處于運(yùn)行狀態(tài)時(shí),該堆棧被激活,當(dāng)任務(wù)掛起時(shí),任務(wù)的設(shè)備環(huán)境被保存于堆棧頂部,堆棧指針則存放于該任務(wù)的TCB中。任務(wù)可能由于阻塞,等待信號(hào)量,等待中斷服務(wù)而掛起。如果任務(wù)被重新激活到運(yùn)行狀態(tài),調(diào)度程序從TCB中恢復(fù)堆棧指針,任務(wù)的設(shè)備環(huán)境就可從堆棧中彈出,任務(wù)即可恢復(fù)運(yùn)行。任務(wù)調(diào)度處理對(duì)于任務(wù)來(lái)講是透明的。2.3優(yōu)先級(jí)和調(diào)度每一個(gè)任務(wù)都有一個(gè)優(yōu)先級(jí),優(yōu)先級(jí)存放于任務(wù)的TCB中,優(yōu)先級(jí)可以是任何的非零的32位數(shù),數(shù)值越小則優(yōu)先級(jí)越低,REX占用了優(yōu)先級(jí)0用于空閑任務(wù),舊版本的REX要求每個(gè)任務(wù)獨(dú)占優(yōu)先級(jí),新的版本已經(jīng)沒(méi)有這個(gè)限制了。REX的調(diào)度策略為放行優(yōu)先級(jí)最高的就緒態(tài)任務(wù),即激活不等待任何事件的最高優(yōu)先級(jí)任務(wù)。如果滿足條件的同優(yōu)先級(jí)任務(wù)不只一個(gè),則REX會(huì)任選其中的一個(gè)任務(wù)。被激活的任務(wù)會(huì)一直運(yùn)行到主動(dòng)掛起或中斷程序使另一個(gè)更高優(yōu)先級(jí)的任務(wù)恢復(fù)運(yùn)行。一個(gè)任務(wù)等待的事件到達(dá)后,該任務(wù)進(jìn)入就緒態(tài),如果所有的任務(wù)都處于掛起狀態(tài),則空閑任務(wù)被激活。REX支持任務(wù)動(dòng)態(tài)修改優(yōu)先級(jí),一個(gè)任務(wù)可以提升或降低自己或其他任務(wù)的優(yōu)先級(jí)。2.4中斷REX為搶占式內(nèi)核,當(dāng)中斷返回時(shí),控制會(huì)交給優(yōu)先級(jí)最高的就緒任務(wù)而不是被中斷的任務(wù)。2.5互斥當(dāng)兩個(gè)任務(wù)需要共享一個(gè)資源時(shí),需要有一個(gè)訪問(wèn)互斥機(jī)制,訪問(wèn)共享資源部分的代碼成為臨界區(qū)。通過(guò)關(guān)中斷可以簡(jiǎn)單的實(shí)現(xiàn)臨界區(qū),REX還提供一種不太徹底的方式,導(dǎo)出函數(shù)可用于鎖定或釋放公共資源。2.6禁用中斷后的掛起只有正在運(yùn)行的任務(wù)可以禁止中斷,一旦某個(gè)任務(wù)禁止中斷后掛起,中斷狀態(tài)則一直由該任務(wù)保存,任務(wù)重新激活后可以恢復(fù)中斷狀態(tài)。有一種潛在的危險(xiǎn)是中斷被下一個(gè)激活的任務(wù)允許,這一特性在以后的版本中可能被修改,但是程序員不能依賴這一點(diǎn)。2.7信號(hào)量通用信號(hào)量集與每一個(gè)任務(wù)關(guān)聯(lián),這些信號(hào)量集作為相關(guān)任務(wù)的設(shè)備環(huán)境保存在任務(wù)的TCB里,用來(lái)表示與任務(wù)有關(guān)的某類事件發(fā)生了。一個(gè)任務(wù)的信號(hào)量可以被所有任務(wù)及中斷服務(wù)程序設(shè)置或清除。關(guān)于信號(hào)量需要注意的重點(diǎn):信號(hào)量是通用旗語(yǔ),用戶可以任意定義信號(hào)量的含義。一個(gè)任務(wù)可以通過(guò)其他任務(wù)或中斷任意設(shè)置一個(gè)特定的信號(hào)量掛起,需要強(qiáng)調(diào)的是任意,如果一個(gè)任務(wù)并沒(méi)有因該信號(hào)量掛起,則設(shè)置的信號(hào)量不會(huì)對(duì)該任務(wù)的運(yùn)行狀態(tài)產(chǎn)生影響。2.8定時(shí)器定時(shí)器用來(lái)確定某個(gè)時(shí)間間隔,任務(wù)通過(guò)定時(shí)器來(lái)實(shí)現(xiàn)一段延時(shí),延時(shí)時(shí)間到了以后會(huì)有一個(gè)信號(hào)量時(shí)標(biāo),任務(wù)可以查詢?cè)摃r(shí)標(biāo),或者任務(wù)可以掛起自己等待該信號(hào)量時(shí)標(biāo)。定時(shí)器可以和其他事件聯(lián)合使用,這樣就可以確定事件是否超時(shí)。REX通過(guò)維護(hù)定時(shí)器鏈表的方式管理所有正在計(jì)時(shí)的定時(shí)器。對(duì)定時(shí)器的數(shù)量沒(méi)有限制,定時(shí)器越多則每次遍歷鏈表耗時(shí)越長(zhǎng),但是新增一個(gè)定時(shí)器對(duì)性能的影響是微弱的。已經(jīng)到期的計(jì)數(shù)器不會(huì)產(chǎn)生管理開(kāi)銷。2.9擴(kuò)展接口REX提供了一些擴(kuò)展接口以增強(qiáng)可操作性,例如異步進(jìn)程調(diào)用,延遲進(jìn)程調(diào)用,內(nèi)存管理。詳情參考REX++—REX擴(kuò)展用戶使用手冊(cè)(80-V3083-1)。第三章任務(wù)本章詳細(xì)描述了REX的調(diào)度及設(shè)備環(huán)境調(diào)度機(jī)制。3.1任務(wù)的創(chuàng)建創(chuàng)建新任務(wù)使用REX提供的函數(shù)rex_def_task()°REX并不為任務(wù)堆棧和TCB分配空間。這一工作由調(diào)用創(chuàng)建任務(wù)函數(shù)的程序負(fù)責(zé)。不過(guò)REX要求避免用戶直接操作TCB的數(shù)據(jù)結(jié)構(gòu)。任務(wù)創(chuàng)建函數(shù)rex_def_task()完成以下工作:將設(shè)備環(huán)境數(shù)據(jù)入棧設(shè)置TCB將要?jiǎng)?chuàng)建的任務(wù)加入任務(wù)列表調(diào)度處理如果新建任務(wù)優(yōu)先級(jí)高于當(dāng)前任務(wù),則新任務(wù)取得控制權(quán),否則,調(diào)度直接返回而不發(fā)生任務(wù)切換。新建的任務(wù)直到成為優(yōu)先級(jí)最高的就緒任務(wù)時(shí)開(kāi)始執(zhí)行。任務(wù)的入口由rex_def_task()指定為rex_task_preamble(),任務(wù)在第一次獲得控制權(quán)時(shí)初始化堆棧。任務(wù)永遠(yuǎn)不會(huì)返回,因此 rex_task_preamble()在調(diào)用了任務(wù)函數(shù)之后,會(huì)調(diào)用rex_kill_task(),這樣的話一旦任務(wù)異常返回,貝U該任務(wù)會(huì)被REX終止。3.1.1調(diào)度任務(wù)的調(diào)度由函數(shù)實(shí)現(xiàn),調(diào)度函數(shù)為REX保留的內(nèi)部函數(shù),不能被應(yīng)用程序直接調(diào)用。調(diào)用該函數(shù)時(shí)必須禁止中斷,調(diào)用函數(shù)rex_sched()之前必須先設(shè)置全局變量rex_best_task并將該變量指向優(yōu)先級(jí)最高的就緒任務(wù)的TCB。調(diào)度算法的基本規(guī)貝為:調(diào)度器檢查rex_best_task是否指向當(dāng)前正運(yùn)行的任務(wù)rex_curr_task。如果rex_best_task與rex_curr_task相同,則調(diào)度器直接返回。如果rex_best_task與rex_curr_task不同,將rex_best_task的值賦給rex_curr_task,然后調(diào)度器檢查是否在中斷服務(wù)程序,如果在中斷服務(wù)程序,則調(diào)度器返回。如果系統(tǒng)未在中斷服務(wù),則調(diào)度器開(kāi)始執(zhí)行設(shè)備環(huán)境切換,將當(dāng)前的設(shè)備環(huán)境入棧,棧頂指針存入當(dāng)前運(yùn)行任務(wù)的TCB,并從rex_curr_task指向的任務(wù)的TCB中恢復(fù)堆棧指針,再?gòu)亩褩V谢謴?fù)設(shè)備環(huán)境。3.1.2ARM平臺(tái)上任務(wù)的特殊性ARM是一款32位微處理器,具有線性地址空間,因此堆棧指針僅占用TCB的一個(gè)字段:sp。設(shè)備環(huán)境數(shù)據(jù)結(jié)構(gòu)設(shè)備環(huán)境包括rO-r12,lr,pc,CPSR寄存器,圖3-1表示了一個(gè)掛起任務(wù)的堆棧狀態(tài)。程序狀態(tài)寄存器CPSR 嗎 棧頂(保存于TCB中)rO-r12 連接寄存器lr返回地址 應(yīng)用程序堆棧數(shù)據(jù)圖3-1ARM系統(tǒng)中休眠態(tài)的任務(wù)堆棧示例由于rex_sched()運(yùn)行時(shí)中斷被禁止,在ARM處理器上,設(shè)備環(huán)境的保存與恢復(fù)必須由rex_sched()自己處理。程序狀態(tài)寄存器保存的是函數(shù)入口時(shí)的CPSR值,因此設(shè)備環(huán)境保存了中斷狀態(tài)。保存設(shè)備環(huán)境需進(jìn)行如下操作:從rex_curr_task指向的任務(wù)TCB中取出堆棧指針。將已保存的PSR值考入SPSR寄存器。帶人后綴調(diào)用ldmfd指令■裝載rO-r12,lr,pc切換到Thumb模式返回到任務(wù)注:為保證同時(shí)恢復(fù)PC和CPSR,調(diào)用ldmfd指令一定要記得使用八后綴。第四章中斷處理本章敘述了REX在進(jìn)入中斷和退出中斷時(shí)所進(jìn)行的操作。ARM有兩級(jí)中斷,F(xiàn)IQ和IRQ,本章只討論IRQ,因?yàn)镕IQ中斷處理期間不需要進(jìn)行設(shè)備環(huán)境切換,所以FIQ非常簡(jiǎn)單。當(dāng)產(chǎn)生中斷時(shí),采用ARM匯編語(yǔ)言實(shí)現(xiàn)的函數(shù)iRQ_Handler()取得控制權(quán),根據(jù)異常事件中斷向量表調(diào)用相應(yīng)的中斷服務(wù)處理°rex_set_interrupt_vector()用來(lái)加載中斷向量(該函數(shù)的詳細(xì)說(shuō)明見(jiàn)第八章7.19節(jié))。產(chǎn)生中斷時(shí),ARM處理器切換到IRQ模式,使用IRQ寄存器區(qū),將控制權(quán)交給iRQ_Handler(),由其進(jìn)行以下操作:中斷服務(wù)程序要使用的寄存器入棧,如果函數(shù)是由C語(yǔ)言編寫(xiě),則受保護(hù)的寄存器包括:r0-r3,r10,r12,r14,如果中斷嵌套,還要保護(hù)SPSR。中斷嵌套計(jì)數(shù)加一。切換回系統(tǒng)模式,并保存系統(tǒng)模式的lr寄存器,因?yàn)樵摷拇嫫髟诤竺娴奶幚碇幸褂谩U{(diào)用中斷向量表注冊(cè)了的中斷服務(wù)處理程序。中斷服務(wù)處理完畢返回后,恢復(fù)lr寄存器,工作模式切換回IRQ模式。中斷嵌套計(jì)數(shù)減一。如果嵌套計(jì)數(shù)減為0,并且rex_best_task不等于rex_curr_task時(shí),需要進(jìn)行任務(wù)切換。如需要任務(wù)切換,作如下處理:從IRQ的堆?;謴?fù)SPSR及其它保護(hù)的寄存器。切換到超級(jí)用戶模式。在當(dāng)前任務(wù)的堆棧中保存其設(shè)備環(huán)境將超級(jí)用戶模式的堆棧指針保存至任務(wù)的TCB中。rex_best_task的值賦給rex_curr_task。恢復(fù)rex_curr_task的設(shè)備環(huán)境。如果不需要任務(wù)切換,則從IRQ堆棧中恢復(fù)SPSR及其它受保護(hù)的寄存器,切換回超級(jí)用戶模式。注:某些版本的iRQ_Handler不切換回系統(tǒng)模式處理中斷,他們不支持中斷嵌套,因此也不管理中斷嵌套。這種機(jī)制通過(guò)中斷時(shí)的任務(wù)切換實(shí)現(xiàn)了強(qiáng)占式多任務(wù),在中斷到來(lái)時(shí),既是當(dāng)前任務(wù)正在運(yùn)行,也會(huì)切換到更高優(yōu)先級(jí)的就緒任務(wù)。第五章信號(hào)量和定時(shí)器REX使用信號(hào)量和定時(shí)器來(lái)實(shí)現(xiàn)任務(wù)間的同步機(jī)制及內(nèi)部定時(shí)。5.1信號(hào)量REX為任務(wù)間通訊提供了信號(hào)量機(jī)制,信號(hào)量集與每個(gè)任務(wù)都關(guān)聯(lián),這樣任何一個(gè)任務(wù)都可以通過(guò)rex_get_sigs(),rex_set_sigs()和rex_clr_sigs()函數(shù)讀取、置位、清除任何其它任務(wù)使用的信號(hào)量。任務(wù)可以調(diào)用rex_wait()函數(shù)來(lái)設(shè)置自己所等待的信號(hào)量子集,但不能等待別的任務(wù)的信號(hào)量。使用或操作可以設(shè)置等待多個(gè)信號(hào)量,任意信號(hào)量有效即可喚醒該任務(wù)。如果任務(wù)要等待的信號(hào)亮已經(jīng)被置位則等待函數(shù)立即返回而不會(huì)掛起任務(wù)。信號(hào)量值為一整形變量,ARM處理器支持32位整形變量,因此一個(gè)任務(wù)可以同時(shí)設(shè)置32個(gè)信號(hào)量。5.2定時(shí)器通過(guò)調(diào)用rex_def_timer()函數(shù)可以定義一個(gè)定時(shí)器,任務(wù)可以使用定時(shí)期來(lái)獲得需要的時(shí)間間隔。函數(shù)rex_set_timer()啟動(dòng)定時(shí)器。函數(shù)rex_pause_timer()暫停定時(shí)器。函數(shù)rex_resume_timer()重啟定時(shí)器。任務(wù)如果需要一個(gè)延時(shí),可以調(diào)用rex_timed_wait()函數(shù),然后等待超時(shí)信號(hào)量。定時(shí)時(shí)間到了定時(shí)器會(huì)設(shè)置信號(hào)量通知任務(wù)。注:需要注意任務(wù)必須設(shè)置為等待一個(gè)定時(shí)器信號(hào)量的超集,這一點(diǎn)非常重要,因?yàn)槎〞r(shí)器通常已經(jīng)在程序一開(kāi)始就初始化過(guò)了,這時(shí)它的信號(hào)量屬性已經(jīng)確定。如果沒(méi)有注意這一點(diǎn),當(dāng)一個(gè)任務(wù)調(diào)用rex_timed_wait()時(shí)所指定的信號(hào)量如果未包含在定時(shí)器的信號(hào)量集里,任務(wù)將捕獲不到任何信號(hào)量。時(shí)間的單位以毫秒計(jì),最小計(jì)時(shí)單位為1毫秒。定時(shí)的精度與硬件平臺(tái)有關(guān),為每毫秒時(shí)鐘嘀嗒中斷的次數(shù)。定時(shí)通過(guò)在每個(gè)時(shí)鐘嘀嗒中斷服務(wù)程序里調(diào)用rex_tick()來(lái)實(shí)現(xiàn),需要定時(shí)多少毫秒,就相應(yīng)調(diào)用多少次,定時(shí)結(jié)束后,將信號(hào)量寫(xiě)入等待定時(shí)任務(wù)的TCB中。REX負(fù)責(zé)維護(hù)所有未結(jié)束的定時(shí)器列表,一旦定時(shí)時(shí)間到,將從列表中刪除該定時(shí)器,不過(guò)REX并不知道定時(shí)器的數(shù)據(jù)結(jié)構(gòu),因此,為定時(shí)器數(shù)據(jù)結(jié)構(gòu)申請(qǐng)空間并維護(hù)由任務(wù)來(lái)完成。注:對(duì)調(diào)用rex_def_timer()函數(shù)的次數(shù)沒(méi)有限制,但是不能對(duì)已有的定時(shí)器調(diào)用該函數(shù),否則會(huì)破壞定時(shí)器列表,對(duì)任務(wù)來(lái)講是致命錯(cuò)誤。第六章REX內(nèi)幕本章描述了一些REX內(nèi)部的數(shù)據(jù)結(jié)構(gòu)及變量,雖然這些數(shù)據(jù)可以訪問(wèn)到,但是它們不應(yīng)該被應(yīng)用程序直接操作,了解這一點(diǎn)有助于查找程序的問(wèn)題。6.1任務(wù)控制塊每一個(gè)任務(wù)都有一個(gè)任務(wù)控制塊來(lái)保存任務(wù)的設(shè)備環(huán)境。我們比較感興趣的字段包括:sp——堆棧指針,指示掛起的任務(wù)堆棧的棧頂位置。stack_limit 指示任務(wù)的堆棧大小,堆棧指針不能小于這一值。sigs——保存任務(wù)當(dāng)前設(shè)置的信號(hào)量集。wait——保存任務(wù)正在等待的信號(hào)量,如果該值不為零則表明任務(wù)處于掛起,如果該值為零則表明任務(wù)已經(jīng)就緒或正在運(yùn)行。pri——任務(wù)的優(yōu)先級(jí)6.2當(dāng)前任務(wù)全局指針變量rex_curr_task指向當(dāng)前正在運(yùn)行任務(wù)的TCB。6.3優(yōu)選任務(wù)全局指針變量rex_best_task指向優(yōu)先級(jí)最高就緒任務(wù)的TCB。6.4任務(wù)列表所有任務(wù)的TCB都按優(yōu)先級(jí)排隊(duì)保存在隊(duì)列中,該隊(duì)列為雙向鏈表結(jié)構(gòu),next_ptr和prev_ptr分別指向下一個(gè)和前一個(gè)數(shù)據(jù)。全局結(jié)構(gòu)變量rex_task_list作為隊(duì)首,它的next_ptr指針指向系統(tǒng)中的最高優(yōu)先級(jí)任務(wù)(無(wú)論該任務(wù)是否就緒)。通過(guò)前向遍歷該隊(duì)列,查找TCB中wait字段為0的任務(wù)即可找到最高優(yōu)先級(jí)的就緒任務(wù),空閑任務(wù)以優(yōu)先級(jí)0排在隊(duì)尾,并且該任務(wù)總是處于就緒態(tài),因此可以保證遍歷總是能完成。注:優(yōu)先級(jí)0被保留,用戶任務(wù)不能占用該優(yōu)先級(jí)。第七章API參考本章列出了REX提供的API參考,由于REX不對(duì)函數(shù)的入口參數(shù)作檢驗(yàn),因此程序員在調(diào)用這些API時(shí)必須符合接口規(guī)范。系統(tǒng)提供了如下函數(shù):rex_init()rex_def_task()rex_set_sigs()rex_clr_sigs()rex_get_sigs()rex_wait()rex_def_timer()rex_set_timer()rex_get_timer()rex_clr_timer()rex_pause_timer()rex_resume_timer()rex_tick()rex_timed_wait()rex_self()rex_get_pri()rex_set_pri()rex_task_pri()rex_set_interrupt_vector()rex_enable_interrupt()rex_disable_interrupt()rex_init_crit_sect()rex_enter_crit_sect()rex_leave_crit_sect()7.1rex_init()原形:externvoidrex_init(void*rex_stack_word_typerex_tcb_typevoid*rex_stack_word_typerex_priority_typevoiddword);7.1rex_init()原形:externvoidrex_init(void*rex_stack_word_typerex_tcb_typevoid*rex_stack_word_typerex_priority_typevoiddword);描述:p_istack,p_istksiz,*p_tcb,p_stack,p_stksiz,p_pri,/*interruptstack*//*interruptstacksize*//*taskcontrolblock*//*stack*//*stacksize*//*taskpriority*/(*p_task)(dword),/*taskfunction*/p_param /*taskparameter*/函數(shù)rex_init()初始化REX,必須在上電后首先調(diào)用該函數(shù),并且只能調(diào)用一次,之后才允許調(diào)用其它API。只有調(diào)用該函數(shù)后中斷才被允許。功能:創(chuàng)建第一個(gè)用戶堆棧p_task,并作如下處理堆棧大小為p_istksiz優(yōu)先級(jí)為p_prip_tcb作為任務(wù)的TCB調(diào)用調(diào)度器,將控制權(quán)交給創(chuàng)建的任務(wù)。前兩個(gè)參數(shù)p_istack和p_istksiz是為了與以前的版本兼容,以后的版本不再使用這兩個(gè)參數(shù)。副作用:

無(wú)返回值:該函數(shù)不返回。用法:bytes*/bytes*/non-zerouniquevalue*/valueunderstoodbythenewtask*/TOC\o"1-5"\h\z#defineFIRST_STACK_SIZE 512 /* 1024#defineFIRST_TASK_PRI 200 /* Some#defineFIRST_TASK_PARAM 101 /* Somerex_tcb_typefirst_task_tcb;voidfirst_task(dwordp){voidfirst_task(dwordp){/**Thisisthefirsttaskinthesystem.*WhencontrolcomesherephasbeensettoFIRST_TASK_PARAMbyREX-thisfunctionisnotsupposedtoreturn.*/first_task_stackisinuse11-thisfunctionisnotsupposedtoreturn.*/上電初始化期間:rex_init(NULL,0,&first_task_tcb,first_task_stack,FIRST_STACK_SIZE*sizeof(int)/sizeof(word),FIRST_TASK_PRI,first_task,FIRST_TASK_PARAM);rex_def_task()validTCBfornewtask*/stackfornewtask*/stacksizefornewtask*/priorityfornewtask*/taskstartupfunction*/parameterfornewtask*/原形:validTCBfornewtask*/stackfornewtask*/stacksizefornewtask*/priorityfornewtask*/taskstartupfunction*/parameterfornewtask*/TOC\o"1-5"\h\zrex_tcb_type *p_tcb, /*void* p_stack, /*rex_stack_word_typpe_stksiz, /*rex_priority_typep_pri, /*void (*p_task)(dword),/*dword p_param /*);描述:函數(shù)rex_def_task創(chuàng)建一個(gè)新任務(wù),由p_tcb所指向的數(shù)據(jù)作為新任務(wù)的TCB,內(nèi)存的分配由調(diào)用函數(shù)負(fù)責(zé)。功能:新任務(wù)的設(shè)備環(huán)境為:任務(wù)的私有堆棧,棧底為p_stack,??臻g為p_stksiz字(字長(zhǎng)16bit)任務(wù)優(yōu)先級(jí)為p_pri,入口地址p_task,入口參數(shù)p_param在第一次運(yùn)行任務(wù)時(shí)傳遞給任務(wù)函數(shù),REX不處理該數(shù)據(jù),用戶可根據(jù)需要定義入口參數(shù)的用處。REX定義了新任務(wù)后,立刻調(diào)用調(diào)度器,但是并不能保證新建的任務(wù)會(huì)立即獲得控制權(quán),仍然要視新任務(wù)的優(yōu)先級(jí)相對(duì)于就緒任務(wù)是否為最高,新建任務(wù)為就緒態(tài)。副作用:調(diào)用本函數(shù)會(huì)引起一次任務(wù)調(diào)度。

返回值:無(wú)用法:bytes*/bytes*/non-zerouniquevalue*/valueunderstoodbythenewtask*/TOC\o"1-5"\h\z#defineNEW_STACK_SIZE512 /* 1024#defineNEW_TASK_PRI200 /* Some#defineNEW_TASK_PARAM101 /* Somerex_tcb_typenew_task_tcb;intnew_task_stack[NEW_STACK_SIZE];voidnew_task(dwordp){*Whencontrolcomeshere*WhencontrolcomesherebyREXreturn.-byREXreturn.-new_task_stackisinuse*/-thisfunctionisnotsupposedto*/voidexisting_task(dwordp){rex_def_task(&new_task_tcb,new_task_stack,NEW_STACK_SIZE*sizeof(int)/sizeof(word),NEW_TASK_PRI,new_task,NEW_TASK_PARAM);}rex_set_sigs()原形:externrex_sigs_typerex_set_sigs(rex_tcb_type*p_tcb,/*TCBforwhichthesigswillbeset*/rex_sigs_typep_sigs/*thesigstoset*/);描述:函數(shù)rex_set_sigs將一個(gè)信號(hào)量p_sigs以掩碼的方式寫(xiě)入p_tcb所指任務(wù)的TCB,p_sigs為位尋址變量,每一位代表特定的信號(hào)量,任務(wù)獲得了其中任何一個(gè)信號(hào)量后,重新作為候選的待執(zhí)行任務(wù)。副作用:調(diào)用本函數(shù)會(huì)引起一次任務(wù)調(diào)度。返回值:返回原始的任務(wù)信號(hào)量。用法:#include“rex.h”#defineNEW_SIGNALS 0x3 /*Somesignals.*/externrex_tcb_type target_task;voidsignal_setting_task(dwordp){rex_sigs_typeold_sigs;old_sigs=rex_set_sigs(&target_task,(rex_sigs_type)NEW_SIGNALS);}rex_clr_sigs()原形:externrex_sigs_typerex_clr_sigs(rex_tcb_type*p_tcb, /*TCBforwhichthesignalswillbecleared*/rex_sigs_typep_sigs /*whichsignalstoclear*/);描述:函數(shù)rex_clr_sigs清除p_tcb指向任務(wù)的信號(hào)量,不調(diào)用調(diào)度器。返回值:返回原始的任務(wù)信號(hào)量。用法:#include“rex.h”#defineCLEAR_THESE0x30 /*Somesignals.*/externrex_tcb_typetarget_task;voidsignal_clearing_task(dwordp){rex_sigs_typeold_sigs;old_sigs=rex_clr_sigs(&target_task,(rex_sigs_type)CLEAR_THESE);}rex_get_sigs()原形:externrex_sigs_typerex_get_sigs(rex_tcb_typ*ep_tcb/*TCBforwhichsigswillbereturned*/);描述:函數(shù)rex_get_sigs讀取p_tcb指向的任務(wù)的信號(hào)量。返回值:返回原始的任務(wù)信號(hào)量。用法:#include“rex.h”externrex_tcb_typetarget_task;voidsignal_reading_task(dwordp){rex_sigs_typepresent_sigs;present_sigs=rex_get_sigs(&target_task);}rex_wait()原形:externrex_sigs_typerex_wait(rex_sigs_typep_sigs/*signalstowaiton*/);描述:函數(shù)rex_wait掛起調(diào)用它的任務(wù),p_sigs掩碼寫(xiě)入TCB的信號(hào)量字段,任務(wù)直到等待的信號(hào)量被設(shè)置后,恢復(fù)就緒態(tài)。如果調(diào)用rex_wait時(shí)等待的信號(hào)量已被設(shè)置,則函數(shù)立即返回,任務(wù)能夠繼續(xù)進(jìn)行。任務(wù)只能等待自己的信號(hào),不能等待其他任務(wù)的信號(hào)。副作用:調(diào)用本函數(shù)會(huì)引起一次任務(wù)調(diào)度。返回值:返回原始的任務(wù)信號(hào)量。

用法:#include“rex.h”#defineWAIT_FOR_THESE0x50/*Somesignals.*/voidwanting_to_wait_task(dwordp){rex_sigs_typegot_these_sigs;got_these_sigs=rex_wait((rex_sigs_type)WAIT_FOR_THESE);}rex_def_timer()原形:/*pointertoavalidtimerstructure/*pointertoavalidtimerstructure*//*TCBtoassociatewiththetimer*//*sigstosetupontimerexpiration*/rex_tcb_type *tcb_ptr,rex_sigs_type sigs);描述:函數(shù)rex_def_timer初始化一個(gè)定時(shí)器,用于實(shí)現(xiàn)一個(gè)指定時(shí)間的延遲。定時(shí)時(shí)間到后,tcb_ptr指向的任務(wù)將獲得通知。定時(shí)時(shí)間到后設(shè)置信號(hào)量為sigs。REX默認(rèn)為定時(shí)器運(yùn)行所用內(nèi)存空間由調(diào)用函數(shù)分配。本函數(shù)至少需調(diào)用一次定時(shí)器才可用,但不能對(duì)正在計(jì)時(shí)的定時(shí)器調(diào)用該函數(shù)。返回值:用法:#include“rex.h”#defineSET_THESE0x12externrex_tcb_typerex_timer_typetarget_task;new_timer;/*Somesignals.*/voidtimer_defining_task(dwordp)#defineSET_THESE0x12externrex_tcb_typerex_timer_typetarget_task;new_timer;/*Somesignals.*/voidtimer_defining_task(dwordp)rex_def_timer(&new_timer,&target_task,(rex_sigs_type)SET_THESE)}rex_set_timer()原形:externrex_timer_cnt_typerex_set_timer(rex_timer_type *p_timer, /*pointertotimertoset*/rex_timer_cnt_typemsecs /*valueinmilliseconds*/);描述:函數(shù)rex_set_timer啟動(dòng)由p_time所指的定時(shí)器,定時(shí)長(zhǎng)度為msecs的毫秒數(shù)。該定時(shí)器對(duì)應(yīng)的信號(hào)量在調(diào)用本函數(shù)時(shí)清零,定時(shí)結(jié)束后重新置位。由p_time所指的定時(shí)器必須事先用rex_def_timer函數(shù)進(jìn)彳丁初始化,如果該定時(shí)器已在運(yùn)行,則會(huì)按新的時(shí)間重新開(kāi)始計(jì)時(shí)。副作用:調(diào)用本函數(shù)會(huì)引起一次任務(wù)調(diào)度。返回值:返回定時(shí)器寫(xiě)入新值前的定時(shí)計(jì)數(shù)值。用法:#include“rex.h”#definetimer_value20 /*20-millisecondtimer*/externrex_timer_typeexisting_timer;voidtimer_setting_task(dwordp){rex_timer_cnt_typeold_timer_count;old_timer_count=rex_set_timer(&existing_timer,TIMER_VALUE);}rex_get_timer()原形:externrex_timer_cnt_typerex_get_timer(rex_timer_type*p_timer/*pointertothetimertoget*/);描述:函數(shù)rex_get_timer返回*p_timer指向的定時(shí)器當(dāng)前計(jì)數(shù)值,如返回值為0,表示該定時(shí)器未啟動(dòng)。返回值:返回定時(shí)器當(dāng)前計(jì)數(shù)值。用法:#include“rex.h”externrex_timer_typeexisting_timer;voidtimer_reading_task(dwordp){rex_timer_cnt_typetimer_count;timer_count=rex_get_timer(&existing_timer);}rex_clr_timer()原形:externrex_timer_cnt_typerex_clr_timer(rex_timer_type*p_timer /*pointertotimertoclear*/);描述:函數(shù)rex_clr_timer將由*p_timer指向的定時(shí)器定時(shí)值清零,同時(shí)該定時(shí)器被停止并從活動(dòng)定時(shí)器列表中移出。返回值:返回定時(shí)器當(dāng)前計(jì)數(shù)值。用法:#include“rex.h”externrex_timer_typeexisting_timer;voidtimer_clearing_task(dwordp){rex_timer_cnt_typeold_timer_count;old_timer_count=rex_clr_timer(&existing_timer);}rex_pause_timer()原形:externvoidrex_pause_timer(rex_timer_type*p_timer /*pointertotimertopause*/);描述:函數(shù)rex_pause_timer將由*p_timer指向的定時(shí)器從活動(dòng)定時(shí)器列表中移出,暫停該定時(shí)器。該函數(shù)與rex_clr_timer不同,前者不會(huì)將計(jì)數(shù)值清零。返回值:無(wú)用法:#include“rex.h”Externrex_timer_typeexisting_timer;voidtimer_pausing_task(dwordp){rex_pause_timer(&existing_timer);}rex_resume_timer()原形:externvoidrex_resume_timer(rex_timer_type*p_timer/*pointertotimertoresume*/);描述:函數(shù)rex_resume_timer將暫停的定時(shí)器加入到活動(dòng)定時(shí)器列表中以恢復(fù)該定時(shí)器的運(yùn)行。該函數(shù)與rex_set_timer不同,前者未明確給出定時(shí)長(zhǎng)度,定時(shí)器將使用其原有值。返回值:無(wú)用法:#include“rex.h”Externrex_timer_typepaused_timer;voidtimer_resuming_task(dwordp){rex_resume_timer(&paused_timer);}rex_tick()原形:externvoidrex_tick(rex_timer_cnt_typemsecs /*numberofmillisecondselapsed*/);描述:函數(shù)rex_tick不是供應(yīng)用程序的任務(wù)使用,它有每次時(shí)鐘嘀嗒中斷服務(wù)函數(shù)在每次中斷時(shí)進(jìn)行調(diào)用,參數(shù)msecs指定每個(gè)時(shí)鐘嘀嗒間隔的毫秒數(shù),與硬件相關(guān)。副作用:調(diào)用本函數(shù)會(huì)引起一次任務(wù)調(diào)度。返回值:無(wú)用法:#include“rex.h”#defineMS_PER_CLK_INTERRUPT5voidclock_tick_isr(){rex_tick(MS_PER_CLK_INTERRUPT);}rex_timed_wait()原形:externrex_timer_cnt_typerex_timed_wait(rex_sigs_type p_sigs, /* sigstowaiton*/rex_timer_type *p_timer, /* timertosetandwait on*/rex_timer_cnt_type p_cnt /* timertowait*/

);描述:函數(shù)rex_timed_wait的功能與一下操作相似:rex_set_timer(p_timer,p_cnt);returnrex_wait(p_sigs);調(diào)用該函數(shù)的任務(wù)在收到其他任務(wù)設(shè)置的信號(hào)量或定時(shí)時(shí)間到后,進(jìn)入就緒態(tài)。副作用:調(diào)用本函數(shù)會(huì)引起一次任務(wù)調(diào)度。返回值:調(diào)用該函數(shù)的任務(wù)所等待的信號(hào)量子集被覆蓋。用法:返回值:調(diào)用該函數(shù)的任務(wù)所等待的信號(hào)量子集被覆蓋。用法:#include#define#defineExtern“rex.h”TIMER_VALUEWAIT_FOR_THESErex_timer_type/*20-millisecondtimer*//*Somesignals.*/200x30existing_timer;voidtimed_waiting_task(dwordp){rex_sigs_typegot_these_sigs;got_these_sigs=rex_timed_wait((rex_sigs_type)WAIT_FOR_THESE),&existing_timer,TIMER_VALUE);rex_self()原形:externrex_tcb_type*rex_self(void);描述:函數(shù)rex_self返回調(diào)用它的任務(wù)的自身的TCB,任務(wù)通過(guò)調(diào)用該函數(shù)獲得自身TCB的地址。返回值:指向調(diào)用任務(wù)的TCB的指針。用法:#include“rex.h”voiddont_know_my_own_name_task(dwordp){rex_tcb_type*my_tcb;my_tcb=rex_self();}rex_get_pri()原形:externrex_priority_typerex_get_pri(void);描述:函數(shù)rex_get_pri返回調(diào)用它的任務(wù)的當(dāng)前優(yōu)先級(jí)。返回值:調(diào)用任務(wù)的當(dāng)前優(yōu)先級(jí)。用法:#include“rex.h”Voiddont_know_my_priority_task(dwordp){rex_priority_typemy_priority;my_priority=rex_get_pri();rex_set_pri()原形:externrex_priority_typerex_set_pri(rex_priority_typep_pri/*thenewpriority*/);描述:函數(shù)rex_set_pri的功能是將調(diào)它的其任務(wù)自身優(yōu)先級(jí)修改為p_pri。返回值:調(diào)用任務(wù)的原優(yōu)先級(jí)。用法:#include“rex.h”voidnice_task(dwordp){rex_priority_typeold_priority/*Iamnice.Ireducemypriorityby10.*/old_priority=rex_set_pri(rex_get_p1i()}rex_task_pri()原形:externrex_priority_typerex_task_pri(rex_tcb_type *p_tcb, /*TCBtosetpriorityon*/rex_priority_type p_pri /*thenewpriority*/);描述:函數(shù)rex_task_pri設(shè)置*p_tcb所指任務(wù)的優(yōu)先級(jí)為p_pri。副作用:調(diào)用本函數(shù)會(huì)引起一次任務(wù)調(diào)度。返回值:*p_tcb所指任務(wù)的原優(yōu)先級(jí)用法:#include“rex.h”Externrex_tcb_typesome_other_task;voidextremely_nice_task(dwordp){rex_priority_typeold_priority;/*Iamxetremelynice.Isetthistask'sprioritytoa1000*abovemyownpriority.*/old_priority=rex_task_pri(&some_other_task,rex_get_pri()+1000);}rex_set_interrupt_vector()原形:voidrex_set_interrupt_vector(rex_vect_typev,void(*fnc_p

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論