新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 時間片調度在單片機中的運用

        時間片調度在單片機中的運用

        作者: 時間:2016-11-25 來源:網絡 收藏
        單片機在系統中充當 CPU 的角色,需要同時處理多個事務。如與 PC 機通信,將收到的信息轉發給從機,監視數據處理情況等一些繁雜而又重

        本文引用地址:http://www.104case.com/article/201611/321180.htm

        要的事情。如何協調好各個事務之間的關系,并有條不紊的執行各個事務,這就需要在編寫程序時采用合適的算法進行處理。一般的方法就

        是在單片機中移植操作系統,由操作系統來管理各個事務。但由于系統要占用一定的內部資源,這對本身資源非常有限的單片機來說是不現

        實的。所以,很少在單片機中采用操作系統,而是采用時間片輪詢調度的方法進行各任務的管理。

        時間片輪詢調度是一種古老而又簡單的算法,廣泛運用于無操作系統的微處理器中。在系統中,每個進程被分配一個時間段,稱作時間片,

        即該進程允許運行的時間。如果在時間片結束時進程還在運行,則 CPU 將被剝奪并分配給另一個進程。如果進程在時間片結束前阻塞或結束

        ,則 CPU 當即進行切換。調度程序所要做的就是維護一張就緒進程列表,當進程用完它的時間片后,它被移到隊列的末尾。

        時間片輪詢調度中有趣的一點是如何確定時間片的長度。從一個進程切換到另一個進程是需要一定時間的,因為要保存和裝入寄存器值及內

        存映像等保護現場的工作,更新各種表格和隊列等。假如進程切換,有時稱為上下文切換,需要的時間為 5 毫秒,再假設時間片長度設定為

        20 毫秒,則在做完 20 毫秒有用的工作之后, CPU 將花費 5 毫秒來進行進程切換。 CPU 時間的 20% 被浪費在了管理開銷上。進程切換時間一定的情

        況下,如果時間片長度設定的越小時,這種浪費更明顯。所以,時間片長度與 CPU 利用率是一對不可調和的矛盾,必須處理好它們之間的關

        系。

        為了提高 CPU 效率,我們可以將時間片長度設得大一些,這時浪費的時間只有就會相對減小。但在一個分時系統中,各個任務對時間片長度

        的要求是不一致的。例如在一個系統中,可能要求每秒鐘更新一下顯示內容,每幾十毫秒要掃描一下按鍵,每幾毫秒要檢測一下串口緩沖區

        等……可見,各個任務對時間的依賴程度是不一樣的。如果時間片設得太長,某些對實時性要求高的任務可能得不到執行,使得系統的實時

        性變差。總之,時間片的設定應滿足對實時性要求最高的那個任務,這樣才能確保每個任務都可以及時得到執行而不被錯過。

        要在一個單片機系統中實現時間片輪詢調度,需要依照以下的步驟 :

        2 確定任務總數及各個任務實對時間實時性的要求

        2 根據任務對時間的要求,確定時間片的長度

        2 估算執行每個任務所花費的時間,確保任務能夠在時間片的長度內執行完畢

        2 如果任務較大,時間片不足于讓任務執行完,此時可細化該任務

        在下面的代碼片段中,共有 4 個任務需要執行,其中串口對實時性的要求最高。串口采用的波特率為 2400Baud , 8 位數據,無校驗, 1 個停止

        位。所以傳輸 1 字節數據所需時間為: 4.17ms ,故將時間片長度設定在 4ms 是合理的。單片機主機系統的時間片處理函數如下所示:

        #pragma interrupt_handler timer1_ovf_isr:9

        void timer1_ovf_isr(void)

        {

        //TIMER1 has overflowed

        TCNT1H = 0xF0; //reload counter high value

        TCNT1L = 0x60; //reload counter low value

        TimeCount++;

        if(TimeCount==50){TimeCount=0; CC1100_SendFlag=1;} // 無線收發任務處理標志

        TimeOver(); // 超時檢測函數

        Alarm_Detect(); // 告警檢測函數

        DealComFlag=1; // 串口任務處理標志

        }

        在主函數中,根據標志位調用相應的函數進行數據處理,然后將標志位清除,等到下一個時間片到來后再開始新一輪的數據處理。

        int main(void)

        {

        if(CC1100_SendFlag==1) { ... ; CC1100_SendFlag=0; } // 無線收發任務處理標志

        if(DealComFlag==1){ ... ; DealComFlag=0; } // 串口任務處理標志

        ......

        }



        關鍵詞: 時間片調度單片

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 吴忠市| 中方县| 张家口市| 永胜县| 沈阳市| 原平市| 竹北市| 达州市| 哈巴河县| 政和县| 吴忠市| 鸡泽县| 永定县| 旌德县| 东台市| 惠安县| 余庆县| 新野县| 平舆县| 濮阳市| 广饶县| 高淳县| 东丽区| 呼伦贝尔市| 红桥区| 南华县| 屏南县| 布尔津县| 大足县| 高安市| 两当县| 梨树县| 柞水县| 五原县| 林周县| 宜君县| 霸州市| 龙海市| 株洲市| 东平县| 永兴县|