1. 程式人生 > >UCOSIII中斷的相關處理及延時的處理

UCOSIII中斷的相關處理及延時的處理

中斷管理

  1. UCOSIII支援中斷巢狀的,高優先順序的中斷可以打斷低優先順序的中斷,最高支援250級中斷巢狀,OSInitNestingCtr就是記錄中斷巢狀層數的(進入+1,退出-1)。
  2. 中斷會打斷正在執行的的任務,轉而執行中斷服務程式,但是如果在執行中斷服務程式時有比之前更高優先順序的任務就緒,當退出中斷服務程式的時候,cpu就會直接執行這個更高級別的任務。
  3. 編寫中斷服務函式
    1. 例程:
      void XXX_Handler(void)
      {
          OSIntEnter();           //進入中斷
          
          /*...........
          使用者自己編寫的程式碼。
          ...........*/             
          OSInitExit();          //觸發任務切換軟中斷
      }
    2. XXX為不同中斷源的中斷函式的名字

  4. 直接釋出和延時釋出

    1. 通過巨集OS_CFG_ISR_POST_DEFERRED_EN定義。(1:延時釋出,0:直接釋出)

    2. 延時模式下:中斷服務程式呼叫系統的釋出函式時,系統不會直接呼叫,而是將這個釋出函式呼叫和相應的引數寫入到專用的佇列中,該佇列稱為中斷佇列,然後使中斷佇列處理任務進入就緒態。

    3. 一般使用延時釋出,直接釋出會導致中斷響應時間延長。

    4. 延時釋出模式下:UCOSIII通過關閉中鎖定任務排程來保護臨界程式碼

    5. 直接釋出模式下:UCOSIII通過關閉中斷來保護臨界程式碼。

    6. 在中斷佇列處理任務訪問佇列時仍然需要關閉中斷,但是提取釋出函式需要的引數後會開啟中斷,然後用鎖定任務排程器進行釋出函式呼叫。

臨界程式碼保護

有些程式碼需要保證其完成執行,不能被打斷,這些程式碼稱為臨界程式碼,也叫臨界區

  1. 進入臨界區:OS_CRITICAL_ENTER()
  2. 退出臨界區:OS_CRITICAL_EXIT()或OS_CRITICAL_NO_SCHED()
  3. 當巨集OS_CFG_ISR_POST_DEFERRED_EN定義為0時,進入臨界區會使用關中斷的方法,定義為1的時候進入臨界區會使用給任務排程器上鎖的方法(不關閉中斷,中斷可打斷)。

延時函式具體使用

OSTimeDly()函式

  1. 原型:void OSTimeDly(OS_TICK    dly,OS_OPT  opt,OS_ERR       *p_err)
  2. dly:     指定延時的時間長度,單位為時間節拍數
  3. opt:     指定的延時使用選項,有四種選項
    1. OS_OPT_TIME_DLY     相對模式(不是很準確,偶爾會相差+-一個節拍)
    2. OS_OPT_TIME_TIMEOUT    同上
    3. OS_OPT_TIME_MATCH     絕對模式(指上電後多少個時間節拍來執行)
    4. OS_OPT_TIME_PERIODIC      週期模式(用於長時間執行的週期性延時)
  4. 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)