UCOSIII中斷的相關處理及延時的處理
中斷管理
- UCOSIII支援中斷巢狀的,高優先順序的中斷可以打斷低優先順序的中斷,最高支援250級中斷巢狀,OSInitNestingCtr就是記錄中斷巢狀層數的(進入+1,退出-1)。
- 中斷會打斷正在執行的的任務,轉而執行中斷服務程式,但是如果在執行中斷服務程式時有比之前更高優先順序的任務就緒,當退出中斷服務程式的時候,cpu就會直接執行這個更高級別的任務。
- 編寫中斷服務函式
- 例程:
void XXX_Handler(void) { OSIntEnter(); //進入中斷 /*........... 使用者自己編寫的程式碼。 ...........*/ OSInitExit(); //觸發任務切換軟中斷 }
-
XXX為不同中斷源的中斷函式的名字
- 例程:
-
直接釋出和延時釋出
-
通過巨集OS_CFG_ISR_POST_DEFERRED_EN定義。(1:延時釋出,0:直接釋出)
-
延時模式下:中斷服務程式呼叫系統的釋出函式時,系統不會直接呼叫,而是將這個釋出函式呼叫和相應的引數寫入到專用的佇列中,該佇列稱為中斷佇列,然後使中斷佇列處理任務進入就緒態。
-
一般使用延時釋出,直接釋出會導致中斷響應時間延長。
-
延時釋出模式下:UCOSIII通過關閉中鎖定任務排程來保護臨界程式碼
-
直接釋出模式下:UCOSIII通過關閉中斷來保護臨界程式碼。
-
在中斷佇列處理任務訪問佇列時仍然需要關閉中斷,但是提取釋出函式需要的引數後會開啟中斷,然後用鎖定任務排程器進行釋出函式呼叫。
-
臨界程式碼保護
有些程式碼需要保證其完成執行,不能被打斷,這些程式碼稱為臨界程式碼,也叫臨界區
- 進入臨界區:OS_CRITICAL_ENTER()
- 退出臨界區:OS_CRITICAL_EXIT()或OS_CRITICAL_NO_SCHED()
- 當巨集OS_CFG_ISR_POST_DEFERRED_EN定義為0時,進入臨界區會使用關中斷的方法,定義為1的時候進入臨界區會使用給任務排程器上鎖的方法(不關閉中斷,中斷可打斷)。
延時函式具體使用
OSTimeDly()函式
- 原型:void OSTimeDly(OS_TICK dly,OS_OPT opt,OS_ERR *p_err)
- dly: 指定延時的時間長度,單位為時間節拍數
- opt: 指定的延時使用選項,有四種選項
- OS_OPT_TIME_DLY 相對模式(不是很準確,偶爾會相差+-一個節拍)
- OS_OPT_TIME_TIMEOUT 同上
- OS_OPT_TIME_MATCH 絕對模式(指上電後多少個時間節拍來執行)
- OS_OPT_TIME_PERIODIC 週期模式(用於長時間執行的週期性延時)
- p_err : 指向呼叫該函式後返回的錯誤碼
OSTimeDlyHMSM()函式(常用的)
原型:void OSTimeDlyHMSM(CPU_INT16U hours, //需要延時的小時數
CPU_INT16U minutes, //需要延時的分鐘數
CPU_INT16U seconds, //需要延時的秒數
CPU_INT32U milli, //需要延時的毫秒數
CPU_OPT opt, //選項
OS_ERR *p_err)
opt :相比OSTimeDly()函式多兩個選項OS_OPT_TIME_HMSM_STRICT和OS_OPT_TIME_HMSM_NON_STRICT。
(範圍不同:第一個:hours:0~99,minutes:0~60,seconds:0~59,milli:0~999。
第二個:hours:0~999,minutes:0~9999,seconds:0~65535,milli:0~4294967259)