IC卡電表C語言程序結(jié)構(gòu)
則系統(tǒng)變?yōu)橐粋€以執(zhí)行頻率為優(yōu)先級的任務(wù)調(diào)度系統(tǒng)。當(dāng)然,設(shè)置此種方式得非常小心,并要注意時間片的分配,如果時間片過小,則可能導(dǎo)致執(zhí)行頻率較低的任務(wù)難以被執(zhí)行;而如果存在兩個同樣的時間片,則更加危險,可能導(dǎo)致第二個具有相同時間片的任務(wù)不被執(zhí)行,因而,時間片的分配要合理,并保證其唯一性。
2 性能分析與任務(wù)拆分
以上兩種任務(wù)管理方式,前一種按任務(wù)棧的順序與時間片的大小依次進行調(diào)度,暫且稱其為流水作業(yè)調(diào)度;而后一種,且稱其為頻率優(yōu)先調(diào)度。兩種方式各有優(yōu)缺點。流水作業(yè)調(diào)度的各任務(wù)具有等同優(yōu)先級,時間片一到即會被按序調(diào)用,時間片大小的次序與唯一性不作要求;缺點是可能導(dǎo)致時間片小的,即要求執(zhí)行得較快的任務(wù)等待過長的時間。頻率優(yōu)先調(diào)度的各任務(wù)按其時間片的大小,即執(zhí)行頻率劃分優(yōu)先級,時間片小的任務(wù),其執(zhí)行頻率高,總是具有較高的優(yōu)先權(quán),但時間片的分配得協(xié)調(diào),否則可能會導(dǎo)致執(zhí)行頻率低的任務(wù)長時間等待。
要特別注意的是,兩種方式都有可能導(dǎo)致一些任務(wù)長時間等待,時間片所設(shè)定的時間也因此不能作為精確時間的依據(jù),根據(jù)系統(tǒng)的要求或需要,甚至要在任務(wù)執(zhí)行過程中進行某些保護工作,如中斷屏蔽等,因而在進行任務(wù)規(guī)劃時要注意。如果一個任務(wù)較繁瑣或可能要等待很長時間,則應(yīng)當(dāng)考慮任務(wù)的拆分,把一個較大的任務(wù)細化為較小的任務(wù),把一個費時長的任務(wù)劃分為多個費時小的任務(wù),協(xié)同完成其功能。如在等待時間長的情況下,可附加一個定時任務(wù),定時任務(wù)到則發(fā)送一個消息旗標(biāo),主過程沒有檢測到消息旗標(biāo)就馬上返回,否則繼續(xù)執(zhí)行。下面是示例代碼,假定該任務(wù)將等待很長時間,現(xiàn)將其拆分為兩個任務(wù)proc1與proc2協(xié)同完成原來的工作,proc1每100個時間單位執(zhí)行一次,而proc2每200個時間單位執(zhí)行一次。
//定義兩個任務(wù),并將其加入到任務(wù)棧中。
code _op_ Op[proc_cnt]={…,{proc1,100},{proc2,200}};
data int time1_Seg; //定義一個全局旗標(biāo)
//任務(wù)實現(xiàn)
void proc1(void){
if (time1_Seg)
exit;
else
time1_Seg=const_Time1; //如果時間到了,則恢復(fù)初值并
//接著執(zhí)行下列代碼。
… //任務(wù)實際執(zhí)行代碼
}
void proc2(void){
if(time1_Seg)
time1_Seg--;
}
由上例可以看出,任務(wù)拆分后,幾乎不占過多的CPU時間,使得任務(wù)的等待時間大減,讓CPU有足夠的時間進行任務(wù)管理與調(diào)度。同時也讓程序的結(jié)構(gòu)性與可讀性大為加強。
結(jié)語
基于上述思路與結(jié)構(gòu)對IC卡電表工作程序進行全部改寫后,系統(tǒng)的結(jié)構(gòu)性能得到了很大改善。全部編寫完成后,程序代碼量約為3KB多一點,可見此種結(jié)構(gòu)的程序構(gòu)造并不會造成很大的系統(tǒng)開銷(大部分開銷是由于使用C的結(jié)果),卻使開發(fā)得到了簡化。這只要將系統(tǒng)細分為一系列任務(wù),然后加入到任務(wù)棧進行編譯即可,很適合小容量單片機系統(tǒng)的開發(fā),而筆者也在多個系統(tǒng)中成功地應(yīng)用了此種結(jié)構(gòu)。
評論