<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        關于uC/OS-II中的任務掛起討論

        作者:龔平   來源:本站原創   點擊數:  更新時間:2014年03月14日   【字體:

         

        最近對實時操作系統比較感興趣,然后就仔細閱讀了一番uC/OS-II的代碼,之前也初略的閱讀過,但是這次閱讀確實有不少的收獲。

        uC/OS-II是經典的實時操作系統,開源的優點就是可以使用者自己去分析和裁剪。我就簡單的說明一下uC/OS-II中的任務掛起以及任務喚醒操作。

        在uC/OS-II中任務之間的切換比較簡單,就是運行態-就緒態-掛起態(等待態)-中斷服務態-睡眠態,其中睡眠態主要是指沒有被創建的任務,也就是我們可以定義很多的任務,但是不一定全部創建,當然也可以是被刪除以后的任務,我們也可以稱之為睡眠態,這也是我們不經常使用的任務。其他的中斷服務態實際上就是在中斷服務中,他的運行級別是最高的。就緒態就是已經做好運行準備的狀態,運行態永遠只有一個任務處于運行態。而掛起態或者稱等待態是最復雜的過程,其中牽涉到很多中不同的掛起狀態。

        幾種典型的掛起態我做一下總結:

        1、任務的掛起操作,一般都是采用OSTaskSuspend()將任務掛起,這種掛起的操作一般都是比較簡單的將就緒表中優先級對應的位和組分別清除即可,而這種掛起的方式被喚醒的方式有且只有一種,即采用OSTaskResume()函數將就緒表中優先級對應的位和組就緒即可。這也應該說是最準確的掛起,而不是所謂的等待態。

        2、任務中調用時間延遲函數的掛起方式,準確的說這種掛起就是等待態,我們所謂的延遲等待,基本的實現原理就是通過節拍服務函數OSTimeTick()減小延遲等待時間,這個實際上就是對任務控制塊OS_TCB中的變量OSTCBDly操作而實現的。在OSTCBDly>0期間將任務在就緒表中的位和組分別清除,是任務處于掛起操作,這種掛起實質和任務的掛起方式相同。但是OSTimeTick()的實現過程會檢測任務是否是被OSTaskSuspend()掛起,也就是真正的掛起態,只有當任務不是被OSTaskSuspend()掛起時才能被喚醒,這是需要注意的。

        3、關于通信機制、同步過程中的任務掛起,這種任務掛起實質上是任務等待狀態,實現的過程中會涉及到兩個續表,其中一個就是任務就緒表,另一個是任務等待續表,另外為了實現等待超時等問題,將OSTCBDly也考慮了進來,這樣也就使得這種任務的等待比之前的兩種掛起方式要復雜。但是等待超時與等待延遲有一定的相似之處,但不同的地方就是需要將等待續表中對應的優先級位置清除,再設置就緒表中的位置位1,返回超時錯誤,這樣就能實現超時的掛起操作,而一般的事件等待機制,都是涉及到中斷、任務與任務之間的通信或者同步問題,掛起操作首先將任務在就緒表中的就緒標志位清除,同時設置任務的狀態為某種形式的掛起,然后設置等待續表中的相關位置,最后實現任務的調度。任務的喚醒操作是另一個任務發出信號,然后從等待續表中清除最高優先級的任務,然后設置該任務在就緒表中的位置,并設置任務的狀態,最后實現任務的調度操作。一行就能實現任務的掛起操作。

        綜合上面的總結可以知道uC/OS-II的任務掛起操作主要是3種,其中前兩種相比而言比較簡單,只是簡單的依靠就緒表或者時間延遲變量即可實現。而當涉及到任務的同步等機制時就會依靠就緒表,等待續表,以及時間延遲變量。但是任務的掛起和睡眠本質上也是存在差別的,并不是同一種概念,因此我們在學下uC/OS-II的過程中需要特別注意。
         

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮