改進型時間觸發(fā)嵌入式系統(tǒng)編程模式
系統(tǒng)中每個任務都定義了優(yōu)先級、任務循環(huán)周期和任務延遲時間,系統(tǒng)定時器中斷程序SCH Updatc()按設定的節(jié)拍對任務隊列進行刷新,在超級大循環(huán)中只執(zhí)行任務調(diào)度器SCH_Dispatch_Tasks(),根據(jù)任務隊列的狀念安排任務的執(zhí)行。
這種編程結構避免了超級大循環(huán)結構循環(huán)時間隨代碼量的增加而線性增加的問題,但是由于任務是不可剝奪的,一旦任務啟動執(zhí)行,任務調(diào)度器只有在當前任務完成后才有機會執(zhí)行,這就要求每個任務占用CPU的時間不能太長,否則將影響整個系統(tǒng)的響應速度。所以,F(xiàn)FT運算在這種編程模式下還是必須進行有效的拆分,否則就必須提高CPU的檔次或使用可剝奪型的搶先式RTOS,這勢必造成系統(tǒng)成本的增加。那么有沒有更好的解決辦法呢?
下面的編程結構塒“時間觸發(fā)編程模式”進行了改進,使之在不提高硬件成本的情況下,使編程人員更直觀地定義任務,減少任務特性對系統(tǒng)程序結構的沖擊,使程序結構簡單、明了并提高系統(tǒng)的實時響應速度。
2 對“時間觸發(fā)編程模式”的改進
根據(jù)多年嵌入式系統(tǒng)編程的經(jīng)驗,通常嵌入系統(tǒng)的任務可以劃分成3種類型:
①及時型任務。這類任務是事件觸發(fā)型的,一旦事件發(fā)生,系統(tǒng)必須在限定的時間內(nèi)進行響應,對這類任務,最自然的方法就是使用中斷來完成,即定義成“前后臺方式”中的后臺任務。
②周期型任務。這類任務是時間觸發(fā)式周期型的,系統(tǒng)必須保證在指定的周期內(nèi)執(zhí)行任務,“時間觸發(fā)編程模式”可以很好地滿足這類任務的需求。
③背景型任務。這類任務是非實時型的,實時性不是非常重要,系統(tǒng)在運行過程中可隨時中斷這類任務以便執(zhí)行前兩類任務,系統(tǒng)只要能充分利用資源盡最大可能快速完成這類任務即可,這類任務最適合定義成“前后臺方式”中的前臺任務。
根據(jù)以上任務分類,對“時間觸發(fā)編程模式”的改進可概括成以下需求:
◆任務分3類,1類任務優(yōu)先級最高,3類任務優(yōu)先級最低;
◆高優(yōu)先級的任務可中斷低優(yōu)先級任務的執(zhí)行,同級的任務之間不可相互剝奪;
◆實際沒計中為提高系統(tǒng)的可預測性,應盡量減少1類任務的數(shù)量及1類任務的執(zhí)行時間;
◆為降低系統(tǒng)資源的占用,系統(tǒng)不給任務劃分單獨的堆??臻g。
以上改進的本質(zhì)是設計3個優(yōu)先級的簡單的任務調(diào)度機制,高優(yōu)先級的任務可中斷低優(yōu)先級的任務,同優(yōu)先級的任務之間不能相互剝奪,該調(diào)度機制不為每個單獨的任務保存任務上下文和單獨的堆棧,這樣可以減少該編程模式對系統(tǒng)資源的需求。
可剝奪式RTOS中的一個高優(yōu)先級任務中斷一個低優(yōu)先級的任務時,會保存好低優(yōu)先級任務的上下文并把該低優(yōu)先級任務的局部變量保存在本任務單獨的堆棧中,如果系統(tǒng)不給任務分配單獨的堆棧,如何保證高優(yōu)先級任務退出后,低優(yōu)先級任務執(zhí)行環(huán)境的恢復呢?
對這個問題,可以借鑒中斷的處理機制用以下辦法予以解決:
①在系統(tǒng)中設計一個定時中斷函數(shù),該函數(shù)的功能就是執(zhí)行周期性任務的調(diào)度,該定時中斷在所有中斷中優(yōu)先級最低。
②在系統(tǒng)中設計另一個定時中斷函數(shù),該函數(shù)的功能是刷新周期型任務的任務管理隊列,為任務調(diào)度提供支持,本定時中斷函數(shù)的優(yōu)先級在系統(tǒng)中次低。
③周期型任務就是一個函數(shù),該函數(shù)入口的第一個操作是開中斷,允許任務執(zhí)行期間被中斷以便響應及時型任務。
④背景型任務就是在主函數(shù)超級循環(huán)中執(zhí)行的代碼,該代碼可隨時被及時型和周期型任務中斷,當系統(tǒng)沒有及時型任務和周期型任務時才循環(huán)執(zhí)行背景型任務的代碼。 linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論