《嵌入式操作系統(tǒng)教程-第八章》由會員分享,可在線閱讀,更多相關《嵌入式操作系統(tǒng)教程-第八章(13頁珍藏版)》請在裝配圖網上搜索。
1、第一章 操作系統(tǒng)的基本概念,*,*,*,嵌入式操作系統(tǒng)基礎 第八章,uC,/OS-II,的中斷與時鐘,第八章,uC,/OS-II,的中斷與時鐘,uC,/OS-II,的中斷,uC,/OS-II,的時鐘,uC,/OS-II,的管理問題,1,第八章,uC,/OS-II,的中斷和時鐘,一、,uC,/OS-II,的中斷過程,1.,中斷,:應內部或外部異步事件的請求終止當前任務,而去處理異步事件所要球的任務的過程。,2.,中斷服務子程序,:應中斷請求而運行的程序。,3.,中斷向量,:沖斷服務子程序的入口地址。,4.,中斷嵌套,:,uC,/OS-II,允許中斷過程中響應更高級的中斷請求。,8.1,uC,/O
2、S-II,的中斷,2,5.,中斷服務子程序,保存全部,CPU,寄存器,;,(1),調用,OSIntEnter,(),或,OSIntNesting,直接加,1;,(2),執(zhí)行用戶代碼做中斷服務,;,(3),調用,OSIntExit,(),;,(4),恢復所有,CPU,寄存器;,(5),執(zhí)行中斷返回指令;,(6),uC,/OS-II,系統(tǒng)通常用一個任務來完成異步事件的處理工作,而在終端服務程序中只是通過向任務發(fā)送消息的方法來激活這個任務。,3,4,6.,兩個重要的中斷函數,void,OSIntExit,(void),OS_ENTER_CRITICAL();(1),if(-,OSIntNesting
3、,|,OSLockNesting,)=0)(2),OSIntExitY,=,OSUnMapTblOSRdyGrp,;(3),OSPrioHighRdy,=(INT8U)(OSIntExitY,OSTCBStkPtr,;,/,使,SP,指向待運行任務堆棧,用出棧指令把,R!,R2,彈入處理器的通用寄存器;,REIT;,/,中斷返回,使,PC,指向待運行任務,7,三、,臨界段的處理,1.,臨界段,:應用程序中經常有些代碼段必須不受任何干擾的運行,把這樣的代碼段叫,臨界段,。,2.,服務于中斷的兩個宏:,#define OS_ENTER_CRITICAL(),cpu_sr,=,get_process
4、or_psw,();,/,保存狀態(tài)字,disable_interruptw,();,#define OS_EXIT_CRITICAL(),set_processor_psw(cpu_sr,);,/,恢復狀態(tài)字,8,8.2,uC,/OS-II,的時鐘,1.,時鐘,:任何系統(tǒng)都要提供一個周期性的型號源,以供系統(tǒng)處理諸如任務的等待、延時等與時間有關的事件,此信號源就叫系統(tǒng),時鐘,。,2.,時鐘節(jié)拍,:兩次中斷之間的間隔的時間,此時間稱為,時鐘節(jié)拍,。時鐘節(jié)拍的中斷服務程序代碼如下:,void,OSTickISR(void,),保存處理器寄存器的值;,調用,OSIntEnter,(),或是將,OSIn
5、tNesting,加,1;,調用,OSTimeTick,();,調用,OSIntExit,();,恢復處理器寄存器的值,;,執(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_ST
6、AT_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();,捕捉當前顯示,以便返回,轉等待為就緒,計時器,10,8.3,uC,/OS-II,的時間管理,1.,任務延時,:,uC,/OS-II,系統(tǒng)按任務優(yōu)先級調度任務,其內
7、核為可剝脫型,為避免低級任務長時間得不到運行,系統(tǒng)規(guī)定:除,IdleTask,外,運行任務必須在合適時段暫停運行一段規(guī)定時間。任務延時函數,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();,
8、OSSched,();(4),11,2.,恢復正在延時任務,C/OS-,允許用戶結束延時正處于延時期的任務。延時的任務可以不等待延時期滿,而是通過其它任務取消延時來使自己處于就緒態(tài)。這可以通過調用,OSTimeDlyResume,(),和指定要恢復的任務的優(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é)拍計數器,13,