久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

實時操作系統的任務調度原因分析

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


最近看了一些實時操作系統的源碼,關于任務調度是實時操作系統的重要組成部分,但是何時發生調度,怎樣才能發生調度卻不是非常的清晰,書中一本而言所說的都是“如果有更高優先級任務就緒,就會發生調度”,這會讓很多的讀者產生很大的歧義:
在當前的任務中,并沒有關于就緒表等全局變量的訪問,當前的任務也有自己的堆棧空間,我并不知道是否有更高優先級的任務就緒,之所以產生這些疑惑是沒有搞清楚什么時候發生調度,怎么知道需要調度。當前運行的任務,一般而言就是所謂的最高優先級的任務,在沒有訪問一系列全局變量的過程中,內核又是如何知道存在一個更高優先級的任務被就緒了呢?
 
一般而言,對于搶占型實時內核,一般在同步、或者通信的過程中會主動的調用調度函數,或者任務的掛起函數中使用調度函數,其他的函數中并沒有發現其他的調度函數,而且這種情況下都是手動的調度任務,那么在沒有這些函數的情況下,實時操作系統中內核是如何知道需要調度的呢?
 
我仔細查找了一些資料,別人總結了一些操作系統發生調度的原因如下:
  (1)正在執行的進程執行完畢。這時,如果不選擇新的就緒進程執行,將浪費處理機資源。
  (2)執行中進程自己調用阻塞原語將白己阻塞起來進入睡眠等狀態。
  (3)執行中進程調用了P原語操作,從而因資源不足而被阻塞;或調用了v原語操作激活了等待資源的進程隊列。
  (4)執行中進程提出I/O請求后被阻塞。
  (5)在分時系統中時間片已經用完。
  (6)在執行完系統調用等系統程序后返回用戶進程時,這時可看作系統進程執行完畢,從而可調度選擇一新的用戶進程執行。
  以上都是在可剝奪方式下的引起進程調度的原因。在CPU執行方式是可剝奪時.還有
  (7)就緒隊列中的某進程的優先級變得高于當前執行進程的優先級,從而也將引發進程調度。
我對比了在實時操作系統中經常使用的調度方式發現,原因(2)、(3)、(7)是主要的原因,其他的一般在實時操作系統中很難找到。但是這還是不能回答什么時候發生調度這個問題。
 
我認為在實時操作系統中發生調度的主要有兩個部分:
(1)自身需要睡眠等待,必須手動的調用調度函數(信息量,或者通信機制)。
(2)發生中斷過,當執行完中斷服務函數以后,需要重新調度。
 
其中原因(2)是我們在分析實時操作系統中實時性能的主要因素,很多人又會有很多的疑問,如果操作系統中很少使用中斷,實質上在實時系統中必須存在的一個中斷就是時間節拍中斷,這個中斷的存在就能保證實時操作系統的實時型。這個時間節拍選擇也是設計過程中必須注意的。我們可以參看uC/OS-II的時間節拍代碼,其中完成了所有對非任務掛起的任務的就緒操作(時間到期),這時也就知道了那個任務需要我們調度。在其他的中斷服務函數執行完成以后也就需要那個任務需要被執行,進而實現了實時操作。

 

    void OSTimeTick (void)
    {
    #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
        OS_CPU_SR cpu_sr;
    #endif
        OS_TCB *ptcb;

        OSTimeTickHook(); /* Call user definable hook */
    #if OS_TIME_GET_SET_EN > 0
        OS_ENTER_CRITICAL(); /* Update the 32-bit tick counter */
        OSTime++;
        OS_EXIT_CRITICAL();
    #endif
        if (OSRunning == TRUE) {
            ptcb = OSTCBList; /* Point at first TCB in TCB list */
            while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */
                OS_ENTER_CRITICAL();
                if (ptcb->OSTCBDly != 0) {                     /* Delayed or waiting for event with TO */
                    if (--ptcb->OSTCBDly == 0) { /* Decrement nbr of ticks to end of delay */
                        if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { /* Is task suspended? */
                            OSRdyGrp |= ptcb->OSTCBBitY; /* No, Make task R-to-R (timed out)*/
                            OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                        } else {
                                /* Yes, Leave 1 tick to prevent ... */
                            ptcb->OSTCBDly = 1; /* ... loosing the task when the ... */
                        } /* ... suspension is removed. */
                    }
                }
                ptcb = ptcb->OSTCBNext; /* Point at next TCB in TCB list */
                OS_EXIT_CRITICAL();
            }
        }
    }

從上面的代碼中我們可以知道每個任務都會被掃描一次,檢測是否能夠就緒,如果能夠就緒就將就緒表中的值設置,這樣也就知道了是否有更高優先級的任務就緒,是否需要調度操作。因為時間節拍中斷的不斷發生就能保證最高優先級任務的發生。因此時間節拍中斷函數是在實時操作系統中非常重要的函數之一。當然任務之間切換以及在中斷中切換到新的任務中的切換代碼也是非常重要的,但是這些一般涉及到CPU寄存器的值,需要匯編代碼實現。
因為中斷完成以后很多的任務可能因為信號量等信息的釋放已經就緒,這時候必然需要任務的調度操作,這時候也就知道了那個任務是最高優先級的,那個任務應該被執行。這時也就是發生調度的時刻。
 
在UC/OS-II中通常采用關閉中斷的方式進入臨界區,因為關閉了中斷,所有的中斷服務函數都不會被執行,也就不會發生任務的調度。那么只有一個情況才會發生調度,也就是任務自身需要睡眠,手動選擇調度函數,但是在臨界區中不應該發生睡眠等,因此也就不可能手動調度,因此所有發生調度的可能都被清除了,這樣也就保證了臨界區代碼的安全性。
 

關閉窗口

相關文章

主站蜘蛛池模板: 亚洲精品电影网在线观看 | 国产成人在线视频 | 亚洲精品一区二区 | 亚洲毛片一区二区 | 69av网| 欧美日韩电影一区二区 | 国产精品毛片无码 | 欧美一区二区在线观看视频 | 久久九九色 | 人人人艹 | 日日人人 | 波多野结衣一二三区 | 国产精品久久久久久妇女6080 | 国产91精品久久久久久久网曝门 | 一区二区三区四区国产 | 免费黄网站在线观看 | 国产亚洲二区 | 毛片免费视频 | 国产中文| 国产精品免费在线 | 午夜av电影院 | 在线成人| 一区二区三区免费观看 | 一级黄a| 国产欧美在线观看 | 亚洲天堂中文字幕 | 日韩久久久久久久久久久 | 欧美日韩在线观看视频 | 国产精品美女久久久久久久久久久 | 中文字幕日韩一区 | 综合久久久 | 久久精品免费观看 | 久久av网站 | 欧美一区二区免费电影 | 自拍偷拍一区二区三区 | 亚洲视频在线一区 | 日韩精品一区二区三区视频播放 | caoporn国产精品免费公开 | 日本久久精品视频 | 久久99精品久久久久久国产越南 | 午夜一区二区三区在线观看 |