版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
Real-TimeExecutive(REX)吏用手冊▲第一章序言1.1目的本文描述了基于ARM平臺的Real-TimeExecutive(REX)操作系統(tǒng)特性及使用方法。REX是專為小型嵌入式系統(tǒng)設計的簡單高效的搶占式多任務實時操作系統(tǒng)(RTOS)。該系統(tǒng)最初是為Intel80186處理器設計的,隨后被移植到ARM處理器。本文提供了REX的指南,第7章為編程參考。1.2適用范圍本手冊適用于需要在REX系統(tǒng)上編寫應用程序的讀者。1.3內(nèi)容組織本文按以下結(jié)構(gòu)編寫:■第2章REX概述■第3-6章REX的詳細敘述及內(nèi)部工作機制■第7章編程指南1.4字形習慣函數(shù)聲明,函數(shù)名,類型聲明,示例代碼使用特殊的字體,例如:#inelude程序變量用尖括號包圍,例如<number>1.5版本歷史版本日期說明1999年1月初始版本Rev.A1999年3月內(nèi)容更新Rev.B2001年6月刪除了與80186有關的部分,更新了REX的API,更新了中斷處理的章節(jié)Rev.C2001年9月刪除了成型信息1.6參考資料1REXPortationGuide80-24880-1X11999年3月2REX++REXExtensionsUsersGuide80-V3083-1X12001年4月1.7技術支持如需要求了解本文未詳細說明的信息可通過高通的CDMA技術支持郵箱聯(lián)系:asicapps@。asicapps@。1.8術語及習慣用語本文使用以下術語及習慣用語APCSARM調(diào)用規(guī)范。為了支持不同廠家編譯系統(tǒng)及匯編語言混合編程,ARM規(guī)定了程序調(diào)用的入口、出口處理及寄存器的使用規(guī)范。APIARM應用程序接口。AdvancedRISCMachinesLimited,ARM系列處理器制造商,通常也指ARM系列微處理器。ARM7TDMICPSRARM7系列處理器中的一款。當前程序狀態(tài)寄存器,該寄存器保存了旗語,中斷控制位和處理器當前操作模式。criticalsection臨界區(qū),代碼中訪問共享資源的部分。
FIQ快速中斷,由ARM支持的中斷之一,F(xiàn)IQ中斷服務程序正在進行時也可用來標志處理器工作模式。IRQ普通中斷,由ARM支持的中斷之一,IRQ中斷服務程序正在進行時也可用來標志處理器工作模式。ISRIdleTask中斷服務程序,也稱為interrupttrampolinefunction。操作系統(tǒng)中的優(yōu)先級最低的任務,空閑任務的優(yōu)先級為0,為一個空等待循環(huán),只能由中斷搶奪其CPU控制權(quán)。PCPSRREXRTOSSPSR程序當前指令寄存器程序狀態(tài)寄存器高通的實時操作系統(tǒng)實時操作系統(tǒng)受保護的程序狀態(tài)寄存器,每一個處理器模式提供一個SPSR用以保存處理器切換到其它模式前的CPSR。TCBtimerblocktrampolinefunction任務控制塊,REX內(nèi)部的數(shù)據(jù)結(jié)構(gòu),用于存放任務的信息。定時器的別名。REX之外的中斷服務函數(shù),同ISR。第二章REX概述REX是一個搶先的多任務實時操作系統(tǒng),為任務的控制,同步,互斥,定時和中斷控制提供了相應的API,所有的函數(shù)在調(diào)用它們的任務提供的設備環(huán)境下運行。2.1任務REX將每個任務視為獨立的實體句柄,有獨享的堆棧和優(yōu)先級并共同組成任務的設備環(huán)境,每個任務有一組數(shù)據(jù)組成的結(jié)構(gòu),稱為任務控制塊(TCB),REX通過任務控制塊記錄任務運行的設備環(huán)境。REX運行期間允許在任何時候動態(tài)創(chuàng)建任意數(shù)量的任務,盡管更多的任務造成了遍歷任務鏈表的時間延長,但新增任務對REX性能造成的損失是微乎其微的。不過仍要注意盡量使任務的數(shù)量保持最小。REX所能負擔的任務最終取決于處理器種類,時鐘速率以及特定應用下的中斷響應指標。2.2堆棧前一節(jié)提到過每個任務有獨立的堆??臻g,任務處于運行狀態(tài)時,該堆棧被激活,當任務掛起時,任務的設備環(huán)境被保存于堆棧頂部,堆棧指針則存放于該任務的TCB中。任務可能由于阻塞,等待信號量,等待中斷服務而掛起。如果任務被重新激活到運行狀態(tài),調(diào)度程序從TCB中恢復堆棧指針,任務的設備環(huán)境就可從堆棧中彈出,任務即可恢復運行。任務調(diào)度處理對于任務來講是透明的。2.3優(yōu)先級和調(diào)度每一個任務都有一個優(yōu)先級,優(yōu)先級存放于任務的TCB中,優(yōu)先級可以是任何的非零的32位數(shù),數(shù)值越小則優(yōu)先級越低,REX占用了優(yōu)先級0用于空閑任務,舊版本的REX要求每個任務獨占優(yōu)先級,新的版本已經(jīng)沒有這個限制了。REX的調(diào)度策略為放行優(yōu)先級最高的就緒態(tài)任務,即激活不等待任何事件的最高優(yōu)先級任務。如果滿足條件的同優(yōu)先級任務不只一個,則REX會任選其中的一個任務。被激活的任務會一直運行到主動掛起或中斷程序使另一個更高優(yōu)先級的任務恢復運行。一個任務等待的事件到達后,該任務進入就緒態(tài),如果所有的任務都處于掛起狀態(tài),則空閑任務被激活。REX支持任務動態(tài)修改優(yōu)先級,一個任務可以提升或降低自己或其他任務的優(yōu)先級。2.4中斷REX為搶占式內(nèi)核,當中斷返回時,控制會交給優(yōu)先級最高的就緒任務而不是被中斷的任務。2.5互斥當兩個任務需要共享一個資源時,需要有一個訪問互斥機制,訪問共享資源部分的代碼成為臨界區(qū)。通過關中斷可以簡單的實現(xiàn)臨界區(qū),REX還提供一種不太徹底的方式,導出函數(shù)可用于鎖定或釋放公共資源。2.6禁用中斷后的掛起只有正在運行的任務可以禁止中斷,一旦某個任務禁止中斷后掛起,中斷狀態(tài)則一直由該任務保存,任務重新激活后可以恢復中斷狀態(tài)。有一種潛在的危險是中斷被下一個激活的任務允許,這一特性在以后的版本中可能被修改,但是程序員不能依賴這一點。2.7信號量通用信號量集與每一個任務關聯(lián),這些信號量集作為相關任務的設備環(huán)境保存在任務的TCB里,用來表示與任務有關的某類事件發(fā)生了。一個任務的信號量可以被所有任務及中斷服務程序設置或清除。關于信號量需要注意的重點:信號量是通用旗語,用戶可以任意定義信號量的含義。一個任務可以通過其他任務或中斷任意設置一個特定的信號量掛起,需要強調(diào)的是任意,如果一個任務并沒有因該信號量掛起,則設置的信號量不會對該任務的運行狀態(tài)產(chǎn)生影響。2.8定時器定時器用來確定某個時間間隔,任務通過定時器來實現(xiàn)一段延時,延時時間到了以后會有一個信號量時標,任務可以查詢該時標,或者任務可以掛起自己等待該信號量時標。定時器可以和其他事件聯(lián)合使用,這樣就可以確定事件是否超時。REX通過維護定時器鏈表的方式管理所有正在計時的定時器。對定時器的數(shù)量沒有限制,定時器越多則每次遍歷鏈表耗時越長,但是新增一個定時器對性能的影響是微弱的。已經(jīng)到期的計數(shù)器不會產(chǎn)生管理開銷。2.9擴展接口REX提供了一些擴展接口以增強可操作性,例如異步進程調(diào)用,延遲進程調(diào)用,內(nèi)存管理。詳情參考REX++—REX擴展用戶使用手冊(80-V3083-1)。第三章任務本章詳細描述了REX的調(diào)度及設備環(huán)境調(diào)度機制。3.1任務的創(chuàng)建創(chuàng)建新任務使用REX提供的函數(shù)rex_def_task()°REX并不為任務堆棧和TCB分配空間。這一工作由調(diào)用創(chuàng)建任務函數(shù)的程序負責。不過REX要求避免用戶直接操作TCB的數(shù)據(jù)結(jié)構(gòu)。任務創(chuàng)建函數(shù)rex_def_task()完成以下工作:將設備環(huán)境數(shù)據(jù)入棧設置TCB將要創(chuàng)建的任務加入任務列表調(diào)度處理如果新建任務優(yōu)先級高于當前任務,則新任務取得控制權(quán),否則,調(diào)度直接返回而不發(fā)生任務切換。新建的任務直到成為優(yōu)先級最高的就緒任務時開始執(zhí)行。任務的入口由rex_def_task()指定為rex_task_preamble(),任務在第一次獲得控制權(quán)時初始化堆棧。任務永遠不會返回,因此 rex_task_preamble()在調(diào)用了任務函數(shù)之后,會調(diào)用rex_kill_task(),這樣的話一旦任務異常返回,貝U該任務會被REX終止。3.1.1調(diào)度任務的調(diào)度由函數(shù)實現(xiàn),調(diào)度函數(shù)為REX保留的內(nèi)部函數(shù),不能被應用程序直接調(diào)用。調(diào)用該函數(shù)時必須禁止中斷,調(diào)用函數(shù)rex_sched()之前必須先設置全局變量rex_best_task并將該變量指向優(yōu)先級最高的就緒任務的TCB。調(diào)度算法的基本規(guī)貝為:調(diào)度器檢查rex_best_task是否指向當前正運行的任務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)度器檢查是否在中斷服務程序,如果在中斷服務程序,則調(diào)度器返回。如果系統(tǒng)未在中斷服務,則調(diào)度器開始執(zhí)行設備環(huán)境切換,將當前的設備環(huán)境入棧,棧頂指針存入當前運行任務的TCB,并從rex_curr_task指向的任務的TCB中恢復堆棧指針,再從堆棧中恢復設備環(huán)境。3.1.2ARM平臺上任務的特殊性ARM是一款32位微處理器,具有線性地址空間,因此堆棧指針僅占用TCB的一個字段:sp。設備環(huán)境數(shù)據(jù)結(jié)構(gòu)設備環(huán)境包括rO-r12,lr,pc,CPSR寄存器,圖3-1表示了一個掛起任務的堆棧狀態(tài)。程序狀態(tài)寄存器CPSR 嗎 棧頂(保存于TCB中)rO-r12 連接寄存器lr返回地址 應用程序堆棧數(shù)據(jù)圖3-1ARM系統(tǒng)中休眠態(tài)的任務堆棧示例由于rex_sched()運行時中斷被禁止,在ARM處理器上,設備環(huán)境的保存與恢復必須由rex_sched()自己處理。程序狀態(tài)寄存器保存的是函數(shù)入口時的CPSR值,因此設備環(huán)境保存了中斷狀態(tài)。保存設備環(huán)境需進行如下操作:從rex_curr_task指向的任務TCB中取出堆棧指針。將已保存的PSR值考入SPSR寄存器。帶人后綴調(diào)用ldmfd指令■裝載rO-r12,lr,pc切換到Thumb模式返回到任務注:為保證同時恢復PC和CPSR,調(diào)用ldmfd指令一定要記得使用八后綴。第四章中斷處理本章敘述了REX在進入中斷和退出中斷時所進行的操作。ARM有兩級中斷,F(xiàn)IQ和IRQ,本章只討論IRQ,因為FIQ中斷處理期間不需要進行設備環(huán)境切換,所以FIQ非常簡單。當產(chǎn)生中斷時,采用ARM匯編語言實現(xiàn)的函數(shù)iRQ_Handler()取得控制權(quán),根據(jù)異常事件中斷向量表調(diào)用相應的中斷服務處理°rex_set_interrupt_vector()用來加載中斷向量(該函數(shù)的詳細說明見第八章7.19節(jié))。產(chǎn)生中斷時,ARM處理器切換到IRQ模式,使用IRQ寄存器區(qū),將控制權(quán)交給iRQ_Handler(),由其進行以下操作:中斷服務程序要使用的寄存器入棧,如果函數(shù)是由C語言編寫,則受保護的寄存器包括:r0-r3,r10,r12,r14,如果中斷嵌套,還要保護SPSR。中斷嵌套計數(shù)加一。切換回系統(tǒng)模式,并保存系統(tǒng)模式的lr寄存器,因為該寄存器在后面的處理中要使用。調(diào)用中斷向量表注冊了的中斷服務處理程序。中斷服務處理完畢返回后,恢復lr寄存器,工作模式切換回IRQ模式。中斷嵌套計數(shù)減一。如果嵌套計數(shù)減為0,并且rex_best_task不等于rex_curr_task時,需要進行任務切換。如需要任務切換,作如下處理:從IRQ的堆?;謴蚐PSR及其它保護的寄存器。切換到超級用戶模式。在當前任務的堆棧中保存其設備環(huán)境將超級用戶模式的堆棧指針保存至任務的TCB中。rex_best_task的值賦給rex_curr_task。恢復rex_curr_task的設備環(huán)境。如果不需要任務切換,則從IRQ堆棧中恢復SPSR及其它受保護的寄存器,切換回超級用戶模式。注:某些版本的iRQ_Handler不切換回系統(tǒng)模式處理中斷,他們不支持中斷嵌套,因此也不管理中斷嵌套。這種機制通過中斷時的任務切換實現(xiàn)了強占式多任務,在中斷到來時,既是當前任務正在運行,也會切換到更高優(yōu)先級的就緒任務。第五章信號量和定時器REX使用信號量和定時器來實現(xiàn)任務間的同步機制及內(nèi)部定時。5.1信號量REX為任務間通訊提供了信號量機制,信號量集與每個任務都關聯(lián),這樣任何一個任務都可以通過rex_get_sigs(),rex_set_sigs()和rex_clr_sigs()函數(shù)讀取、置位、清除任何其它任務使用的信號量。任務可以調(diào)用rex_wait()函數(shù)來設置自己所等待的信號量子集,但不能等待別的任務的信號量。使用或操作可以設置等待多個信號量,任意信號量有效即可喚醒該任務。如果任務要等待的信號亮已經(jīng)被置位則等待函數(shù)立即返回而不會掛起任務。信號量值為一整形變量,ARM處理器支持32位整形變量,因此一個任務可以同時設置32個信號量。5.2定時器通過調(diào)用rex_def_timer()函數(shù)可以定義一個定時器,任務可以使用定時期來獲得需要的時間間隔。函數(shù)rex_set_timer()啟動定時器。函數(shù)rex_pause_timer()暫停定時器。函數(shù)rex_resume_timer()重啟定時器。任務如果需要一個延時,可以調(diào)用rex_timed_wait()函數(shù),然后等待超時信號量。定時時間到了定時器會設置信號量通知任務。注:需要注意任務必須設置為等待一個定時器信號量的超集,這一點非常重要,因為定時器通常已經(jīng)在程序一開始就初始化過了,這時它的信號量屬性已經(jīng)確定。如果沒有注意這一點,當一個任務調(diào)用rex_timed_wait()時所指定的信號量如果未包含在定時器的信號量集里,任務將捕獲不到任何信號量。時間的單位以毫秒計,最小計時單位為1毫秒。定時的精度與硬件平臺有關,為每毫秒時鐘嘀嗒中斷的次數(shù)。定時通過在每個時鐘嘀嗒中斷服務程序里調(diào)用rex_tick()來實現(xiàn),需要定時多少毫秒,就相應調(diào)用多少次,定時結(jié)束后,將信號量寫入等待定時任務的TCB中。REX負責維護所有未結(jié)束的定時器列表,一旦定時時間到,將從列表中刪除該定時器,不過REX并不知道定時器的數(shù)據(jù)結(jié)構(gòu),因此,為定時器數(shù)據(jù)結(jié)構(gòu)申請空間并維護由任務來完成。注:對調(diào)用rex_def_timer()函數(shù)的次數(shù)沒有限制,但是不能對已有的定時器調(diào)用該函數(shù),否則會破壞定時器列表,對任務來講是致命錯誤。第六章REX內(nèi)幕本章描述了一些REX內(nèi)部的數(shù)據(jù)結(jié)構(gòu)及變量,雖然這些數(shù)據(jù)可以訪問到,但是它們不應該被應用程序直接操作,了解這一點有助于查找程序的問題。6.1任務控制塊每一個任務都有一個任務控制塊來保存任務的設備環(huán)境。我們比較感興趣的字段包括:sp——堆棧指針,指示掛起的任務堆棧的棧頂位置。stack_limit 指示任務的堆棧大小,堆棧指針不能小于這一值。sigs——保存任務當前設置的信號量集。wait——保存任務正在等待的信號量,如果該值不為零則表明任務處于掛起,如果該值為零則表明任務已經(jīng)就緒或正在運行。pri——任務的優(yōu)先級6.2當前任務全局指針變量rex_curr_task指向當前正在運行任務的TCB。6.3優(yōu)選任務全局指針變量rex_best_task指向優(yōu)先級最高就緒任務的TCB。6.4任務列表所有任務的TCB都按優(yōu)先級排隊保存在隊列中,該隊列為雙向鏈表結(jié)構(gòu),next_ptr和prev_ptr分別指向下一個和前一個數(shù)據(jù)。全局結(jié)構(gòu)變量rex_task_list作為隊首,它的next_ptr指針指向系統(tǒng)中的最高優(yōu)先級任務(無論該任務是否就緒)。通過前向遍歷該隊列,查找TCB中wait字段為0的任務即可找到最高優(yōu)先級的就緒任務,空閑任務以優(yōu)先級0排在隊尾,并且該任務總是處于就緒態(tài),因此可以保證遍歷總是能完成。注:優(yōu)先級0被保留,用戶任務不能占用該優(yōu)先級。第七章API參考本章列出了REX提供的API參考,由于REX不對函數(shù)的入口參數(shù)作檢驗,因此程序員在調(diào)用這些API時必須符合接口規(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)建第一個用戶堆棧p_task,并作如下處理堆棧大小為p_istksiz優(yōu)先級為p_prip_tcb作為任務的TCB調(diào)用調(diào)度器,將控制權(quán)交給創(chuàng)建的任務。前兩個參數(shù)p_istack和p_istksiz是為了與以前的版本兼容,以后的版本不再使用這兩個參數(shù)。副作用:
無返回值:該函數(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)建一個新任務,由p_tcb所指向的數(shù)據(jù)作為新任務的TCB,內(nèi)存的分配由調(diào)用函數(shù)負責。功能:新任務的設備環(huán)境為:任務的私有堆棧,棧底為p_stack,棧空間為p_stksiz字(字長16bit)任務優(yōu)先級為p_pri,入口地址p_task,入口參數(shù)p_param在第一次運行任務時傳遞給任務函數(shù),REX不處理該數(shù)據(jù),用戶可根據(jù)需要定義入口參數(shù)的用處。REX定義了新任務后,立刻調(diào)用調(diào)度器,但是并不能保證新建的任務會立即獲得控制權(quán),仍然要視新任務的優(yōu)先級相對于就緒任務是否為最高,新建任務為就緒態(tài)。副作用:調(diào)用本函數(shù)會引起一次任務調(diào)度。
返回值:無用法: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將一個信號量p_sigs以掩碼的方式寫入p_tcb所指任務的TCB,p_sigs為位尋址變量,每一位代表特定的信號量,任務獲得了其中任何一個信號量后,重新作為候選的待執(zhí)行任務。副作用:調(diào)用本函數(shù)會引起一次任務調(dià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指向任務的信號量,不調(diào)用調(dià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指向的任務的信號量。返回值:返回原始的任務信號量。用法:#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)用它的任務,p_sigs掩碼寫入TCB的信號量字段,任務直到等待的信號量被設置后,恢復就緒態(tài)。如果調(diào)用rex_wait時等待的信號量已被設置,則函數(shù)立即返回,任務能夠繼續(xù)進行。任務只能等待自己的信號,不能等待其他任務的信號。副作用:調(diào)用本函數(shù)會引起一次任務調(dià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初始化一個定時器,用于實現(xiàn)一個指定時間的延遲。定時時間到后,tcb_ptr指向的任務將獲得通知。定時時間到后設置信號量為sigs。REX默認為定時器運行所用內(nèi)存空間由調(diào)用函數(shù)分配。本函數(shù)至少需調(diào)用一次定時器才可用,但不能對正在計時的定時器調(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啟動由p_time所指的定時器,定時長度為msecs的毫秒數(shù)。該定時器對應的信號量在調(diào)用本函數(shù)時清零,定時結(jié)束后重新置位。由p_time所指的定時器必須事先用rex_def_timer函數(shù)進彳丁初始化,如果該定時器已在運行,則會按新的時間重新開始計時。副作用:調(diào)用本函數(shù)會引起一次任務調(diào)度。返回值:返回定時器寫入新值前的定時計數(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ù)值,如返回值為0,表示該定時器未啟動。返回值:返回定時器當前計數(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ù)值。用法:#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ù)與rex_clr_timer不同,前者不會將計數(shù)值清零。返回值:無用法:#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ù)與rex_set_timer不同,前者未明確給出定時長度,定時器將使用其原有值。返回值:無用法:#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不是供應用程序的任務使用,它有每次時鐘嘀嗒中斷服務函數(shù)在每次中斷時進行調(diào)用,參數(shù)msecs指定每個時鐘嘀嗒間隔的毫秒數(shù),與硬件相關。副作用:調(diào)用本函數(shù)會引起一次任務調(diào)度。返回值:無用法:#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ù)的任務在收到其他任務設置的信號量或定時時間到后,進入就緒態(tài)。副作用:調(diào)用本函數(shù)會引起一次任務調(diào)度。返回值:調(diào)用該函數(shù)的任務所等待的信號量子集被覆蓋。用法:返回值:調(diào)用該函數(shù)的任務所等待的信號量子集被覆蓋。用法:#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)用它的任務的自身的TCB,任務通過調(diào)用該函數(shù)獲得自身TCB的地址。返回值:指向調(diào)用任務的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)用它的任務的當前優(yōu)先級。返回值:調(diào)用任務的當前優(yōu)先級。用法:#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)它的其任務自身優(yōu)先級修改為p_pri。返回值:調(diào)用任務的原優(yōu)先級。用法:#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設置*p_tcb所指任務的優(yōu)先級為p_pri。副作用:調(diào)用本函數(shù)會引起一次任務調(diào)度。返回值:*p_tcb所指任務的原優(yōu)先級用法:#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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 河道管理協(xié)議
- 水果購銷合同范本版示例
- 三亞市購房協(xié)議示例
- 聘請財務顧問協(xié)議書樣本
- 借款糾紛起訴狀范本法律維權(quán)攻略
- 書柜購買合約
- 保安服務合同鞏固
- 型材安裝工程項目招標
- 簡化勞務分包協(xié)議范本
- 酒店協(xié)議價格合同的四大誤解
- 家庭安全用電試題及答案
- 內(nèi)部承包合同補充協(xié)議書
- 戴煒棟語言學練習題
- 英漢互譯單詞練習打印紙
- 竣工結(jié)算審計服務投標方案
- 電梯安裝工程竣工資料移交書
- 一氯二氟甲烷安全技術說明書MSDS
- 改革開放簡史智慧樹知到課后章節(jié)答案2023年下北方工業(yè)大學
- 企業(yè)外來人員管理制度規(guī)章制度
- 石油化工建設工程竣工報告
- 洞室開挖安全教育培訓
評論
0/150
提交評論