資源描述:
《ucosii中的中斷》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、UC/OS-II中斷相關(guān)的問題要弄清楚以下函數(shù)的意義:OSTimeTick()在OS_CORE.C中,為時鐘管理函數(shù)。OSTickISR()在OS_CPU_A.S中以匯編的形式編寫。任何計算機(jī)系統(tǒng)都應(yīng)該有一系統(tǒng)時鐘,UCOS系統(tǒng)的系統(tǒng)時鐘是通過硬件定時器產(chǎn)生中斷來實現(xiàn)的,這個中斷會產(chǎn)生一個時鐘中斷服務(wù)程序,時鐘中斷服務(wù)程序也叫做節(jié)拍服務(wù)。各個任務(wù)運行都需要一個周期性的信號指示,即每一個任務(wù)允許運行的時間片是多少,必須規(guī)定好。這個時間片就是系統(tǒng)時鐘節(jié)拍UCOS系統(tǒng)響應(yīng)中斷的過程:系統(tǒng)正在運行任務(wù),此時有中斷發(fā)生,且系統(tǒng)收到了中斷請求(系統(tǒng)如何收到中斷請求,中斷以何種方式告知
2、操作系統(tǒng)?)。如果處理器處于中斷允許狀態(tài),系統(tǒng)就中止當(dāng)前任務(wù)的運行,而按照中斷向量去執(zhí)行相應(yīng)的中斷服務(wù)程序;中斷服務(wù)自程序結(jié)束前,會進(jìn)行一次任務(wù)調(diào)度。這樣中斷結(jié)束后,系統(tǒng)將會根據(jù)情況返回到被中止的任務(wù)繼續(xù)運行,或者轉(zhuǎn)到另外一個具有更高優(yōu)先級的就緒任務(wù)上運行。全局變量OSIntNesting有兩個用途:第一是用來記錄中斷嵌套的層數(shù),中斷嵌套也就是說當(dāng)?shù)谝粋€中斷發(fā)生而沒有結(jié)束的時候,又發(fā)生了第二個更重要的中斷,依次類推,此時OSIntNesting就用來表示嵌套的層數(shù),也就是有多少個中斷在發(fā)生或者等待處理,也就是說每當(dāng)有中斷發(fā)生時,就將OSIntNesting加1,有中斷結(jié)束
3、的時候,就將OSIntNesting減1;第二是作為調(diào)度器是否可進(jìn)行調(diào)度的標(biāo)志,以保證調(diào)度器不會在中斷服務(wù)程序中進(jìn)行任務(wù)調(diào)度,也就是當(dāng)OSIntNesting大于0的時候,將調(diào)度器加鎖,OSIntNesting等于0的時候,調(diào)度器解鎖。(這樣理解調(diào)度器的加鎖和解鎖,是否正確?中斷服務(wù)自程序結(jié)束前,會進(jìn)行一次任務(wù)調(diào)度。這個時候調(diào)度器不是鎖上的嗎?如何調(diào)度呢?)UCOS用兩個函數(shù)OSIntEnter(void)和OSIntExit(void)來處理變量SIntNesting。voidOSIntEnter(void){if(OSRunning==TRUE){if(OSIntNe
4、sting<255u){OSIntNesting++;/*IncrementISRnestinglevel*/}}};這個函數(shù)的作用就是把SIntNesting加一,來記錄嵌套層數(shù),并為調(diào)度器加鎖。它經(jīng)常運行在中斷服務(wù)程序保護(hù)用戶被中斷任務(wù)的端點數(shù)據(jù)之后,運行用戶中斷服務(wù)代碼之前,通常叫做進(jìn)入中斷服務(wù)函數(shù)。消息量函數(shù)分析OS_EVENT*OSSemCreate(INT16Ucnt)消息量函數(shù)分析OS_EVENT*OSSemCreate(INT16Ucnt)OS_EVENT*OSSemCreate(INT16Ucnt);該函數(shù)返回的數(shù)據(jù)類型為指針,指針指向的數(shù)據(jù)類型為OS_
5、EVENT(事件的數(shù)據(jù)類型為結(jié)構(gòu)體)。也就是函數(shù)返回一個地址,地址里存的是新創(chuàng)建的結(jié)構(gòu)體類型所占據(jù)的內(nèi)存的首地址。OS_EVENT*pevent;pevent=OSEventFreeList;if(OSEventFreeList!=(OS_EVENT*)0){/*SeeifpooloffreeECBpoolwasempty*/OSEventFreeList=(OS_EVENT*)OSEventFreeList->OSEventPtr;};首先創(chuàng)建一個指向OS_EVENT結(jié)構(gòu)體類型的指針pevent;系統(tǒng)初始化時會創(chuàng)建一個空事件控制塊鏈表,而創(chuàng)建的空事件控制塊的數(shù)目由常數(shù)O
6、SEventMax來決定。OSEventFreeList就指向這個空事件控制塊鏈表的第一個,所以上面的程序里把OSEventFreeList賦給了pevent,也就是讓pevent指向第一個空事件控制塊,然后又讓OSEventFreeList指向了空事件控制鏈表中的第二個。也就是從空事件鏈表中摘出了第一個給事件使用。if(pevent!=(OS_EVENT*)0){/*Getaneventcontrolblock*/pevent->OSEventType=OS_EVENT_TYPE_SEM;pevent->OSEventCnt=cnt;/*Setsemaphorevalu
7、e*/pevent->OSEventPtr=(void*)0;/*UnlinkfromECBfreelist*/#ifOS_EVENT_NAME_SIZE>1pevent->OSEventName[0]='?';/*Unknownname*/pevent->OSEventName[1]=OS_ASCII_NUL;#endif;以上就是對新創(chuàng)建的空任務(wù)控制塊的各個量進(jìn)行初始化。OS_EventWaitListInit(pevent);;通過調(diào)用OSEventWaitListInit()對事件控制塊中的等待任務(wù)列表進(jìn)行初始化。該函