嵌入式操作系統(tǒng)教程-第八章
第一章 操作系統(tǒng)的基本概念,*,*,*,嵌入式操作系統(tǒng)基礎(chǔ) 第八章,uC,/OS-II,的中斷與時鐘,第八章,uC,/OS-II,的中斷與時鐘,uC,/OS-II,的中斷,uC,/OS-II,的時鐘,uC,/OS-II,的管理問題,1,第八章,uC,/OS-II,的中斷和時鐘,一、,uC,/OS-II,的中斷過程,1.,中斷,:應(yīng)內(nèi)部或外部異步事件的請求終止當(dāng)前任務(wù),而去處理異步事件所要球的任務(wù)的過程。,2.,中斷服務(wù)子程序,:應(yīng)中斷請求而運行的程序。,3.,中斷向量,:沖斷服務(wù)子程序的入口地址。,4.,中斷嵌套,:,uC,/OS-II,允許中斷過程中響應(yīng)更高級的中斷請求。,8.1,uC,/OS-II,的中斷,2,5.,中斷服務(wù)子程序,保存全部,CPU,寄存器,;,(1),調(diào)用,OSIntEnter,(),或,OSIntNesting,直接加,1;,(2),執(zhí)行用戶代碼做中斷服務(wù),;,(3),調(diào)用,OSIntExit,(),;,(4),恢復(fù)所有,CPU,寄存器;,(5),執(zhí)行中斷返回指令;,(6),uC,/OS-II,系統(tǒng)通常用一個任務(wù)來完成異步事件的處理工作,而在終端服務(wù)程序中只是通過向任務(wù)發(fā)送消息的方法來激活這個任務(wù)。,3,4,6.,兩個重要的中斷函數(shù),void,OSIntExit,(void),OS_ENTER_CRITICAL();(1),if(-,OSIntNesting,|,OSLockNesting,)=0)(2),OSIntExitY,=,OSUnMapTblOSRdyGrp,;(3),OSPrioHighRdy,=(INT8U)(OSIntExitY,OSTCBStkPtr,;,/,使,SP,指向待運行任務(wù)堆棧,用出棧指令把,R!,R2,彈入處理器的通用寄存器;,REIT;,/,中斷返回,使,PC,指向待運行任務(wù),7,三、,臨界段的處理,1.,臨界段,:應(yīng)用程序中經(jīng)常有些代碼段必須不受任何干擾的運行,把這樣的代碼段叫,臨界段,。,2.,服務(wù)于中斷的兩個宏:,#define OS_ENTER_CRITICAL(),cpu_sr,=,get_processor_psw,();,/,保存狀態(tài)字,disable_interruptw,();,#define OS_EXIT_CRITICAL(),set_processor_psw(cpu_sr,);,/,恢復(fù)狀態(tài)字,8,8.2,uC,/OS-II,的時鐘,1.,時鐘,:任何系統(tǒng)都要提供一個周期性的型號源,以供系統(tǒng)處理諸如任務(wù)的等待、延時等與時間有關(guān)的事件,此信號源就叫系統(tǒng),時鐘,。,2.,時鐘節(jié)拍,:兩次中斷之間的間隔的時間,此時間稱為,時鐘節(jié)拍,。時鐘節(jié)拍的中斷服務(wù)程序代碼如下:,void,OSTickISR(void,),保存處理器寄存器的值;,調(diào)用,OSIntEnter,(),或是將,OSIntNesting,加,1;,調(diào)用,OSTimeTick,();,調(diào)用,OSIntExit,();,恢復(fù)處理器寄存器的值,;,執(zhí)行中斷返回指令,;,9,void,OSTimeTick,(void),OS_TCB*,ptcb,;,OSTimeTickHook,();(1),ptcb,=,OSTCBList,;(2),while(,ptcb,-,OSTCBPrio,!=OS_IDLE_PRIO)(3),OS_ENTER_CRITICAL();,if(,ptcb,-,OSTCBDly,!=0),if(-,ptcb,-,OSTCBDly,=0),if(!(,ptcb,-,OSTCBStat,&OS_STAT_SUSPEND)(4),OSRdyGrp,|=,ptcb,-,OSTCBBitY,;(5),OSRdyTblptcb,-OSTCBY|=,ptcb,-,OSTCBBitX,;,else,ptcb,-,OSTCBDly,=1;,ptcb,=,ptcb,-,OSTCBNext,;,OS_EXIT_CRITICAL();,OS_ENTER_CRITICAL();(6),OSTime,+;(7),OS_EXIT_CRITICAL();,捕捉當(dāng)前顯示,以便返回,轉(zhuǎn)等待為就緒,計時器,10,8.3,uC,/OS-II,的時間管理,1.,任務(wù)延時,:,uC,/OS-II,系統(tǒng)按任務(wù)優(yōu)先級調(diào)度任務(wù),其內(nèi)核為可剝脫型,為避免低級任務(wù)長時間得不到運行,系統(tǒng)規(guī)定:除,IdleTask,外,運行任務(wù)必須在合適時段暫停運行一段規(guī)定時間。任務(wù)延時函數(shù),OSTimeDly,(),代碼如下?,void,OSTimeDly,(INT16U ticks),if(ticks 0)(1),OS_ENTER_CRITICAL();,if(,OSRdyTblOSTCBCur,-OSTCBY&=,OSTCBCur,-,OSTCBBitX,)=0(2),OSRdyGrp,&=,OSTCBCur,-,OSTCBBitY,;,OSTCBCur,-,OSTCBDly,=ticks;(3),OS_EXIT_CRITICAL();,OSSched,();(4),11,2.,恢復(fù)正在延時任務(wù),C/OS-,允許用戶結(jié)束延時正處于延時期的任務(wù)。延時的任務(wù)可以不等待延時期滿,而是通過其它任務(wù)取消延時來使自己處于就緒態(tài)。這可以通過調(diào)用,OSTimeDlyResume,(),和指定要恢復(fù)的任務(wù)的優(yōu)先級來完成。,12,3.,系統(tǒng)時間,,OSTimeGet,(),和,OSTimeSet,(),INT32U,OSTimeGet,(void),INT32U ticks;,OS_ENTER_CRITICAL();,ticks=,OSTime,;,OS_EXIT_CRITICAL();,return(ticks);,void,OSTimeSet,(INT32U ticks),OS_ENTER_CRITICAL();,OSTime,=ticks;,OS_EXIT_CRITICAL();,系統(tǒng)節(jié)拍計數(shù)器,13,