電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 1477|回復(fù): 0
收起左側(cè)

如何從零基礎(chǔ)學嵌入式_英創(chuàng)信息技術(shù)應(yīng)用線程時間片分析比較介紹

[復(fù)制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

積分
7472
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-7-22 10:52:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如何從零基礎(chǔ)學嵌入式_英創(chuàng)信息技術(shù)應(yīng)用線程時間片分析比較介紹,   

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

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

WinCE

嵌入式Linux
   線程的運行時間片
100ms

10ms
   系統(tǒng)調(diào)度間隔
1ms

10ms


        這里需要注意的是,線程不一定需要將時間片完全用完,事實上,在嵌入式系統(tǒng)中,線程的運行處理時間通常都遠小于所分的時間片,這時線程應(yīng)當調(diào)用相關(guān)系統(tǒng)函數(shù)將自己掛起,系統(tǒng)將立即進行線程重調(diào)度。這時的重調(diào)度實際是加快了各個線程的輪片,提高了多線程并行運行的程度,客觀上保證了嵌入式設(shè)備的實時響應(yīng)能力。

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


while( bFlag == FALSE )
{
         // Polling Flag…
}

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

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

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表