<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í)間觸發(fā)調度改進(jìn)的嵌入式編程模式

基于時(shí)間觸發(fā)調度改進(jìn)的嵌入式編程模式

作者: 時(shí)間:2017-06-04 來(lái)源:網(wǎng)絡(luò ) 收藏

引言

目前,RTOS特別是搶先式RTOS在嵌入式系統中的應用越來(lái)越廣泛,但是還有很大一部分產(chǎn)品使用是小型單片機。這些系統由于成本的限制,通常資源非常有限,比如ROM往往小丁32 KB,RAM小于2 KB,由于RTOS對每個(gè)任務(wù)都要開(kāi)辟單獨內存區域,存放任務(wù)的上下文和各任務(wù)獨立的堆棧,所以在這種系統中使用RTOS非常勉強。對于這些低成本資源受限系統通常采用“前后臺”(或者叫“超級循環(huán)”)結構進(jìn)行編程,這實(shí)際上是一種事件觸發(fā)的,當中斷數目較多且系統完成的功能相對復雜時(shí),就會(huì )使系統的程序編寫(xiě)變得非常復雜并使系統運行的可預測性迅速下降。

針對這個(gè)問(wèn)題,Michael J.Pont提出了一種“基于”,這種方法有助于降低CPU的負荷并減少存儲器的使用量,提高系統行為的可預測性,并使程序的結構變得簡(jiǎn)潔。但是在實(shí)際使用中,當系統中不同的任務(wù)對時(shí)間要求差異較大時(shí),“基于”難以給出簡(jiǎn)單有效的解決方案。為此,對“基于的編程模式”進(jìn)行了改進(jìn),使之適應性更強,可以為成本和資源受限的小型嵌入式系統提供統一且有效的編程模式。

本文引用地址:http://dyxdggzs.com/article/201706/348301.htm

1 傳統編程結構的局限性

當不使用RTOS時(shí),嵌入式軟件通常采用兩種傳統的編程結構進(jìn)行編程,一種叫“前后臺廳式”或者叫“超級循環(huán)結構”,本質(zhì)上是事件觸發(fā)的編程方式;另一種叫時(shí)間觸發(fā)編程模式,Michael J.Pont的“基于時(shí)間觸發(fā)的編程模式”即屬于此。

在實(shí)際工作中,當系統稍微復雜時(shí),會(huì )發(fā)現這兩種方式都有一定局限性,下面以一個(gè)實(shí)際產(chǎn)品設計中遇到的問(wèn)題為例來(lái)說(shuō)明。在設計一個(gè)用于配電柜的壁裝式智能配電儀表時(shí),CPU的程序設計需完成以下任務(wù):

①每半秒對前顯示屏的顯示數據進(jìn)行一次刷新。
②每0.1 s對DI/DO進(jìn)行一次刷新。
③每0.2 s對鍵盤(pán)進(jìn)行一次掃描。
④每半秒對測量數據進(jìn)行一次重新采集和計算。
⑤異步串行口與上位機使用Modhus通信,速率最高1 9 200 bps。
⑥CPU通過(guò)I2C總線(xiàn)與時(shí)鐘芯片和EEPROM通信。
⑦CPU通過(guò)SPI總線(xiàn)與LED數碼管及采集芯片通信。
⑧CPU要對所采集的6路信號進(jìn)行FFT變換。
⑨當系統掉電時(shí),CPU要能快速響應,把當前的電度底數寫(xiě)入EEPROM中。

上述任務(wù)中,任務(wù)⑤和任務(wù)⑨是強實(shí)時(shí)性的,如果對串口的收發(fā)事件得不到及時(shí)響應,接收時(shí)會(huì )導致字節丟失,發(fā)送時(shí)會(huì )導致字節間時(shí)間間隔太大,造成接收方的Modbus幀定界錯誤,對系統掉電事件如果不能及時(shí)響應會(huì )造成EEPROM的寫(xiě)入失敗。其他任務(wù)只要在指定的周期內能得到執行就行,但是任務(wù)⑧比較特殊,使用通常的8位CPU進(jìn)行6種信號的FFT變換,哪怕每種信號只做128點(diǎn)的FFT,運算一次也要好幾秒。下面來(lái)看用傳統編程結構實(shí)現上述設計時(shí)遇到的困擾。

1.1 使用“前后臺方式”進(jìn)行編程

使用“前后臺方式”進(jìn)行編程時(shí),為保證任務(wù)⑤的及時(shí)性,使用了UART中斷,當UART完成一個(gè)字節的收發(fā)后產(chǎn)生中斷,在中斷程序中將接收到的字符保存在接收緩沖區或從發(fā)送緩沖區取下一個(gè)待發(fā)字符裝入UART進(jìn)行發(fā)送,對Modbus協(xié)議的處理可以單獨用一個(gè)任務(wù)在中斷外處理,這保證了巾斷程序的簡(jiǎn)短。為保證任務(wù)⑨響應的及時(shí)性,也必須為它安排一個(gè)中斷。因為當系統掉電時(shí),系統只有不到10 ms的過(guò)渡時(shí)間,系統如果不能在這個(gè)時(shí)間內完成相關(guān)的操作,系統電壓將跌落至有效電壓以下而喪失工作能力。

安排好了后臺的中斷任務(wù)后再來(lái)看看前臺的任務(wù)如何完成。這里遇到的最大的挑戰是對任務(wù)⑧的處理,因為任務(wù)⑧需要的執行時(shí)間太長(cháng)了,簡(jiǎn)單的把它當成一個(gè)任務(wù)處理將影響系統對其他任務(wù)的響應,在超級循環(huán)中的代碼結構如下:

while(1){
任務(wù)①;
任務(wù)②;
……
任務(wù)⑧;
}

由于任務(wù)⑧執行一次要幾秒鐘的時(shí)間,整個(gè)超級循環(huán)執行一次至少大于任務(wù)⑧需要的時(shí)間,也就是說(shuō)這個(gè)超級循環(huán)循環(huán)一次要幾秒鐘時(shí)間,將滿(mǎn)足不了各任務(wù)響應時(shí)間的要求。

要解決這個(gè)問(wèn)題,只有把任務(wù)⑧拆分成很多個(gè)子任務(wù),將每個(gè)子任務(wù)的耗時(shí)壓縮到10 ms左右,并定義好各個(gè)子任務(wù)完成后的狀態(tài),在超級大循環(huán)中每次根據狀態(tài)只執行一個(gè)子任務(wù),程序結構如下:

while(1){
任務(wù)①;
任務(wù)②;
……
switch(子任務(wù)狀態(tài)){
case 子任務(wù)狀態(tài)①:
子任務(wù)①;
break;
……
case 子任務(wù)狀態(tài)②:
子任務(wù)②;
break;
……
case 子任務(wù)狀態(tài):
子任務(wù);
break;
}
}

這樣,就需要把一個(gè)耗時(shí)幾秒的FFT運算任務(wù)拆分成幾百個(gè)耗時(shí)10 ms左有的子任務(wù),這顯然是不可接受的。除此之外,超級大循環(huán)結構隱含的一個(gè)缺點(diǎn)就是隨著(zhù)任務(wù)的增加,循環(huán)體的執行時(shí)間是線(xiàn)性增加的,在實(shí)際設計中即使沒(méi)有像任務(wù)⑧那樣的高耗時(shí)任務(wù),當系統功能增加時(shí)要保證系統響應的及時(shí)性也是一個(gè)不小的挑戰。

1.2 使用“時(shí)間觸發(fā)編程模式”進(jìn)行編程

“時(shí)間觸發(fā)編程模式”的核心是建立一個(gè)基丁時(shí)間觸發(fā)的合作式的任務(wù)調度器,在系統中盡量減少事件觸發(fā)(減少中斷的使用),系統通過(guò)任務(wù)調度器完成各任務(wù)的調度執行,下面是“時(shí)間觸發(fā)編程模式”的典型程序結構:

系統中每個(gè)任務(wù)都定義了優(yōu)先級、任務(wù)循環(huán)周期和任務(wù)延遲時(shí)間,系統定時(shí)器中斷程序SCH Updatc()按設定的節拍對任務(wù)隊列進(jìn)行刷新,在超級大循環(huán)中只執行任務(wù)調度器SCH_Dispatch_Tasks(),根據任務(wù)隊列的狀念安排任務(wù)的執行。

這種編程結構避免了超級大循環(huán)結構循環(huán)時(shí)間隨代碼量的增加而線(xiàn)性增加的問(wèn)題,但是由于任務(wù)是不可剝奪的,一旦任務(wù)啟動(dòng)執行,任務(wù)調度器只有在當前任務(wù)完成后才有機會(huì )執行,這就要求每個(gè)任務(wù)占用CPU的時(shí)間不能太長(cháng),否則將影響整個(gè)系統的響應速度。所以,FFT運算在這種編程模式下還是必須進(jìn)行有效的拆分,否則就必須提高CPU的檔次或使用可剝奪型的搶先式RTOS,這勢必造成系統成本的增加。那么有沒(méi)有更好的解決辦法呢?

下面的編程結構塒“時(shí)間觸發(fā)編程模式”進(jìn)行了改進(jìn),使之在不提高硬件成本的情況下,使編程人員更直觀(guān)地定義任務(wù),減少任務(wù)特性對系統程序結構的沖擊,使程序結構簡(jiǎn)單、明了并提高系統的實(shí)時(shí)響應速度。

2 對“時(shí)間觸發(fā)編程模式”的改進(jìn)

根據多年嵌入式系統編程的經(jīng)驗,通常嵌入系統的任務(wù)可以劃分成3種類(lèi)型:

①及時(shí)型任務(wù)。這類(lèi)任務(wù)是事件觸發(fā)型的,一旦事件發(fā)生,系統必須在限定的時(shí)間內進(jìn)行響應,對這類(lèi)任務(wù),最自然的方法就是使用中斷來(lái)完成,即定義成“前后臺方式”中的后臺任務(wù)。

②周期型任務(wù)。這類(lèi)任務(wù)是時(shí)間觸發(fā)式周期型的,系統必須保證在指定的周期內執行任務(wù),“時(shí)間觸發(fā)編程模式”可以很好地滿(mǎn)足這類(lèi)任務(wù)的需求。

③背景型任務(wù)。這類(lèi)任務(wù)是非實(shí)時(shí)型的,實(shí)時(shí)性不是非常重要,系統在運行過(guò)程中可隨時(shí)中斷這類(lèi)任務(wù)以便執行前兩類(lèi)任務(wù),系統只要能充分利用資源盡最大可能快速完成這類(lèi)任務(wù)即可,這類(lèi)任務(wù)最適合定義成“前后臺方式”中的前臺任務(wù)。

根據以上任務(wù)分類(lèi),對“時(shí)間觸發(fā)編程模式”的改進(jìn)可概括成以下需求:

◆任務(wù)分3類(lèi),1類(lèi)任務(wù)優(yōu)先級最高,3類(lèi)任務(wù)優(yōu)先級最低;
◆高優(yōu)先級的任務(wù)可中斷低優(yōu)先級任務(wù)的執行,同級的任務(wù)之間不可相互剝奪;
◆實(shí)際沒(méi)計中為提高系統的可預測性,應盡量減少1類(lèi)任務(wù)的數量及1類(lèi)任務(wù)的執行時(shí)間;
◆為降低系統資源的占用,系統不給任務(wù)劃分單獨的堆??臻g。

以上改進(jìn)的本質(zhì)是設計3個(gè)優(yōu)先級的簡(jiǎn)單的任務(wù)調度機制,高優(yōu)先級的任務(wù)可中斷低優(yōu)先級的任務(wù),同優(yōu)先級的任務(wù)之間不能相互剝奪,該調度機制不為每個(gè)單獨的任務(wù)保存任務(wù)上下文和單獨的堆棧,這樣可以減少該編程模式對系統資源的需求。

可剝奪式RTOS中的一個(gè)高優(yōu)先級任務(wù)中斷一個(gè)低優(yōu)先級的任務(wù)時(shí),會(huì )保存好低優(yōu)先級任務(wù)的上下文并把該低優(yōu)先級任務(wù)的局部變量保存在本任務(wù)單獨的堆棧中,如果系統不給任務(wù)分配單獨的堆棧,如何保證高優(yōu)先級任務(wù)退出后,低優(yōu)先級任務(wù)執行環(huán)境的恢復呢?

對這個(gè)問(wèn)題,可以借鑒中斷的處理機制用以下辦法予以解決:

①在系統中設計一個(gè)定時(shí)中斷函數,該函數的功能就是執行周期性任務(wù)的調度,該定時(shí)中斷在所有中斷中優(yōu)先級最低。

②在系統中設計另一個(gè)定時(shí)中斷函數,該函數的功能是刷新周期型任務(wù)的任務(wù)管理隊列,為任務(wù)調度提供支持,本定時(shí)中斷函數的優(yōu)先級在系統中次低。

③周期型任務(wù)就是一個(gè)函數,該函數入口的第一個(gè)操作是開(kāi)中斷,允許任務(wù)執行期間被中斷以便響應及時(shí)型任務(wù)。

④背景型任務(wù)就是在主函數超級循環(huán)中執行的代碼,該代碼可隨時(shí)被及時(shí)型和周期型任務(wù)中斷,當系統沒(méi)有及時(shí)型任務(wù)和周期型任務(wù)時(shí)才循環(huán)執行背景型任務(wù)的代碼。

通過(guò)以上措施,“改進(jìn)型時(shí)間觸發(fā)編程模式”的程序結構如下:


結語(yǔ)


使用“改進(jìn)型時(shí)間觸發(fā)編程模式”進(jìn)行小型嵌入式系統編程,就像使用RTOS進(jìn)行編程一樣,設計者規劃好任務(wù)后,就可以專(zhuān)心于每個(gè)任務(wù)的設計,任務(wù)對處理器時(shí)間的占用可以由系統統一管理,減少任務(wù)之間的耦合,使產(chǎn)品的程序設計和改動(dòng)都變得簡(jiǎn)潔清楚。使用該編程模式很好地解決了譬裝式智能配電儀表所面臨的復雜的設計問(wèn)題,證明該方法簡(jiǎn)單有效。目前該設計模式僅僅設計了任務(wù)調度器,任務(wù)間的變量傳遞還需要使用全局變量,如果能加入信號量和消息機制,那么該模式將更加完善。



評論


相關(guān)推薦

技術(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>