虞益龍
(常州劉國鈞高等職業(yè)技術學校,江蘇 常州 213000)
傳統(tǒng)的單片機程序設計多為單任務系統(tǒng),其業(yè)務邏輯順序安排在主函數(shù)中,主函數(shù)一般為死循環(huán),循環(huán)過程中通過調用函數(shù)來完成相應的操作,而對于一些較短的實時任務則通過中斷方式進行處理。此種程序結構簡單、直觀,易于實現(xiàn),但對于較復雜的應用此種結構實現(xiàn)不了,并且不能滿足實時性要求較高的場合,因此必須考慮一種新的結構模式。
本文提出的方法也是按時間片切換任務的,但不同的是,執(zhí)行任務的時間不是由定時器平均分配的,而是按照執(zhí)行任務中一個完整過程的時間來自動分配的。在單片機系統(tǒng)程式設計中,可按系統(tǒng)的功能或模塊劃分為任務,而每個任務可按具體作業(yè)細分為各個過程??梢娙蝿沼蛇^程組成。按時間片分配任務的設計,系統(tǒng)效率就會更高。
多任務輪循程序架構就是一個系統(tǒng)由多個任務構成,各任務之間相對獨立。本文提出一種基于定時器中斷的多任務輪循程序架構,如圖1所示。在主程序中,根據(jù)任務延時量判斷任務是否就緒,各任務輪循占用CPU時間,由任務延時量控制任務執(zhí)行頻度及CPU關照度,而任務延時量又由定時器T0中斷控制。
圖1 定時中斷的多任務輪循程序架構流程圖
基于定時器中斷的多任務輪循架構中,子任務的執(zhí)行依靠主程序任務調度來實現(xiàn),子任務不能設計成死循環(huán)流程。正因為各任務不搶占CPU,所以程序設計不用考慮現(xiàn)場保護問題,簡化了程序設計。程序整體架構有定時器固定節(jié)拍中斷,該節(jié)拍需滿足最快任務執(zhí)行頻度需要。定義定時中斷頻度,由執(zhí)行頻度要求最快的任務確定,太高會降低CPU運行效率,太低任務頻度不好分配,一般低于200Hz即可。本文采用50Hz。對于按鍵掃描程序模塊,每秒按50次頻度執(zhí)行即可,LCD1602和實時時鐘數(shù)據(jù)讀取模塊可以按每秒3次頻度執(zhí)行即可。
/*代碼說明:這里通過宏定義,在頭文件中把易變參數(shù)進行定義,這樣使得程序容易修改,一改全改,便于移植。*/
/*代碼說明:定時中斷在這里就是心臟,依靠定時中斷完成任務延時量的修改,從而實現(xiàn)不同任務運行頻度控制。*/
任務執(zhí)行頻度由任務延時量task_delay[ID]控制,各任務延時量在定時中斷中減一,直到延時量為零,相關任務就緒?!癐D”表示各任務代號。任務調度過程就是對任務延時量檢測過程,只有任務延時量為零時,CPU從其它任務中返回后立即執(zhí)行相應的任務,由于不同任務延時量不同,從而實現(xiàn)不同任務具有不同的執(zhí)行頻度而相互不受時間影響。這里必須滿足一個條件,就是每個任務執(zhí)行一次的時間不能太長,不能超過一次定時中斷時間,否則任務之間執(zhí)行頻度會有影響,對于50Hz的中斷頻率,每個任務執(zhí)行時間最好不超過20ms,即CPU光顧一次任務時間要在20ms以內,這樣就可以保證任務之間相互完全不受影響。
定時器中斷服務等待任務就緒代碼如下:
/*代碼說明:在定時中斷服務中,執(zhí)行的任務必須很簡短,重置定時器初值,把大于0的任務延時量減1,該定時中斷作為心臟跳動,不斷進出運行,為了節(jié)省CPU時間,該中斷任務越簡單越好。*/
任務切換在主程序main()中完成,系統(tǒng)初始化之后,在一個大循環(huán)中,判斷各任務的延時量是否為零,當任務延時量為零時,表示該任務就緒,當前一個任務主動放棄CPU之后,馬上啟動就緒的新任務。各任務之間不具有搶占功能,因此不用考慮堆棧與保護。
主程序服務及任務切換代碼如下:
/*代碼說明:根據(jù)任務延時量是否為零選擇執(zhí)行就緒任務,任務執(zhí)行完成后返回再恢復設定的延時量;下劃線表示任務執(zhí)行的頻度,即每秒鐘執(zhí)行多少次。各個不同的任務,根據(jù)需要,設定不同的延時量,延時量在定時中斷中逐步減一歸零,每個任務必須主動放棄CPU,正因此,各任務執(zhí)行時間最好不要超過定時中斷節(jié)拍時間單位,本文為20ms,否則將影響其它任務運行。*/
/*代碼說明:任務延時量為零時,就緒任務執(zhí)行,任務過程可以根據(jù)需求設置若干個。例:數(shù)碼管顯示模塊可以放在任務0執(zhí)行,按鍵掃描程序模塊放在任務1執(zhí)行。*/
由此可見,系統(tǒng)按完整過程(最小作業(yè)單元)自動切換任務,不需保留臨時現(xiàn)場數(shù)據(jù),不需定時被動切換,不需額外的調度表。與單任務編程相比,多任務編程也沒有占用系統(tǒng)任何額外資源,其結構和代碼的可讀性也沒有較大的改變。
單片機多任務編程方法可歸納為:(1)在單片機多任務編程中,各任務依次排成隊列輪流執(zhí)行;(2)每次執(zhí)行任務只調用其一個過程來執(zhí)行,可保證各任務間最快速地切換;(3)各任務、過程間使用全局變量共享或交換數(shù)據(jù),避免各種參數(shù)傳遞。
在過去采用傳統(tǒng)方法設計復雜的單片機系統(tǒng)過程中,人們容易發(fā)現(xiàn)系統(tǒng)交叉調用多,重復代碼多,系統(tǒng)運行效率差,邏輯容易混亂且難以調試。鑒于此,需要探索一個結構清晰,易調試,任務明確且可重用、提高開發(fā)效率,無相互調用,無重復代碼的系統(tǒng)。采用定時中斷的多任務輪循程序架構,與傳統(tǒng)設計相比,基于該架構的系統(tǒng)產(chǎn)品消耗硬件資源少,運行效率高,其硬件功能更多以軟件取代,所以運行更穩(wěn)定,易維護,性價比高,取得了更高的經(jīng)濟效益。
[1]劉明路,王亮生,李世煜.基于RTX51的單片機軟件設計[J].單片機與嵌入式系統(tǒng)應用,2002(3).
[2]歐偉明.面向嵌入式系統(tǒng)設計的RTX51[J].應用技術研究,2007(5).
[3]周程.RTX51 Tiny在核數(shù)據(jù)采集系統(tǒng)中的應用[J].核電子學與探測技術,2008,599-610.
[4]劉光德,林莘,王群.基于RTX51嵌入式實時操作系統(tǒng)的智能稱重儀表的研究[J].科技應用,2004,7-9.
[5]KEIL Software,Inc.《RTX51 Real-time Kernel》[EB/OL].http://www.keil.com/rtx51,2004.