嵌入式Linux和WinCE應用線程時間片分析比較


原文地址::http://www.emtronix.com/article/article2011427.html


相關文章

1、WINCE 能實現每秒5000次中斷嗎?有沒有高手做過,請賜教----http://bbs.csdn.net/topics/300237369?page=2

2、wince5 ISR中如何傳遞數據(高分求助)----http://bbs.csdn.net/topics/340268198



    對於一個嵌入式多任務、多線程操作系統,所啟動的應用進程至少擁有一個線程或多個線程,線程在進程中執行代碼。一個進程能夠“同時”運行多個線程,“同時”加上引號,因為實際上,在單處理CPU平台上,任何時刻,只有一個線程在執行。操作系統通過任務調度算法快速切換線程來模擬多線程並行,交替地停止一個線程,然后切換到另外一個上運行。支持任務優先級,高優先級線程比低優先級線程更先執行,也就是說低優先線程必須等到高優先級線程被阻塞掛起后才可能被調度。對於優先級別相等的線程使用輪換算法來調度。

 

        無論是WinCE還是Linux操作系統,應用線程的運行總是涉及到兩個基本的參數:一個是系統分配給線程的時間片,一個是系統調度的時間間隔。Linux和WinCE下這兩個參數有所不同,如下表所示:

 

WinCE

嵌入式Linux

  線程的運行時間片

100ms

10ms

  系統調度間隔

1ms

10ms

 

        這里需要注意的是,線程不一定需要將時間片完全用完,事實上,在嵌入式系統中,線程的運行處理時間通常都遠小於所分的時間片,這時線程應當調用相關系統函數將自己掛起,系統將立即進行線程重調度。這時的重調度實際是加快了各個線程的輪片,提高了多線程並行運行的程度,客觀上保證了嵌入式設備的實時響應能力。

 

        如果線程運行處理的時間超過了系統分配的時間片,在到達時間片后系統將強制掛起該線程,進行任務調度,以保證其他線程的運行。所以在多任務的程序設計中,特別忌諱線程中出現長時間查詢代碼,如:


while( bFlag == FALSE ) 

        // Polling Flag… 
}


        這種代碼總是占完了時間片,大大地浪費CPU資源,使得整個進程的線程調度變得很慢,比如對於WinCE來說,就會出現100ms才調度一次,如果有10個這樣的線程,意味着每個線程需要1s才能輪詢一次,在嵌入式應用中,就很容易出現數據丟失等錯誤,從而無法實現正常的功能。對於Linux也是存在同樣的問題。

 

        在實際應用中,常用的掛起線程的方法是調用延時函數。對於WinCE,調用Sleep( ms )函數;對Linux,可以調用select( )函數來掛起當前線程。由於系統的調度間隔不一樣,對相同的掛起時間,系統會有不同的處理。比如,設置掛起時間為2ms,在WinCE中,將在掛起2ms之后的1ms后,被系統重新調度;在Linux中,由於調度間隔大於掛起的時間,所以系統將在線程掛起10ms之后才被重新調度,也就是說在Linux下,無論程序中設置的掛起時間2ms還是9ms,該線程實際被掛起的時間總是10ms。



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com