UCOS III學習(五)

一、UCOS III中斷管理

1、中斷函數的一般形式

中斷:應內部或外部異步事件的請求中止當前任務,而去處理異步事件所要求的任務的過程叫做中斷。
UCOSIII中中斷服務函數一般格式如下

void USART1_IRQHandler(void)
{
       OSIntEnter();			//中斷進入函數
      //中斷服務程序
      OSIntExit();				//中斷退出函數
}  

中斷進入函數的主要內容就是中斷計數,對於絕大多數單片機都支持終端的嵌套,允許高優先級中斷打斷低優先級中斷,這一關係同樣適用於UCOS III ,在UCOS III中使用OSIntNestingCtr變量來保存中斷嵌套層數,每進入一次中斷就會進入一次中斷進入函數就會對OSIntNestingCtr加1

void  OSIntEnter (void)
{
      if (OSRunning != OS_STATE_OS_RUNNING) {
	  return
      }
      if (OSIntNestingCtr >= (OS_NESTING_CTR)250u) {
            return; 
      }
     OSIntNestingCtr++;
}

與之對應的中斷退出函數,會在每次退出中斷前被調用,然後對OSIntNestingCtr進行減1操作。

2、中函數中的信號量與消息發佈

中斷函數中若出現了信號發佈或者消息發佈函數,UCOSIII可以選擇採取兩種處理方式:1直接發佈2延遲發佈,兩種模式的選擇則是通過宏OS_CFG_ISR_POST_DEFERRED_EN來選擇,當宏OS_CFG_ISR_POST_DEFERRED_EN爲0時,採取直接發佈模式,反正宏OS_CFG_ISR_POST_DEFERRED_EN爲1時,採取延遲發佈模式。
兩種模式的區別:當處於直接模式下,系統進入臨界態是通過關閉中斷的方式來進行臨界段代碼的保護,當系統處於 延遲模式下時,系統採取鎖定任務調度器的方式進行臨界段的代碼保護。
要說明的是:無論哪一種模式下中斷服務程序都需要執行完畢,才能進行任務的調度,此前因爲中斷髮生而被打斷的任務會進入就緒狀態,等待中斷指向完畢再進行一次任務調度。
1、直接發佈
在這裏插入圖片描述
直接發佈模式下,信號發佈與消息發佈都會直接被執行,待中斷執行完畢後進行任務調度,若原來被打斷的任務的優先級爲最高優先級,則繼續執行該任務,若有因爲得到中斷中發佈的信號量或消息而進入就緒狀態且該任務的優先級更高,則運行該任務。

2,延遲發佈
在這裏插入圖片描述
延遲發佈比直接發佈稍顯複雜,他不會在中斷服務程序內直接執行發佈消息或信號量的函數,而是將這些函數和相應的參數寫入中斷隊列並使中斷隊列處理函數進入就緒狀態,當中斷服務程序運行結束,由於就緒狀態下中斷隊列處理函數的優先級爲0一定是最高的,因此會先執行中斷處理函數,將會先鎖定任務調度器,待所有的消息發佈函數和信號量發佈函數執行完畢,重新進行任務調度。若出現比被中斷打斷任務優先級更高的任務則執行新任務,若沒有則繼續執行原任務。

二、UCOSIII 時間管理

1、任務延遲

UCOSIII中的任務是一個無限循環並且還是一個搶佔式內核,爲了使高優先級的任務不至於獨佔CPU,可以給其他優先級較低任務獲取CPU使用權的機會,UCOSIII中除空閒任務外的所有任務必須在合適的位置調用系統提供的延時函數,讓當前的任務暫停運行一段時間並進行一個任務切換。延時函數有兩種,OSTimeDly()和OSTimeDlyHMSM()。
OSTimeDly()函數有三種工作模式:相對模式、週期模式和絕對模式。
OSTimeDlyHMSM()函數僅在相對模式下工作。

void  OSTimeDly (OS_TICK   dly,					//延時時間片數
                 OS_OPT    opt,					//延遲選項
                 OS_ERR   *p_err)				//保存報錯信息

opt選項
OS_OPT_TIME_DLY 相對模式
OS_OPT_TIME_TIMEOUT 與OS_OPT_TIME_DLY相同
OS_OPT_TIME_MATCH 絕對模式
OS_OPT_TIME_PERIODIC 週期模式

void  OSTimeDlyHMSM (CPU_INT16U   hours,				//以小時爲單位
                     CPU_INT16U   minutes,				//以分鐘爲單位
                     CPU_INT16U   seconds,				//以秒爲單位
                     CPU_INT32U   milli,				//以毫秒爲單位
                     OS_OPT       opt,					//延遲選項
                     OS_ERR      *p_err)				//返回報錯信息	

opt選項
包含OSTimeDly()函數的四個選項的基礎上,新增兩個選項,OS_OPT_TIME_HMSM_STRICT選項下小時計數範圍0~99,分鐘計數範圍0到59,秒範圍0到59,毫秒範圍0到999.
OS_OPT_TIME_HMSM_NON_STRICT選項下,小時範圍0到999,分鐘範圍0到9999,秒範圍0到65535,毫秒範圍0到4294967259.

2、取消延遲函數

延時任務任務可通過在其他任務中調用函數OSTimeDlyResume()取消延時而進入就緒狀態,此函數最後會引發一次任務調度。

3、獲取和設置系統時間:

UCOSIII定義了一個CPU_INT32U類型的全局變量OSTickCtr來記錄系統時鐘節拍數,在調用OSInit()時被初始化爲0,以後每發生1個時鐘節拍,OSTickCtr加1。
OSTimeSet()允許用戶改變當前時鐘節拍計數器的值,慎用!!!!!
OSTimeGet()用來獲取動遷時鐘節拍計數器的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章