工控網(wǎng)首頁
>

應(yīng)用設(shè)計(jì)

>

多任務(wù)機(jī)制在單片機(jī)系統(tǒng)中的應(yīng)用

多任務(wù)機(jī)制在單片機(jī)系統(tǒng)中的應(yīng)用

摘 要:提出了一種嶄新的基于任務(wù)機(jī)制的單片機(jī)系統(tǒng)程序結(jié)構(gòu),討論了具體實(shí)現(xiàn)方法,并給出應(yīng)用實(shí)例。 關(guān)鍵詞:多任務(wù)機(jī)制 單片機(jī)系統(tǒng) 中斷機(jī)制   傳統(tǒng)的單片機(jī)系統(tǒng)監(jiān)控程序通常是基于單任務(wù)機(jī)制的。這種機(jī)制具有簡(jiǎn)單直觀,易于控制的優(yōu)點(diǎn)。然而由于程序只能按單一的線索順序執(zhí)行,缺乏靈活性,在復(fù)雜系統(tǒng)中難以勝任。為了在更廣泛的領(lǐng)域應(yīng)用單片機(jī)系統(tǒng),必須對(duì)傳統(tǒng)的單任務(wù)機(jī)制進(jìn)行改進(jìn)。   多任務(wù)機(jī)制是現(xiàn)代操作系統(tǒng)才具有的突出優(yōu)點(diǎn)。在這種機(jī)制下,CPU的運(yùn)行時(shí)間被劃分為許多小的時(shí)間片,由某種調(diào)度算法按不同優(yōu)先級(jí)別分配給不同的應(yīng)用程序。多個(gè)應(yīng)用程序分別在自已的時(shí)間片內(nèi)訪問CPU,從而造成微觀上輪流運(yùn)行,宏觀上并發(fā)運(yùn)行的多任務(wù)效果。   在單片機(jī)系統(tǒng)中引入多任務(wù)機(jī)制,可以有效改善程序結(jié)構(gòu),滿足復(fù)雜系統(tǒng)的要求。任何多任務(wù)本質(zhì)上都借助于中斷機(jī)制。通用單片機(jī)中都允許使用中斷,從而保證了在單片機(jī)系統(tǒng)中實(shí)現(xiàn)多任務(wù)的切實(shí)可行。而單片機(jī)運(yùn)算能力的有限要求多任務(wù)調(diào)度算法必須簡(jiǎn)潔。   

1 兩種機(jī)制的比較   一個(gè)典型的單片機(jī)監(jiān)控系統(tǒng)通常包括輸入、輸出控制,數(shù)據(jù)處理,顯示以及鍵盤管理。在傳統(tǒng)的單任務(wù)機(jī)制下,程序采用循環(huán)方式,其流程圖如圖1所示。   由流程可知,在單任務(wù)機(jī)制下,各功能模塊按固定順序構(gòu)成一個(gè)整體,作為一個(gè)任務(wù)得到執(zhí)行。而在實(shí)際應(yīng)用中,各個(gè)模塊要求的執(zhí)行頻率往往不一致,如輸入采樣頻率可能要求很高,而單位時(shí)間內(nèi)鍵盤掃描的次數(shù)則相對(duì)較少,系統(tǒng)這種復(fù)雜的定時(shí)要求在單任務(wù)機(jī)制下難以滿足。另外在這種結(jié)構(gòu)下程序一旦建立,各模塊的執(zhí)行順序即已固定,對(duì)于需在運(yùn)行時(shí)動(dòng)態(tài)改變執(zhí)行結(jié)構(gòu)的系統(tǒng),程序需用許多條件判斷和分枝轉(zhuǎn)移語句進(jìn)行控制,增加了程序的復(fù)雜性。程序作為一個(gè)整體而存在可讀性和可維護(hù)性很差,調(diào)試不便,對(duì)已有程序進(jìn)行擴(kuò)充,也需先了解整個(gè)程序結(jié)構(gòu),增加了擴(kuò)充難度。   考慮到單片機(jī)完成的系統(tǒng)功能往往可以分解為若干相對(duì)獨(dú)立的模塊,我們可以將這些模塊理解為子任務(wù),并引進(jìn)多任務(wù)機(jī)制進(jìn)行管理,從而形成一種嶄新的程序結(jié)構(gòu)。其示意圖如圖2所示。   在這種結(jié)構(gòu)下,各功能模塊由系統(tǒng)調(diào)度程序啟動(dòng)執(zhí)行完畢后返回系統(tǒng)調(diào)度程序,彼此處于等同地位,其執(zhí)行順序也比較靈活,且可在程序運(yùn)行過程中動(dòng)態(tài)地改變執(zhí)行結(jié)構(gòu)。各子任務(wù)的執(zhí)行頻率要求表現(xiàn)為它們的優(yōu)先級(jí),優(yōu)先級(jí)越高的子任務(wù)單位時(shí)間內(nèi)執(zhí)行次數(shù)越多,從而其執(zhí)行頻率越高。各子任務(wù)在自已的時(shí)間片內(nèi)運(yùn)行,通過合理設(shè)計(jì)時(shí)間片大小和各任務(wù)的優(yōu)先級(jí),可以自然地滿足系統(tǒng)內(nèi)各種復(fù)雜的定時(shí)要求。   在多任務(wù)結(jié)構(gòu)下程序的調(diào)試與維護(hù)也變得容易。程序以分立模塊形式存在,各模塊間功能獨(dú)立,相互影響小,可以方便地單獨(dú)調(diào)試,并尋找問題所在。對(duì)程序的擴(kuò)充更為方便,不用更改原有結(jié)構(gòu),只需增加要擴(kuò)充的部分即可。   

2 多任務(wù)機(jī)制的實(shí)現(xiàn)   利用單片機(jī)具有的內(nèi)部時(shí)鐘中斷,可以方便地實(shí)現(xiàn)多任務(wù)機(jī)制。下面以常用的MCS—51系列單片機(jī)為例,說明其實(shí)現(xiàn)方法。   由多任務(wù)機(jī)制的特點(diǎn),必須提供一個(gè)系統(tǒng)時(shí)鐘,根據(jù)系統(tǒng)時(shí)鐘將CPU運(yùn)行時(shí)間劃分為若干時(shí)間片,由系統(tǒng)調(diào)度程序分給各個(gè)任務(wù)模塊。我們可由MCS—51系統(tǒng)單片機(jī)內(nèi)帶的定時(shí)器完成這一工作。定時(shí)參數(shù)的選擇應(yīng)考慮到系統(tǒng)中各種定時(shí)要求,定時(shí)頻率一般應(yīng)設(shè)計(jì)為各模塊要求執(zhí)行頻率的整數(shù)倍頻。   為了實(shí)現(xiàn)多任務(wù),還需構(gòu)造一個(gè)任務(wù)調(diào)度表并維護(hù)一個(gè)系統(tǒng)任務(wù)指針。任務(wù)調(diào)度表每一表項(xiàng)占4個(gè)字節(jié),保存各任務(wù)模塊的入口地址和訪問計(jì)數(shù)器,表項(xiàng)數(shù)等于需調(diào)度的任務(wù)模塊數(shù)。任務(wù)調(diào)度表指示了各任務(wù)的執(zhí)行順序和優(yōu)先級(jí)別。在程序建立時(shí)可在程序存儲(chǔ)器中建立一份缺省的任務(wù)調(diào)試表并在程序運(yùn)行初始化時(shí)調(diào)入系統(tǒng)RAM中,在程序運(yùn)行期間可根據(jù)實(shí)際需要修改RAM中的任務(wù)調(diào)度表,使各任務(wù)的執(zhí)行順序和優(yōu)先級(jí)別得到動(dòng)態(tài)調(diào)整。系統(tǒng)任務(wù)指針為一個(gè)1字節(jié)整數(shù),指向系統(tǒng)當(dāng)前正執(zhí)行的任務(wù)。由任務(wù)指針和任務(wù)調(diào)度表表頭可以找到相應(yīng)的任務(wù)程序入口地址。   多任務(wù)機(jī)制的具體實(shí)現(xiàn)由調(diào)度程序完成。調(diào)度程序在每個(gè)時(shí)鐘片的開始取得控制,它將系統(tǒng)任務(wù)指針加4,使之指向下一個(gè)任務(wù)模塊,并根據(jù)新的任務(wù)指針查閱任務(wù)調(diào)度表,將任務(wù)的訪問計(jì)數(shù)器減一,看是否為零。不為零則直接返回;為零則將當(dāng)前任務(wù)入口地址讀入DPTR寄存器,用JMP @A DPTR指令轉(zhuǎn)而執(zhí)行相應(yīng)的任務(wù)模塊。各任務(wù)模塊執(zhí)行完畢將相應(yīng)訪問計(jì)數(shù)器置成初值,供調(diào)度程序下一次使用。任務(wù)指針到達(dá)調(diào)試表未尾時(shí),由任務(wù)調(diào)度程序?qū)⑵鋸?fù)位,使之指向任務(wù)調(diào)度表開頭,重新開始程序周期。   由上述實(shí)現(xiàn)方案可知,各任務(wù)模塊在時(shí)鐘中斷程序中執(zhí)行,這可很好地滿足各任務(wù)模塊對(duì)執(zhí)行頻率的要求。但考慮到單片機(jī)調(diào)度能力有限的特點(diǎn),為各個(gè)任務(wù)模塊分配的時(shí)間片比實(shí)際所需可能尚有富余,而各任務(wù)模塊作為時(shí)鐘中斷例程執(zhí)行完畢都返回到主程序。因此可將某些對(duì)執(zhí)行頻率無要求的任務(wù)模塊放入主程序運(yùn)行,從而充分利用各時(shí)間片內(nèi)的富余時(shí)間,提高程序運(yùn)行效率。   實(shí)現(xiàn)多任務(wù)的關(guān)鍵在于合理地將系統(tǒng)功能分解為各個(gè)任務(wù)模塊。一般可將程序分為輸入、輸出、數(shù)據(jù)處理、顯示、鍵盤掃描等任務(wù)模塊。分解系統(tǒng)功能應(yīng)注意以下幾個(gè)問題:   (1)各個(gè)任務(wù)模塊需盡量短小精悍,在系統(tǒng)時(shí)間片內(nèi)應(yīng)能充分行到執(zhí)行。在設(shè)計(jì)任務(wù)模塊時(shí)應(yīng)盡量將其中的延時(shí)要求轉(zhuǎn)化為對(duì)模塊執(zhí)行頻率的要求。如在動(dòng)態(tài)顯示模塊設(shè)計(jì)中每位顯示間要求有1-2ms左右的延時(shí)來保證顯示穩(wěn)定,若采用一次將所有位全部顯示一遍的方案,顯示模塊將變得冗長(zhǎng),不適宜在中斷程序中執(zhí)行。我們可以采用一次只顯示一位的方法,這樣的顯示模塊由于沒有延時(shí)而得到精簡(jiǎn),位顯之間的延時(shí)時(shí)間可由模塊執(zhí)行頻率來決定?! ?2)在設(shè)計(jì)中若不可避免出現(xiàn)某一任務(wù)模塊過長(zhǎng)而不能在系統(tǒng)時(shí)間片內(nèi)執(zhí)行完畢的情況,可由下列兩種方法解決:   第一種方法是若此模塊無執(zhí)行頻率的要求和時(shí)間上的嚴(yán)格限制,可將其放入主程序,充分利用各時(shí)間片的富余時(shí)間執(zhí)行。   第二種方法是在進(jìn)入該任務(wù)模塊時(shí)將系統(tǒng)時(shí)鐘停止,這樣相當(dāng)于臨時(shí)給此模塊分配了附加運(yùn)行時(shí)間。在模塊執(zhí)行完畢時(shí)應(yīng)重新打開系統(tǒng)時(shí)鐘,使多任務(wù)調(diào)度程序能正常工作。   (3)各任務(wù)模塊在功能上應(yīng)盡量相互獨(dú)立,以保證程序調(diào)試和維護(hù)的方便。   (4)若某些模塊必須相互配合工作,可以采用公共單元進(jìn)行通信,保持同步。   綜上所述,在單片機(jī)系統(tǒng)中實(shí)現(xiàn)多任務(wù)機(jī)制,要借助于時(shí)鐘中斷。由定時(shí)器產(chǎn)生系統(tǒng)時(shí)間片,由系統(tǒng)調(diào)度程序?qū)r(shí)間片分配給各任務(wù)模塊。合理設(shè)計(jì)各任務(wù)模塊可充分發(fā)揮多任務(wù)機(jī)制的優(yōu)越性。   

3 應(yīng)用實(shí)例   利用單片機(jī)AT89C51設(shè)計(jì)一個(gè)應(yīng)用系統(tǒng)。要求系統(tǒng)同時(shí)接受兩個(gè)通道的數(shù)據(jù)輸入,一個(gè)通道每10ms采集一次,用于顯示和打印,另一通道每2ms采集一次,用于監(jiān)控;顯示采用LED數(shù)碼管動(dòng)態(tài)顯示方式;系統(tǒng)要求配有鍵盤接受用戶命令;系統(tǒng)要求每隔10s自動(dòng)打印一次結(jié)果,打印程序應(yīng)支持兩種不同型號(hào)的打印機(jī)(由用戶通過鍵盤選擇)。   由前述實(shí)現(xiàn)方案,可如下設(shè)計(jì)各任務(wù)模塊:   首先應(yīng)提供兩個(gè)輸入模塊,其執(zhí)行頻率分別為1次/10ms和1次/2ms,可分別記為I1,I2模塊。   由于采用動(dòng)態(tài)顯示方案,設(shè)計(jì)顯示模塊為每次顯示一位。為保持顯示穩(wěn)定,每?jī)晌伙@示之間需間隔一定時(shí)間,這里定為2ms。即要求顯示模塊的執(zhí)行頻率為1次/2ms。顯示模塊記為D模塊。   鍵盤掃描的去抖延時(shí)時(shí)間定為50ms,因此鍵盤管理模塊的執(zhí)行頻率為1次/50ms。鍵盤管理模塊記為K模塊。   系統(tǒng)要求提供打印功能,因此還需設(shè)計(jì)打印模塊,其執(zhí)行頻率為1次/10s。由于要支持兩種不同的打印機(jī),應(yīng)設(shè)計(jì)兩個(gè)打印模塊提供服務(wù),分別記為P1,P2模塊。   此外系統(tǒng)還應(yīng)有數(shù)據(jù)轉(zhuǎn)換程序及其它相關(guān)功能模塊。由于這些功能模塊并沒有嚴(yán)格的時(shí)間限制,可以放入主程序中執(zhí)行,不參與多任務(wù)調(diào)度。   由上述分析可知,系統(tǒng)要求同時(shí)調(diào)度5個(gè)任務(wù)模塊(P1與P2并不同時(shí)使用),因此任務(wù)調(diào)度表設(shè)計(jì)為5個(gè)表項(xiàng)。系統(tǒng)要求的最高執(zhí)行頻率為1次/2ms,可將系統(tǒng)時(shí)間片長(zhǎng)度設(shè)計(jì)為400μs。由此可計(jì)算出各任務(wù)模塊訪問計(jì)數(shù)器的值,如表1。   表1   模塊名 十進(jìn)制計(jì)數(shù)值 16進(jìn)制計(jì)數(shù)值        I1     5     0005        I2     1     0001         D     1     0001        K     25    0019      P1,P2     5000   1388   若采用P1作為缺省打印管理程序,則可建立缺省的任務(wù)調(diào)度表如表2所示。   表2   I1入口 I2入口 D入口 K入口 P1入口        0005  0001  0001 0019 1388   任務(wù)調(diào)度程序可如下編寫:   …… mov  a,pointer  ;pointer為當(dāng)前任務(wù)指針      add  a,#tasktbl;tasktbl為任務(wù)調(diào)度表首址      add  a,#02h;指向訪問計(jì)數(shù)器      mov  r0,a      mov  a,@r0;訪問計(jì)數(shù)器值減一      clr  c      subb a,#01h      mov  b,a      inc  r 0      mov  a,@r 0      subb a,#00h      jnz exit      ;不為零則返回

投訴建議

提交

查看更多評(píng)論
其他資訊

查看更多

優(yōu)薩 AX2N主機(jī)系列可編程控制器

優(yōu)薩 AX1S主機(jī)系列可編程控制器

優(yōu)薩 AX3U主機(jī)系列可編程控制器

優(yōu)薩 AX1N 主機(jī)系列可編程控制器

優(yōu)薩電子 AX-E-8ER/EX/EYR/EYT 擴(kuò)展模塊