時間觸發(fā)模式下的ProtothreadS設(shè)計應(yīng)用
按照Protothreads的定義,lc_t類型就是unsignedshort類型。每個任務(wù)分配一個pt結(jié)構(gòu)。將pt結(jié)構(gòu)修改以后,還必須對Protothreads提供的一些功能函數(shù)做一些修改。比如,可以將PT_INIT(pt)更改為PT_INIT(pt,10,0),表示該任務(wù)10 ms執(zhí)行一次,且ready的初始值為O。隊(duì)列的實(shí)現(xiàn)使用指針數(shù)組。
在時間觸發(fā)模式的系統(tǒng)中,定時器中斷作為系統(tǒng)一個固定的時間片,在具體實(shí)現(xiàn)中可以設(shè)置成CTC模式。這個時間片的選擇必須依據(jù)具體的應(yīng)用,設(shè)置得過大會對系統(tǒng)調(diào)度的時效性造成比較大的影響,過小又會給調(diào)度器造成明顯的負(fù)擔(dān),而且壓縮任務(wù)的執(zhí)行時間會使程序流程的可預(yù)測性受到影響。因?yàn)楸疚乃婕叭蝿?wù)的周期大多是若干ms,所以可以將定時器中斷設(shè)置為1 ms。ISR的執(zhí)行流程大致如下:每一次定時中斷,將任務(wù)的count值減1,直到count為O時表明該任務(wù)的間隔時間已到可以執(zhí)行了,并且將初值重新賦給count,以重新開始下輪計數(shù)。具體程序如下:
調(diào)度函數(shù)快速輪詢各個任務(wù)的TCB。因?yàn)槎〞r器中斷會定期更新任務(wù)的TCB信息,所以調(diào)度函數(shù)就可以根據(jù)TCB中ready的值來判斷是否需要執(zhí)行某任務(wù)。執(zhí)行任務(wù)過后清零該ready值。
如果任務(wù)task_XXX在執(zhí)行過程中發(fā)生中斷,ready值沒有被清零,待中斷返回后會繼續(xù)執(zhí)行之前的任務(wù),但是這樣會使得下一時隙任務(wù)的執(zhí)行延遲,造成系統(tǒng)的安全隱患,所以應(yīng)當(dāng)盡量避免長任務(wù)的出現(xiàn)。而如果在任務(wù)執(zhí)行中出現(xiàn)條件阻塞(如PT_WAIT_UNTIL),則正好可以發(fā)揮Protothreads提供的并行處理能力,并且在處理類似鍵盤掃描的狀態(tài)機(jī)任務(wù)時具有很好的邏輯性和清晰度。當(dāng)然,這樣做的前提是:這里的任務(wù)的實(shí)時性要求不高,允許出現(xiàn)一定的時延。
整個main()函數(shù)定義3個任務(wù)task_A、task_B和task_C,并且分別給每個任務(wù)分配一個結(jié)構(gòu)體pt_A、pt_B和pt_C。3個任務(wù)的執(zhí)行周期分別是10 ms、15 ms和2ms。調(diào)度函數(shù)處于一個大循環(huán)中。具體實(shí)現(xiàn)如下所示:
4 總結(jié)和展望
Protothreads為嵌入式系統(tǒng)提供了很好的并行處理能力,而且非常易于操作;在時間觸發(fā)模式的系統(tǒng)中,Pro―tothreads依然能夠發(fā)揮其巨大的作用。在本文中筆者的設(shè)計很好地達(dá)到了實(shí)際的要求,最大程度上簡化了設(shè)計和維護(hù)。當(dāng)然,應(yīng)用Protothreads更加巧妙的設(shè)計方法和理念還需要不斷地實(shí)踐和總結(jié)。
評論