<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

時(shí)間片調度在單片機中的運用

作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò ) 收藏
單片機在系統中充當 CPU 的角色,需要同時(shí)處理多個(gè)事務(wù)。如與 PC 機通信,將收到的信息轉發(fā)給從機,監視數據處理情況等一些繁雜而又重

本文引用地址:http://dyxdggzs.com/article/201611/321180.htm

要的事情。如何協(xié)調好各個(gè)事務(wù)之間的關(guān)系,并有條不紊的執行各個(gè)事務(wù),這就需要在編寫(xiě)程序時(shí)采用合適的算法進(jìn)行處理。一般的方法就

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

實(shí)的。所以,很少在單片機中采用操作系統,而是采用時(shí)間片輪詢(xún)調度的方法進(jìn)行各任務(wù)的管理。

時(shí)間片輪詢(xún)調度是一種古老而又簡(jiǎn)單的算法,廣泛運用于無(wú)操作系統的微處理器中。在系統中,每個(gè)進(jìn)程被分配一個(gè)時(shí)間段,稱(chēng)作時(shí)間片,

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

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

時(shí)間片輪詢(xún)調度中有趣的一點(diǎn)是如何確定時(shí)間片的長(cháng)度。從一個(gè)進(jìn)程切換到另一個(gè)進(jìn)程是需要一定時(shí)間的,因為要保存和裝入寄存器值及內

存映像等保護現場(chǎng)的工作,更新各種表格和隊列等。假如進(jìn)程切換,有時(shí)稱(chēng)為上下文切換,需要的時(shí)間為 5 毫秒,再假設時(shí)間片長(cháng)度設定為

20 毫秒,則在做完 20 毫秒有用的工作之后, CPU 將花費 5 毫秒來(lái)進(jìn)行進(jìn)程切換。 CPU 時(shí)間的 20% 被浪費在了管理開(kāi)銷(xiāo)上。進(jìn)程切換時(shí)間一定的情

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

系。

為了提高 CPU 效率,我們可以將時(shí)間片長(cháng)度設得大一些,這時(shí)浪費的時(shí)間只有就會(huì )相對減小。但在一個(gè)分時(shí)系統中,各個(gè)任務(wù)對時(shí)間片長(cháng)度

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

等……可見(jiàn),各個(gè)任務(wù)對時(shí)間的依賴(lài)程度是不一樣的。如果時(shí)間片設得太長(cháng),某些對實(shí)時(shí)性要求高的任務(wù)可能得不到執行,使得系統的實(shí)時(shí)

性變差??傊?,時(shí)間片的設定應滿(mǎn)足對實(shí)時(shí)性要求最高的那個(gè)任務(wù),這樣才能確保每個(gè)任務(wù)都可以及時(shí)得到執行而不被錯過(guò)。

要在一個(gè)單片機系統中實(shí)現時(shí)間片輪詢(xún)調度,需要依照以下的步驟 :

2 確定任務(wù)總數及各個(gè)任務(wù)實(shí)對時(shí)間實(shí)時(shí)性的要求

2 根據任務(wù)對時(shí)間的要求,確定時(shí)間片的長(cháng)度

2 估算執行每個(gè)任務(wù)所花費的時(shí)間,確保任務(wù)能夠在時(shí)間片的長(cháng)度內執行完畢

2 如果任務(wù)較大,時(shí)間片不足于讓任務(wù)執行完,此時(shí)可細化該任務(wù)

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

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

#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;} // 無(wú)線(xiàn)收發(fā)任務(wù)處理標志

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

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

DealComFlag=1; // 串口任務(wù)處理標志

}

在主函數中,根據標志位調用相應的函數進(jìn)行數據處理,然后將標志位清除,等到下一個(gè)時(shí)間片到來(lái)后再開(kāi)始新一輪的數據處理。

int main(void)

{

if(CC1100_SendFlag==1) { ... ; CC1100_SendFlag=0; } // 無(wú)線(xiàn)收發(fā)任務(wù)處理標志

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

......

}



關(guān)鍵詞: 時(shí)間片調度單片

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>