ucos中文書(shū)-第3章內(nèi)核結(jié)構(gòu)_第1頁(yè)
ucos中文書(shū)-第3章內(nèi)核結(jié)構(gòu)_第2頁(yè)
ucos中文書(shū)-第3章內(nèi)核結(jié)構(gòu)_第3頁(yè)
ucos中文書(shū)-第3章內(nèi)核結(jié)構(gòu)_第4頁(yè)
ucos中文書(shū)-第3章內(nèi)核結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章內(nèi)核結(jié) 臨界段(Critical 任 任務(wù)狀 任務(wù)控制塊(TaskControlBlocks, 就緒表(Ready 給調(diào)度器上鎖和開(kāi)鎖(LockingandUnLockingthe 空閑任務(wù)(Idle 統(tǒng)計(jì)任 μC/OS中的中斷處 時(shí)鐘節(jié) 第3章OS_ENTER_CRITICAL(OSIntEnter(OSSchedLock(OSSchedUnlock(),臨界段(Critical時(shí)內(nèi)核開(kāi)發(fā)商應(yīng)提供的最重要的指標(biāo)之一,因?yàn)檫@個(gè)指標(biāo)影響用戶(hù)系統(tǒng)對(duì)實(shí)件的響應(yīng)CCCCCCμC/OS-Ⅱ中的這兩個(gè)宏調(diào)用分別是:OS_ENTER_CRITICALOS_EXIT_CRITICAL()。因?yàn)檫@兩個(gè)宏的定義取決于所用的微處理器,故在文件OS_CPU.H中可以找到相應(yīng)宏定義。每種微處理器都有自己的OS_CPU.H任其它C的函數(shù)一樣,有函數(shù)返回類(lèi)型,有形式參數(shù)變量,但是任務(wù)是絕不會(huì)返回的。故返回void[L3.1(1)]。voidvoidYourTask(void{for(;;)/*/*}}程L3.1μC/OSOSTaskDel(),這個(gè)任務(wù)絕不會(huì)返回什么。程序L3.2.任務(wù)完成后自我刪voidvoidYourTask(void{/*用戶(hù)代碼*/}口的參數(shù)(波特率、I/O。用了。作者保留了優(yōu)先級(jí)為0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2為定義的常數(shù)在OS_CFG.H文件中用定義常數(shù)語(yǔ)句#defineconstant定義的。因此用戶(hù)可以有多達(dá)56個(gè)應(yīng)用任務(wù)。必須給每個(gè)任務(wù)賦以不同的優(yōu)先級(jí),優(yōu)先級(jí)可以從0到(ID(或任務(wù)的ID號(hào)也被一些內(nèi)核服務(wù)函數(shù)調(diào)如改變優(yōu)先級(jí)函數(shù)OSTaskChangePrio(),OSTaskDel()。址與其它參數(shù)一起傳給下面兩個(gè)函數(shù)中的一個(gè):OSTastCreatOSTaskCreatExtOSTaskCreateExt()OSTaskCreate()任務(wù)狀(L3.2立即得到CPU的控制權(quán)。一個(gè)任務(wù)可以通過(guò)調(diào)用OSTaskDel()返回到睡眠態(tài),或通過(guò)調(diào)用該3.1正在運(yùn)行的任務(wù)可以通過(guò)調(diào)用兩個(gè)函數(shù)之一將自身延遲一段時(shí)間,這兩個(gè)函數(shù)是OSTimeDly(OSTimeDlyHMSMCPUOSTimeTick()使延遲了的任務(wù)進(jìn)入就緒態(tài)(3.10。正在運(yùn)行的任務(wù)期待某 的發(fā)生時(shí)也要等待 是調(diào)用以下3個(gè)函數(shù)之一。(WAITING(Pend,件發(fā)生了,被掛起的任務(wù)進(jìn)入就緒態(tài)發(fā)生的報(bào)告可能來(lái)自另一個(gè)任務(wù),也可能來(lái)自中。(ISR務(wù)子程序控制了CPU的使用權(quán)。中斷服務(wù)子程序可能會(huì)報(bào)告一個(gè)或多個(gè)的發(fā)生,而使taskOSTaskIdle()函數(shù)。任務(wù)控制塊(TaskControlBlocks,一旦任務(wù)建立了,任務(wù)控制塊OS_TCBs將被賦值(程序3.3。任務(wù)控制塊是一個(gè)數(shù)據(jù)結(jié)構(gòu),當(dāng)任務(wù)的CPU使用權(quán)被時(shí),μC/OS-Ⅱ用它來(lái)保存該任務(wù)的狀態(tài)。當(dāng)任務(wù)重CPUOS_TCBsRAM的邏輯分組。任務(wù)建立的時(shí)候,OS_TCBs(見(jiàn)第四章任務(wù)管理。程序L μC/OS-II任務(wù)控制塊typedefstructos_tcb{typedefstructos_tcb{ #if structos_tcb*OSTCBNext;structos_tcb#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN||OS_SEM_EN #if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN #if }中唯一的一個(gè)能用匯編語(yǔ)言來(lái)處置的變量(Context-switchingcode).OSTCBExtPtr指向用戶(hù)定義的任務(wù)控制塊擴(kuò)展。用戶(hù)可以擴(kuò)展任務(wù)控制塊而不必修改μC/OS-Ⅱ的源代碼。.OSTCBExtPtr只在函數(shù)OstaskCreateExt()中使用,故使用時(shí)要將OS_TASK_CREAT_EN1,以允許建立任務(wù)函數(shù)的擴(kuò)展。例如用戶(hù)可以建立一個(gè)數(shù)據(jù)結(jié)構(gòu),3OSTaskCreateExt()OS_TASK_CREATE_EXT_EN1,以便允許該功能。4,000字節(jié)同樣是1,000個(gè)地址如果每個(gè)地址寬度是16位的則總棧容量只有2,000字節(jié)。在函數(shù)OSStakChk()中要調(diào)用OSTCBStkSize。同理,若使用該函數(shù)的話(huà),要將OS_TASK_CREAT_EXT_EN1。.OSTCBOpt把“選擇項(xiàng)”傳給OSTaskCreateExt(),只有在用戶(hù)將OS_TASK_CREATE_EXT_EN設(shè)為1時(shí),這個(gè)變量才有效。μC/OS-Ⅱ目前只支持3個(gè)選擇項(xiàng)(見(jiàn)uCOS_II.H 初始化時(shí),已將RAM清過(guò)零,則OS_TASK_OPT_STK_CLR不需要再定義,這可以節(jié)約程序執(zhí)行時(shí)間。傳遞了OS_TASK_OPT_STK_CLR將增加TaskCreateExt()函數(shù)的執(zhí)行時(shí)間,因?yàn)橐獙?臻g。棧容量越大,花的時(shí)間越長(zhǎng)。最后一個(gè)選擇項(xiàng)OS_TASK_OPT_SAVE_FP通知.OSTCBId用于任務(wù)的識(shí)別碼。這個(gè)變量現(xiàn)在沒(méi)有使用,留給將來(lái)擴(kuò)展用.OSTCBNext和.OSTCBPrev用于任務(wù)控制塊OS_TCBs的雙重,該鏈表在時(shí)鐘節(jié)拍函數(shù).OSTCBMsg是指向傳給任務(wù)的消息的指針。用法將在后面的章節(jié)中提到(見(jiàn)第6章任務(wù)間通.OSTCBStat是任務(wù)的狀態(tài)字。當(dāng).OSTCBStat為0,任務(wù)進(jìn)入就緒態(tài)??梢越o.OSTCBStat賦uCOS_II.H.OSTCBX,.OSTCBY,.OSTCBBitX.OSTCBBitY用于加速任務(wù)進(jìn)入就緒態(tài)的過(guò)程或進(jìn)入等者是在改變?nèi)蝿?wù)優(yōu)先級(jí)時(shí)算出的。這些值的算法見(jiàn)程序L3.4。=priority>>=OSMapTbl[priority>>=priority&=OSMapTbl[priority&程L3.4任務(wù)控制塊OS_TCB(4應(yīng)用程序中可以有的最多任務(wù)數(shù)(OS_MAX_TASKS)OS_CFG.H最多任務(wù)數(shù)也是μC/OS-Ⅱ分配給用戶(hù)程序的最多任務(wù)控制塊OS_TCBs的數(shù)目。將OS_MAX_TASKSRAMOS_N_SYS_TASKSμC/OS-Ⅱ.H,供其目前,一個(gè)用于空閑任務(wù),另一個(gè)用于任務(wù)統(tǒng)計(jì)(如果OS_TASK_STAT_EN是設(shè)為1的。在μC/OS-Ⅱ初始化的時(shí)候,如圖3.2所示,所有任務(wù)控制塊OS_TCBs被成單向空任務(wù)鏈表。當(dāng)任務(wù)一旦建立,空任務(wù)控制塊指針OSTCBList指向的任務(wù)控制塊便賦給了該任務(wù),然后OSTCBList的值調(diào)整為指向下鏈表中下一個(gè)空的任務(wù)控制塊。一旦任務(wù)被刪3.2就緒表(Ready每個(gè)任務(wù)被賦予不同的優(yōu)先級(jí)等級(jí),從0級(jí)到最低優(yōu)先級(jí)OS_LOWEST_PR1O,包括0和OS_LOWEST_PR1O在內(nèi)(見(jiàn)文件OS_CFG.H。當(dāng)μC/OS-Ⅱ初始化的時(shí)候,最低優(yōu)先級(jí)OS_LOWEST_PR1O總是被賦給空閑任務(wù)idletask。注意,最多任務(wù)數(shù)目OS_MAX_TASKS和最每個(gè)任務(wù)的就緒態(tài)標(biāo)志都放入就緒表中的,就緒表中有兩個(gè)變量OSRedyGrp和OSRdyTbl[]。在OSRdyGrp中,任務(wù)按優(yōu)先級(jí)分組,8個(gè)任務(wù)為一組。OSRdyGrp中的每一位表示8組任務(wù)中每一組中是否有進(jìn)入就緒態(tài)的任務(wù)進(jìn)入就緒態(tài)時(shí)就緒表OSRdyTbl[]OSRdyTbl[]OS_LOWEST_PR1O(見(jiàn)文件OS_CFG.H)。當(dāng)用戶(hù)的應(yīng)用程序中任務(wù)數(shù)目比較少時(shí),減少OS_LOWEST_PR1O的值可以降低μC/OSRAM(數(shù)據(jù)空間)的需求量。中相應(yīng)字節(jié)的相應(yīng)位置1。OSRdyGrp和OSRdyTbl[]之間的關(guān)系見(jiàn)圖3.3,是按以下規(guī)則給出OSRdyTbl[0]中的任何一1時(shí),OSRdyGrp的第0位置1,OSRdyTbl[1]中的任何一位是1時(shí),OSRdyGrp的第1位置1,當(dāng)OSRdyTbl[2]中的任何一1時(shí),OSRdyGrp的第2位置1,當(dāng)OSRdyTbl[3]中的任何一1時(shí),OSRdyGrp的第3位置1,當(dāng)OSRdyTbl[4]中的任何一1時(shí),OSRdyGrp的第4位置1,當(dāng)OSRdyTbl[5]中的任何一位是1時(shí),OSRdyGrp的第5位置1,當(dāng)OSRdyTbl[6]中的任何一1時(shí),OSRdyGrp的第6位置1,程 |=OSMapTbl[prio>>OSRdyTbl[prio>>3]|=OSMapTbl[prio&程L3.5表T3.1OSMapTbl BitMask001224345667接下去的三位用于確定是在OSRdyTbl[]數(shù)組的第幾個(gè)元素。OSMapTbl[]是在ROM中的(見(jiàn)文件OS_CORE.C) 字,用于限制OSRdyTbl[]數(shù)組的元素下標(biāo)在0到7之間,見(jiàn)表3.1程序L3.6從就緒表中刪除一個(gè)任ifif((OSRdyTbl[prio>>3]&=~OSMapTbl[prio&0x07])==OSRdyGrp&=~OSMapTbl[prio>>字節(jié)的8位代表這一組的8個(gè)任務(wù)哪些進(jìn)入就緒態(tài)了,低位的優(yōu)先級(jí)高于。利用這個(gè)字那個(gè)任務(wù)所在的位置這個(gè)返回值在0到7之間。確定進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任務(wù)是用以下代碼完成的,如程序L3.7所示。程序L3.7找出進(jìn)入就緒態(tài)的優(yōu)先級(jí)最高的任 = =prio=(y<<3)+ OSRdyGrpOSUnMapTbl[OSRdyGrp]得到的值是3,它相應(yīng)于OSRdyGrp中的第3bit3,這里假設(shè)最右邊的一位是第0bit0。類(lèi)似地,OSRdyTbl[3]的值是二進(jìn)制OSUnMapTbl[OSRdyTbc[3]22位。于是任務(wù)的優(yōu)先級(jí)Prio就等于2(3*8+2。利用這個(gè)優(yōu)先級(jí)的值。查任務(wù)控制塊優(yōu)先OSTCBPrioTbl[OS_TCB任務(wù)調(diào)度(TaskOSSched()完成的。OSIntExt()完成的,這個(gè)函數(shù)將在以后描述。OSSched()的代碼如程序L3.8所示。程序L3.8任務(wù)調(diào)度器(theTaskvoidOSSched{INT8Uif((OSLockNesting|OSIntNesting)==0) =OSPrioHighRdy=(INT8U)((y<<3)+if(OSPrioHighRdy!=OSPrioCur)OSTCBHighRdy=}}}中[L3.8(1)]條件語(yǔ)句的條件不滿(mǎn)足,任務(wù)調(diào)度函數(shù)OSSched()將退出,不做任務(wù)調(diào)度。這OSSched()OSIntNesting>0,OSSchedLockOSLockNesting>0。OSSched(),并且任務(wù)調(diào)度是允許的,即沒(méi)有上鎖,則任務(wù)μC/OSOSTCBHighRdyOSTCBCur816μC/OS-Ⅱ中是兩個(gè)整數(shù)的比較。并且,除非用戶(hù)實(shí)際需要做任務(wù)切換,在查任務(wù)控制塊優(yōu)先級(jí)表OSTCBPrioTbl[]OSTCBHighRdy。綜合這兩項(xiàng)改進(jìn),即用整數(shù)比較代替指針的比較和當(dāng)需要任務(wù)切換時(shí)再查表,使得μC/OS-Ⅱ比μC/OS816通過(guò)將以O(shè)SPrioHighRdy為下標(biāo)的OSTCBPrioTbl[]數(shù)組中的那個(gè)元素賦給OSTCBHighRdy來(lái)OS_TASK_SW()來(lái)完成實(shí)際上的任務(wù)切換[L3.8(6)]。μC/OS總是看起來(lái)跟剛剛發(fā)生過(guò)中斷一樣,所有微處理器的寄存器都保存在棧中。換句話(huà)說(shuō),μC/OSCPUOS_ASK_SW(RAP(TrphadlereptionhandlerSCtxSw(OSCtxw()OS_TCBighRyOSCBCr指向8μC/OSOSCtSw()OSSched()OSSched()()是用C寫(xiě)的。給調(diào)度器上鎖和開(kāi)鎖(LockingandUnLockingthe(L3.10的任務(wù)保持對(duì)CPU的控制權(quán),盡管有個(gè)優(yōu)先級(jí)更高的任務(wù)進(jìn)入了就緒態(tài)。然而,此時(shí)中斷是OSLockNesting減到零的時(shí)候,OSSchedUnlock()調(diào)用OSSched[L3.10(2)]也就是說(shuō),用戶(hù)程序不得調(diào)用OSMboxPend()OSQPend()OSSemPend()OSTaskSuspend(OS_PR1O_SELF)、OSTimeDly()OSTimeDlyHMSM(OSLockNesting當(dāng)?shù)蛢?yōu)先級(jí)的任務(wù)要發(fā)消息給多任務(wù)的郵箱、消息隊(duì)列、信號(hào)量時(shí)(6了CPU的控制權(quán),此時(shí),用戶(hù)可以使用調(diào)度器函數(shù)。程序L3.9給調(diào)度器上voidOSSchedLock {{if(OSRunning==TRUE){}}voidvoidOSSchedUnlock{if(OSRunning==TRUE){if(OSLockNesting>0){if((OSLockNesting|OSIntNesting)==0){}else}}else}}}程L3.10給調(diào)度器開(kāi)鎖空閑任務(wù)(Idle這個(gè)空閑任務(wù)[OSTaskIdle()]設(shè)為最低優(yōu)先級(jí),即OS_LOWEST_PRI0。空閑任務(wù)計(jì)任(見(jiàn)3.08計(jì)任務(wù)使用這個(gè)計(jì)數(shù)器以確定現(xiàn)行應(yīng)用軟件實(shí)際消耗的CPU時(shí)間。程序L3.11是空閑任務(wù)的代碼。在計(jì)數(shù)器加1前后,中斷是先關(guān)掉再開(kāi)啟的,因?yàn)?位程序L3.11μC/OS-Ⅱ的空閑任務(wù)voidvoidOSTaskIdle(void{pdata=pdata;for(;;){}}統(tǒng)計(jì)任μC/OSOSTaskStat(),如果用戶(hù)將系統(tǒng)定義常數(shù)OS_TASK_STAT_EN(見(jiàn)文件OS_CFG.H)設(shè)為1,這個(gè)任務(wù)就會(huì)建立。一旦得到OS_CORE.C8OSCPUsage1個(gè)任務(wù)中調(diào)用OSStatInit((見(jiàn)文件OS_CORE.C話(huà)說(shuō)在調(diào)用系統(tǒng)啟動(dòng)函數(shù)OSStart()之前,用戶(hù)初始代碼必須先建立一個(gè)任務(wù),在這個(gè)任務(wù)中調(diào)用系統(tǒng)統(tǒng)計(jì)初始化函數(shù)程序L3.12初始化統(tǒng)計(jì)任務(wù)voidmain{ /*初始化uC/OS- /*創(chuàng)建用戶(hù)起始任務(wù)(為了方便討論,這里以TaskStart()作為起始任務(wù)) /*開(kāi)始多任務(wù)調(diào) }voidTaskStart(void{ /*/*創(chuàng)建用戶(hù)應(yīng)用程序任for(;;)}}系統(tǒng)啟動(dòng)函數(shù)t()的時(shí)候,μC/OS-Ⅱ只有3個(gè)要管理的任務(wù):TaskStart的優(yōu)先級(jí)設(shè)為次低,OS_LOWEST_PR10-1。啟動(dòng)任務(wù)TaskStart()總是優(yōu)先級(jí)最高的任務(wù)。F3.4μC/OS始化函數(shù)OSInit(),該函數(shù)初始化μC/OS-Ⅱ[圖F3.4(2)]。有的處理器(例如Motorola的MC68HC11),不需要“設(shè)置”中斷向量,中斷向量已經(jīng)在ROM中有了。用戶(hù)必須調(diào)用TaskStartF3.4(4)]]。TaskStart(F3.4(5)]。在這里啟動(dòng)時(shí)鐘節(jié)拍是必要的,因OSStatInitOSTimeDly()2Ⅱ然后選下一個(gè)優(yōu)先級(jí)最高的進(jìn)入就緒態(tài)的任務(wù)運(yùn)行,這恰好是統(tǒng)計(jì)任務(wù)OSTaskStat()。讀者會(huì)在后面讀到OSTaskStat()的代碼,但粗看一下,OSTaskStat()所要做的第一件事就一定會(huì)是這樣,因?yàn)闃?biāo)志OSStatRdyOSInit()函數(shù)初始化為“假”,所以實(shí)際上OTaskIdl中,直到TaskStart()的延遲兩個(gè)時(shí)鐘節(jié)拍完成[圖3.4(10)]。兩個(gè)時(shí)鐘節(jié)拍之后,TaskStart(F3.4(11)]。在執(zhí)行OSStartInitOSIdleCtr其它進(jìn)入就緒態(tài)的任務(wù),OSTaskIdle()又獲得了CPU的控制權(quán)[圖F3.4(14秒鐘以后,TaskStart()繼續(xù)運(yùn)行,還是在OSStatInit()中,空閑計(jì)數(shù)器將1秒鐘內(nèi)計(jì)數(shù)的值存入空閑OSIdleCtrMaxF3.4(15)]。OSStarInit()將統(tǒng)計(jì)任務(wù)就緒標(biāo)志OSStatRdy設(shè)為“真”[圖F3.4(16)],以此來(lái)允許兩個(gè)OSTaskStat()CPU程序L3.13統(tǒng)計(jì)任務(wù)的初始化voidvoidOSStatInit{ =0L;OSIdleCtrMax=OSIdleCtr; =TRUE;}統(tǒng)計(jì)任務(wù)OSStat()的代碼程序L3.14所示。面一段中,已經(jīng)討論了為什么要等待的任務(wù)消耗了多少CPU時(shí)間。當(dāng)用戶(hù)的應(yīng)用程序代碼加入以后,運(yùn)行空閑任務(wù)的CPU時(shí)間就最大計(jì)數(shù)值是OSStatInit()在初始化時(shí)保存在計(jì)數(shù)器最大值OSIdleCtrMax中的。CPU利用率(表達(dá)式[3.1])OSCPUsage[L3.14(2)]中的:[3.1]表達(dá)式[3.1]表達(dá)式Needtotypesetthe一旦上述計(jì)算完成,OSTaskStat()調(diào)用任務(wù)統(tǒng)計(jì)外界接入函數(shù)OSTaskStatHook()3程序L3.14統(tǒng)計(jì)任voidvoidOSTaskStat(void{INT32Urun;INT8Susage;pdatapdata=while(OSStatRdy==FALSE){OSTimeDly(2*OS_TICKS_PER_SEC);}for(;;)OSIdleCtrRun= =OSIdleCtr; =0L;if(OSIdleCtrMax>0L)usage=(INT8S)(100L-100L*run/OSIdleCtrMax);if(usage>100){OSCPUUsage=}elseif(usage<0){OSCPUUsage=0;}elseOSCPUUsage=}}elseOSCPUUsage=}}}μC/OS中的中斷處務(wù)子程序的示意碼如程序L3.15程L3.15μC/OS-II中的中斷服務(wù)子程序Motorola68020(68020再將寄存器加1,然后再寫(xiě)回到變量OSIatNesting中去,就不如調(diào)用OSIatEnter()。證處理OSIntNesting時(shí)的排它性直接給OSIntNesting1比調(diào)用OSIntEnter()快得多,可能時(shí),直接加1更好。要當(dāng)心的是,在有些情況下,從OSIntEnter()返回時(shí),會(huì)把中斷開(kāi)用戶(hù)應(yīng)用程序就會(huì)?。⊿IntNestin>0μCOS-F3.5[F35(1)]PUμC/SCPUCPU[F3.(2)],CPU()跳轉(zhuǎn)到中斷服務(wù)子程序[F35(3)]。如上所述,中斷服務(wù)子程序保存CPU寄存器(也叫做CPUcontext)[F.5(4)],μC/OSOSIntnter()OSntNestig直接加1[F35(5)]3.5(6)]去做。中斷服務(wù)子程序通知某任務(wù)去做事的是調(diào)用以下函數(shù)之一:OMboxPos(),OSQPost()SQPostFont(SSemPos要調(diào)用OSInExit()F3.5(7)OSIntExit(CPU[35(8[3.(9OInExi間,因?yàn)檫@時(shí)要做任務(wù)切換[3.5(1)]。新任務(wù)的寄存器內(nèi)容要恢復(fù)并執(zhí)行中斷返回指令[3.5(1)]。3.5進(jìn)入中斷函數(shù)OSIntEnter()的代碼如程序L3.16所示,從中斷服務(wù)中退出函程序L3.16通知μC/OS-Ⅱ,中斷服務(wù)子程序開(kāi)始了voidvoidOSIntEnter{}voidvoidOSIntExit{if((--OSIntNesting|OSLockNesting)==0){ =OSUnMapTbl[OSRdyGrp];程L3.17通知μC/OSOSPrioHighRdyOSPrioHighRdy=(INT8U)((OSIntExitY<<3)if(OSPrioHighRdy!=OSPrioCur){OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];}}}Y是保存在全程變量OSIntExitY中的[L3.17(3)]是為了避免在任務(wù)棧中安排局部變量。這個(gè)變量在哪兒和中斷任務(wù)切換函數(shù)OSIntCtxSw(見(jiàn)9.04.03節(jié),中斷任務(wù)切換函OS_TASK_SW(OSSched()函數(shù)中那樣。首先是,如程序中L3.5(1)和圖F3.6(1)所示,一半的工作,即CPU寄存器入棧的工作移植μC/OS-Ⅱ。最后,調(diào)用OSIntCtxSw()時(shí)的返回地址又被推入了堆棧[L3.17(4)和有的微處理器,像Motorola68HC11中斷發(fā)生時(shí)CPU寄存器是自動(dòng)入棧的,且要想允許務(wù)期間開(kāi)中斷,也不需要調(diào)用OSIntEnter()或OSIntNesting加1。程序L3。18中的示/*程L3.18Motorola68HC11時(shí)鐘節(jié)μC/OS10次到100次之間,或者說(shuō)10到100Hz。時(shí)鐘節(jié)拍率越高,系統(tǒng)的額外負(fù)荷就越重。時(shí)鐘50/60Hz將允許時(shí)鐘節(jié)拍器中斷放在系統(tǒng)初始化函數(shù)voidvoid{..../*/*初始化uC/OS-/*通過(guò)調(diào)用OSTaskCreate()創(chuàng)建至少一個(gè)任..;.. /*開(kāi)始多任務(wù)調(diào) }程L3.19啟動(dòng)時(shí)鐘就節(jié)拍器的不正確做法這里潛在地是,時(shí)鐘節(jié)拍中斷有可能在μC/OS-Ⅱ啟動(dòng)第一個(gè)任務(wù)之前發(fā)生,此時(shí)程序L3.20時(shí)鐘節(jié)拍中斷服務(wù)子程序的示意代voidvoid{}時(shí)鐘節(jié)拍函數(shù)OSTimeTick()的代碼如程序3.21所示。OSTimtick()以調(diào)用可由用戶(hù)定義的時(shí)鐘節(jié)拍外連函數(shù)OSTimTickHook()開(kāi)始,這個(gè)外連函數(shù)可以將時(shí)鐘節(jié)拍函數(shù)工作要做。OSTimtick()中量大的工作是給每個(gè)用戶(hù)任務(wù)控制塊OS_TCB中的時(shí)間延時(shí)項(xiàng)OSTCBDly減1(如果該項(xiàng)不為零的話(huà)。OSTimTick()從OSTCBList開(kāi)始,沿著OS_TCB鏈表voidvoidOSTimeTick{OS_TCBptcb=while(ptcb->OSTCBPrio!=OS_IDLE_PRIO){if(ptcb->OSTCBDly!=0)if(--ptcb->OSTCBDly==0)if(!(ptcb->OSTCBStat&OS_STAT_SUSPEND)) |=ptcb-OSRdyTbl[ptcb->OSTCBY]|=ptcb-}elseptcb->OSTCBDly=}}}ptcb=ptcb->OSTCBNext;} }程L3.21時(shí)鐘節(jié)拍函數(shù)OSTimtick()OSTimeTick(OSTime()[L3.21(7)]累加從開(kāi)機(jī)以來(lái)的時(shí)間,用的是一個(gè)無(wú)任務(wù)級(jí)調(diào)用OSTimeTick(),如程序L3.22所示。要想這么做,得建立一個(gè)高于應(yīng)用程程序L3.22時(shí)鐘節(jié)拍任務(wù)TickTask()作時(shí)鐘節(jié)拍服務(wù)voidTickTask(void {{pdata=pdata;for(;;){ /**/}}用戶(hù)當(dāng)然需要先建立一個(gè)郵箱(NULL)用于發(fā)信號(hào)給上述任何告知時(shí)鐘節(jié)拍中斷已經(jīng)發(fā)生了(程序L3.23程序L3.23時(shí)鐘節(jié)拍中斷服務(wù)函數(shù)OSTickISR()做節(jié)拍服務(wù)voidvoid{發(fā)送一個(gè)‘空’消息((void*)1)到時(shí)鐘節(jié)拍的郵箱}μC/OS在調(diào)用μC/OS-Ⅱ的任何其它服務(wù)之前,μC/OSOS_CORE.C緒態(tài)。OSTaskStatOS_LOW

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論