嵌入式智能儀表自動(dòng)控制技術(shù)
本文根據智能儀表對嵌入式操作系統的特殊要求設計了一種新的任務(wù)調度算法,并實(shí)現了一個(gè)應用于中低端儀器儀表的嵌入式微調度器。
本文引用地址:http://dyxdggzs.com/article/148589.htm1、實(shí)時(shí)任務(wù)調度的一般方法和策略
在實(shí)時(shí)操作系統中,系統把應用分為行為可以預知的、功能確定的多個(gè)任務(wù)。每個(gè)任務(wù)一般處于3種狀態(tài):執行狀態(tài)、就緒狀態(tài)和等待狀態(tài)(有的操作系統還具有掛起和休眠狀態(tài))。為了滿(mǎn)足實(shí)時(shí)性要求,系統根據一定的原則選擇合適的任務(wù)執行。
常見(jiàn)的任務(wù)調度算法分為靜態(tài)算和動(dòng)態(tài)算法兩類(lèi):
① 靜態(tài)算法:在系統在運行前(即系統初始化階段),就為所有的任務(wù)分配固定的優(yōu)先級別,在系統執行過(guò)程中優(yōu)先級保持不變。當一個(gè)事件發(fā)生時(shí),調度程序只需要查就緒表,就可以調度哪個(gè)任務(wù)處于運行狀態(tài)。
② 動(dòng)態(tài)算法:在系統初始化時(shí)初步分配一個(gè)優(yōu)先級。每一個(gè)任務(wù)在運行時(shí)可以改變它的優(yōu)先級。當前的嵌入式操作系統一般采用靜態(tài)算法,只在處理優(yōu)先級反轉時(shí)臨時(shí)采用動(dòng)態(tài)優(yōu)先級算法。
2、儀器儀表對調度算法的要求
為了提高儀表的可靠性,實(shí)現高性能、多功能應用,應用于智能儀表的調度器必須滿(mǎn)足以下要求:
①良好的實(shí)時(shí)性。智能儀表必須實(shí)時(shí)地對通過(guò)現場(chǎng)總線(xiàn)采集的數據進(jìn)行數字編碼,通過(guò)人機界面進(jìn)行顯示,并把用戶(hù)對被監控系統的參數設置實(shí)時(shí)地傳送給執行部件。
② 基于優(yōu)先級的任務(wù)調度策略。在復雜的大規模應用中需要使用大量的傳感器、執行器和控制器等,對其數據顯示和傳輸控制需要通過(guò)不同優(yōu)先級的任務(wù)來(lái)控制。
③ 低消耗要求。隨著(zhù)應用環(huán)境的復雜化,對智能儀表的計算能力要求越來(lái)越高,勢必要求調度器必須占用較少的系統資源。
④ 低成本要求。為了降低成本,在硬件設計上,存儲器的大小是成本控制的一個(gè)方面。因此,要求提供的調度器必須具備小內核以減小存儲空間。此外,還要求調度器必須有精確定時(shí)的功能,也就是事件驅動(dòng)和時(shí)鐘驅動(dòng)相結合,以滿(mǎn)足智能儀表中周期性任務(wù)執行和突發(fā)性任務(wù)執行的需要。
3、嵌入式微調度器的設計與實(shí)現
根據智能儀表對調度算法實(shí)時(shí)性、多任務(wù)、低消耗的要求,本文提出了一種新的靜態(tài)優(yōu)先級,單任務(wù)隊列、具有4種任務(wù)狀態(tài)的非搶占式調度的輕量級任務(wù)調度算法,并根據這種算法實(shí)現了應用于智能儀表的調度器。該算法的特點(diǎn)是以任務(wù)在任務(wù)控制塊數組中的相對位置表示優(yōu)先級高低,任務(wù)的狀態(tài)和延時(shí)量使用統一的任務(wù)狀態(tài)字,在少量任務(wù)的輕量級應用中具有很好的時(shí)間和空間性能。
3.1 任務(wù)的狀態(tài)
在本調度器中任務(wù)有4種狀態(tài):就緒狀態(tài)、運行狀態(tài)、等待狀態(tài)和掛起狀態(tài)。內存中的任務(wù)必須處于這4種狀態(tài)之一。
就緒狀態(tài):指任務(wù)運行的時(shí)間條件和資源條件都滿(mǎn)足,等待調度算法選擇最合適的任務(wù)進(jìn)入就緒狀態(tài)。任務(wù)一旦建立就處于就緒狀態(tài),這一點(diǎn)和μC/0S-II相同。
運行狀態(tài):是當前時(shí)刻任務(wù)占有CPU資源正在運行的狀態(tài)。本調度算法選擇進(jìn)入就緒任務(wù)隊列中優(yōu)先級最高的任務(wù)運行。任何時(shí)刻只能有一個(gè)任務(wù)處于運行狀態(tài)。
等待狀態(tài):如果任務(wù)需要等待一段時(shí)間才能運行,那么這個(gè)任務(wù)當前處于等待狀態(tài)。使任務(wù)延遲一段時(shí)間可通過(guò)調用0s_TasK_Delay()函數實(shí)現。調度器在每個(gè)系統時(shí)鐘節拍檢查任務(wù)延遲時(shí)間,一旦任務(wù)定義的延遲時(shí)間到,就使任務(wù)進(jìn)入就緒狀態(tài)。
掛起狀態(tài):正在運行的任務(wù)需要等待某一事件的發(fā)生,如果該事件沒(méi)有發(fā)生那么任務(wù)就處于掛起狀態(tài)。事件的發(fā)生可能來(lái)自另外一個(gè)任務(wù),也可能來(lái)自中斷服務(wù)程序。
除此之外,系統還可能處在中斷服務(wù)狀態(tài)。這是一種特殊的運行狀態(tài),當系統響應中斷時(shí),正在執行的任務(wù)被掛起,中斷服務(wù)程序控制了CPU的使用權,系統就進(jìn)入中斷服務(wù)狀態(tài)。
其中,空閑任務(wù)優(yōu)先級最低,而且永遠處于就緒狀態(tài),而且當所有的任務(wù)都在等待事件發(fā)生或者延遲時(shí)間結束時(shí),操作系統就會(huì )執行空閑任務(wù)。
3.2 調度器核心數據結構
3.2.1 任務(wù)控制塊和任務(wù)控制塊列表
任務(wù)控制塊由任務(wù)堆棧、任務(wù)入口地址、任務(wù)狀態(tài)字和任務(wù)優(yōu)先級4個(gè)部分組成。任務(wù)堆棧用于保護被中斷的現場(chǎng)數據;任務(wù)入口地址是指向任務(wù)程序的指針,用于指定任務(wù)所進(jìn)行的操作;任務(wù)狀態(tài)字用來(lái)表示任務(wù)當前的狀態(tài)和延遲的時(shí)間間隔;任務(wù)優(yōu)先級表示就緒列表中的哪個(gè)任務(wù)可以?xún)?yōu)先進(jìn)入運行狀態(tài)。在整個(gè)調度過(guò)程中使用一個(gè)全局的任務(wù)控制塊數組來(lái)表示任務(wù)控制塊列表。每個(gè)任務(wù)使用唯一一個(gè)任務(wù)控制塊表示,任務(wù)的優(yōu)先級通過(guò)任務(wù)控制塊在任務(wù)控制塊數組中的相對位置來(lái)表示。每個(gè)任務(wù)有且僅有一個(gè)優(yōu)先級,所以任務(wù)的優(yōu)先級也可以用任務(wù)的ID號來(lái)表示。任務(wù)控制塊結構如下:
typedef STruct{ //tsk_tcb結構定義
pStack stack; //tsk_tcb堆棧入口
pTAsK task; //tsk_tcb指向的任務(wù)
U8 state; //tsk.tcb任務(wù)目前的狀態(tài)
U8 prior; //任務(wù)優(yōu)先級
}TCB;
3.2.2 任務(wù)調度算法及實(shí)現
這種算法已在16位單片機Motorola MC9S12DP256B和8位單片機AT89C52上實(shí)現。一些與硬件相關(guān)的算法,主要給出在MC9S12DP256B上的算法實(shí)現。
①建立任務(wù)Os-Task-Create()算法。任務(wù)創(chuàng )建函數代碼如下:
void 0s_Task_Create(0S_STACK*task_stack,
uW0rd task_id,pTASK task_func){
os_tcb[task_id].task=task_func;
os_tcb[task_id].stack=task_stack;
os_tcb[task_id].prior=task_id;
}
該程序表示了系統建立任務(wù)的過(guò)程。如上節所述每個(gè)任務(wù)對應一個(gè)優(yōu)先級,所以任務(wù)ID也可表示任務(wù)的優(yōu)先級。建立任務(wù)的過(guò)程就是,把任務(wù)控制塊數組的任務(wù)入口地址對應ID(即任務(wù)優(yōu)先級)的任務(wù)控制塊的任務(wù)入口地址指向任務(wù)函數的地址,并初始化該任務(wù)的任務(wù)堆棧。
② 任務(wù)調度算法的功能是找到當前就緒列表中優(yōu)先級最高的任務(wù),并把這個(gè)任務(wù)切換到運行狀態(tài)。在任務(wù)控制塊列表中使用任務(wù)在列表中的相對位置表示優(yōu)先級的高低,并不需要實(shí)際地對任務(wù)優(yōu)先級進(jìn)行比較。算法流程如圖1所示。
從任務(wù)控制塊隊列的頭部(即任務(wù)優(yōu)先級為O的任務(wù))開(kāi)始依次檢查任務(wù)就緒標志(os_tcb.state),如果當前任務(wù)標志≠1,表示當前任務(wù)為非就緒狀態(tài),繼續檢查下一優(yōu)先級的任務(wù)。如果當前任務(wù)標志為1,則找到最高優(yōu)先級任務(wù)退出循環(huán),調用任務(wù)調度函數進(jìn)行任務(wù)狀態(tài)切換。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論