杜隆胤 方冰 鄭軍
摘 要: 針對51單片機內(nèi)存資源非常有限,很難布設(shè)操作系統(tǒng),從而導(dǎo)致51單片機中多個功能有機融合比較困難的問題,首先分析了使用輕型的循環(huán)輪詢多任務(wù)編程思想在51單片機編程中的優(yōu)勢;然后針對真實任務(wù)中存在阻塞問題,講述了如何對真實任務(wù)進行分解以滿足系統(tǒng)實時性要求;最后分析了循環(huán)輪詢系統(tǒng)中周期性實時任務(wù)和非周期性實時任務(wù)的觸發(fā)方式,設(shè)計出了較為通用的、以周期性實時任務(wù)和中斷服務(wù)任務(wù)為基本觸發(fā)源的系統(tǒng)實現(xiàn)模板。
關(guān)鍵詞: 51單片機; 循環(huán)輪詢系統(tǒng); 多任務(wù); 觸發(fā)條件
中圖分類號:TP368.1 文獻標(biāo)志碼:A 文章編號:1006-8228(2018)10-01-03
Abstract: This paper is aimed at the problem that it's difficult to implement multifunctional system in 51 single chip microcomputer, because the RAM of 51 single chip microcomputer is so limited that it's impossible to place operating system into it. The advantage of the method of polling loop system multitask programming is analyzed. The really task is divided into a lot of tasks in order to ensure the real-time characteristic of the system, and avoid the task to be blocked. The trigger conditions of periodic real-time task and aperiodic real-time task are analyzed, and a software template for 51 single chip microcomputer with the basic trigger sources of periodic real-time tasks and interrupt service tasks is designed.
Key words: 51 single chip microcomputer; polling loop system; multitask; trigger condition
0 引言
今天,智慧城市、智慧小區(qū)、數(shù)字化校園等概念逐步深入人們的生活,嵌入式系統(tǒng)正悄然進入到人們的生活。作為低成本、低功耗和易上手的嵌入式芯片典型代表——51單片機一開始就成為嵌入式家族中不可或缺的重要一分子[1]。但是,51單片機最典型的缺點就是片載資源少,一般不能采用操作系統(tǒng)作為系統(tǒng)的支撐,這就使得系統(tǒng)實現(xiàn)時缺少了進程或任務(wù)的概念。在實現(xiàn)一些較復(fù)雜的應(yīng)用時,多個真實任務(wù)相互制約使得系統(tǒng)實現(xiàn)非常困難,也為調(diào)試帶來較大的挑戰(zhàn)。因此、研究如何在51單片機有限資源的環(huán)境里實現(xiàn)輕型任務(wù)、以實現(xiàn)多任務(wù)編程以降低系統(tǒng)實現(xiàn)難度是非常有意義的。特別對于一些剛接觸51編程的人來說,多任務(wù)的思想無疑為編碼和調(diào)試帶來極大的便利。
1 背景
由于51單片機片載資源非常有限,因此在51單片機中布設(shè)操作系統(tǒng)非常困難[2]。沒有操作系統(tǒng)的支持,就為多功能有機融合帶來了困難。雖然沒有操作系統(tǒng)的支撐,但在系統(tǒng)實現(xiàn)過程中,采用任務(wù)的概念還是很必要的,否則將導(dǎo)致各個功能的融合很艱難。
一般情況下、任務(wù)可能的狀態(tài)有就緒態(tài)、執(zhí)行態(tài)和阻塞態(tài),在一些大型系統(tǒng)中會考慮的多任務(wù)執(zhí)行時資源的短缺而引入掛起態(tài)[3]。在51系統(tǒng)中一般不考慮任務(wù)的掛起問題,因為任務(wù)的掛起也需要額外的資源;同時因為51系統(tǒng)中內(nèi)存資源非常短缺,一般不考慮將任務(wù)包裝成“進程”。因此51系統(tǒng)中、可仿照操作系統(tǒng)實現(xiàn)多任務(wù)的理念,將真實的任務(wù)轉(zhuǎn)換成無需占用太多資源的輕型任務(wù)。
系統(tǒng)多任務(wù)的實現(xiàn),按其最終的實現(xiàn)方式可分為批處理系統(tǒng)的多任務(wù)方式、分時系統(tǒng)多任務(wù)方式和循環(huán)輪詢方式。批處理系統(tǒng)的多任務(wù)方式是按一定先后順序?qū)⒍鄠€任務(wù)逐個完成的。為避免整個計算機系統(tǒng)處于阻塞態(tài)、需將任務(wù)包裝成“進程”,這會引起額外的資源開銷,同時批處理系統(tǒng)在保證系統(tǒng)的實時性方面也表現(xiàn)得不夠好;在分時實現(xiàn)方式中,采用合適的時間片和任務(wù)優(yōu)先級可以較好的保證系統(tǒng)的實時性,但是分時系統(tǒng)中的任務(wù)需要進行包裝。即為了實現(xiàn)任務(wù)的自由切換而將從執(zhí)行態(tài)的任務(wù)執(zhí)行現(xiàn)場進行保存,為下一次投入運行作準備。因此采用分時系統(tǒng)理念的多任務(wù)實現(xiàn)方式也會產(chǎn)生額外的資源需求,因此在51系統(tǒng)中一般不考慮采用分時系統(tǒng)的多任務(wù)實現(xiàn)方式。
因此,在資源短缺的51單片及系統(tǒng)中,循環(huán)輪詢的輕型多任務(wù)思想是一個不錯的選擇。經(jīng)過筆者多年的實踐證明,該實現(xiàn)方法能有效降低系統(tǒng)實現(xiàn)的復(fù)雜性,使得編程思路清晰,實現(xiàn)的系統(tǒng)調(diào)試方便,且能滿足應(yīng)用的實時性方面的需求。
2 循環(huán)輪詢?nèi)蝿?wù)的設(shè)計
循環(huán)輪詢的實現(xiàn)方式中,認為每個任務(wù)的執(zhí)行都是有一定的前提條件的,常見的執(zhí)行條件有時間點到、前驅(qū)任務(wù)執(zhí)行結(jié)束、某一特殊事件發(fā)生等等。因此設(shè)計系統(tǒng)時在系統(tǒng)的主循環(huán)里不斷地查詢各個任務(wù)的執(zhí)行條件,一旦條件滿足就立即執(zhí)行任務(wù)。一個簡單的循環(huán)輪詢系統(tǒng)程序流程圖如圖1所示。
循環(huán)輪詢中查詢的順序與任務(wù)的優(yōu)先級有一定關(guān)系,通過改變查詢順序可以改變?nèi)蝿?wù)之間的優(yōu)先級。各任務(wù)的執(zhí)行條件可能在其他任務(wù)的執(zhí)行期間產(chǎn)生,也可能在中斷服務(wù)程序執(zhí)行期間產(chǎn)生。對于執(zhí)行條件在其他任務(wù)中產(chǎn)生的那種具有前驅(qū)和后繼關(guān)系的任務(wù),不能簡單改變查詢順序來改變?nèi)蝿?wù)之間的優(yōu)先級。而在循環(huán)輪詢系統(tǒng)中,任務(wù)的前驅(qū)/后繼關(guān)系的應(yīng)用是非常重要的。
為了能夠保證系統(tǒng)的實時性,在循環(huán)輪詢系統(tǒng)中各任務(wù)的執(zhí)行是不允許出現(xiàn)“阻塞態(tài)”的。因為一旦某一任務(wù)進入阻塞態(tài),特別是一些需要長時間延時的阻塞或需要其他任務(wù)或中斷程序的執(zhí)行而產(chǎn)生條件的阻塞,輕則降低系統(tǒng)的實時性,嚴重時可能導(dǎo)致系統(tǒng)無法繼續(xù)運行。在設(shè)計循環(huán)輪詢系統(tǒng)時盡量避免在任務(wù)執(zhí)行中有長時間的延時或無時間限制地等待某一事件的產(chǎn)生[4]。
因此可以說循環(huán)輪詢系統(tǒng)中的任務(wù)只有執(zhí)行態(tài)和就緒態(tài),沒有阻塞態(tài)。即每個任務(wù)都是當(dāng)條件滿足就得以順利執(zhí)行、直至執(zhí)行結(jié)束。正因為取消了阻塞的概念,在設(shè)計任務(wù)時就不能將一些需要等待某一事件的發(fā)生或等待某一事件發(fā)生的過程設(shè)計在任務(wù)內(nèi)。每個任務(wù)都應(yīng)該是“一帆風(fēng)順”地執(zhí)行的,當(dāng)條件成熟就順利地執(zhí)行完所有操作,而且這些操作不應(yīng)該占用太多處理器時間。然而實際應(yīng)用中真實任務(wù)的往往并非"一帆風(fēng)順",一般都需要延時或等待某一條件的產(chǎn)生才能往下執(zhí)行。即一般意義的任務(wù)往往是具有“阻塞”情況的。
因此在設(shè)計循環(huán)輪詢?nèi)蝿?wù)時不能再按照原始的真實任務(wù)設(shè)計,而應(yīng)將阻塞前的任務(wù)和阻塞后的任務(wù)分成不同的輪詢?nèi)蝿?wù)。具體分解方法如圖2所示。
因為阻塞后的代碼是等待某個事件的發(fā)生才能執(zhí)行的,而該事件的捕捉一般是在其他任務(wù)里或中斷中。因此可以在等待某個事件發(fā)生時設(shè)置一個輪詢條件,而阻塞后的任務(wù)以此為輪詢條件即可實現(xiàn)等待事件發(fā)生后執(zhí)行相應(yīng)任務(wù)。
該解決方案也存在一個缺陷:當(dāng)阻塞條件滿足后,等待該阻塞條件的任務(wù)不一定馬上能執(zhí)行,不能保證后續(xù)任務(wù)的實時性??梢酝ㄟ^合理安排輪詢順序,或者在捕捉阻塞條件的任務(wù)或中斷中,立即執(zhí)行后續(xù)任務(wù)進行改善。
3 循環(huán)輪詢系統(tǒng)多任務(wù)的實現(xiàn)
循環(huán)輪詢系統(tǒng)中的任務(wù)都是通過查詢執(zhí)行條件執(zhí)行的,因此、任務(wù)執(zhí)行條件的產(chǎn)生就成了循環(huán)輪詢系統(tǒng)設(shè)計中非常關(guān)鍵的一環(huán)。只有每個任務(wù)的執(zhí)行條件都按要求實時地產(chǎn)生了,在系統(tǒng)輪詢優(yōu)先級恰當(dāng)?shù)那闆r下才能保證系統(tǒng)的實時性。為了準確及時的產(chǎn)生各任務(wù)的執(zhí)行條件,我們首先必須對任務(wù)本身的特性進行分析。
實時系統(tǒng)中的任務(wù)可根據(jù)其執(zhí)行與時間的關(guān)系分為周期性實時任務(wù)和非周期性實時任務(wù)。等待某一特定事件發(fā)生的任務(wù)一般為非周期性實時任務(wù),如按鍵響應(yīng)任務(wù)、溫度值達到某一水平時執(zhí)行的任務(wù)等;需要按固定周期執(zhí)行的任務(wù)叫做周期性實時任務(wù),如多位數(shù)碼管的刷新任務(wù)、按鍵掃描任務(wù)、系統(tǒng)時鐘更新任務(wù)等等。經(jīng)分析發(fā)現(xiàn),實時系統(tǒng)中一般非周期性任務(wù)的執(zhí)行條件都是由其他任務(wù)或中斷服務(wù)程序產(chǎn)生的,即非周期性實時任務(wù)的執(zhí)行條件發(fā)生源包括周期性實時任務(wù)、中斷服務(wù)程序和其他非周期任務(wù),而非周期性實時任務(wù)最終都是由周期性實時任務(wù)和中斷服務(wù)程序驅(qū)動的[5]。因此設(shè)計循環(huán)輪詢系統(tǒng)時,首先需要設(shè)計好系統(tǒng)中各中斷服務(wù)程序來及時產(chǎn)生觸發(fā)條件,其次要設(shè)計好各周期性實時任務(wù)的觸發(fā)。
對于中斷服務(wù)程序驅(qū)動非周期性實時任務(wù)的情況,相對比較簡單,只要在中斷服務(wù)程序中判斷其需觸發(fā)的程序的先決條件是否達到要求,一旦滿足要求就將其循環(huán)輪詢條件值置真即可。
系統(tǒng)中周期性實時任務(wù)的觸發(fā)條件產(chǎn)生方式有兩種:硬觸發(fā)和軟觸發(fā)。所謂軟觸發(fā)就是通過軟件延時實現(xiàn)周期性任務(wù)的觸發(fā)。該方式實現(xiàn)思路簡單,但觸發(fā)周期不夠準確,只能實現(xiàn)比較初略的周期定時,在一些小型的對實時性要求不高的應(yīng)用中采用;所謂硬觸發(fā)就是利用系統(tǒng)內(nèi)的定時/計數(shù)器周期性地產(chǎn)生觸發(fā)信號。該方式能較為準確的產(chǎn)生周期性的觸發(fā)信號,保證每個周期任務(wù)能及時執(zhí)行,但該方式需要程序員對系統(tǒng)整體結(jié)構(gòu)要有清晰的認識。兩種方式在不同周期的周期性任務(wù)的觸發(fā)條件產(chǎn)生方式上是一致的,本文就以硬觸發(fā)方式為例,探討如何為不同周期的周期性實時任務(wù)產(chǎn)生觸發(fā)條件。
假設(shè)系統(tǒng)內(nèi)有n個周期性實時任務(wù)t1,t2,……,tn,它們的執(zhí)行周期分別為c1,c2,……,cn,我們可以計算出c1,c2,……,cn的最大公約數(shù)Δt,因此,可以得到每個任務(wù)的執(zhí)行周期與Δt的倍數(shù)關(guān)系值M1,M2,……,Mn。可以通過設(shè)置定時/計數(shù)器以實現(xiàn)每Δt發(fā)生一次定時/計數(shù)器中斷,在編寫中斷服務(wù)程序時就可以根據(jù)需要周期性的產(chǎn)生各周期性任務(wù)的觸發(fā)信號了。其關(guān)鍵代碼如下:
#defind MMAX Mm //Mm=MAX(M1,M2,……,Mm)
void interrupt_timerX() interrupt Y using Z
//每Δt執(zhí)行一次該中斷服務(wù)程序
{ ……
count++;
count %=MMAX;
if(count % M1==x1) condition_t1=1; //觸發(fā)t1
if(count % M2==x2) condition_t2=1; //觸發(fā)t2
……
if(count % Mn==xn) condition_tn=1; //觸發(fā)tn
}
其中MMAX為M1,M2,……,Mn中的最大值,condition_tm為任務(wù)m的觸發(fā)條件。通過巧妙設(shè)置x1,x2,……,xn可以盡量避免在同一個時間點執(zhí)行多道任務(wù)的情況發(fā)生,同時也可以實現(xiàn)將多個執(zhí)行周期相同的任務(wù)的按一定時延(Δt的整數(shù)倍)先后被觸發(fā)的效果。該方法針對一些需要周期性執(zhí)行、而且在執(zhí)行期間有較長延時而分解成多個任務(wù)的情況非常有用。對于一些應(yīng)用中計算出的Δt比較小的情況,可以根據(jù)實際情況適當(dāng)調(diào)整各任務(wù)的周期,使得它們的最大公約數(shù)更大,一般最理想的情況是Δt為最小任務(wù)周期,即Δt=min(c1,c2,……,cn),這樣可以減少因為定時中斷而產(chǎn)生的CPU時間開銷。
由于非周期性實時任務(wù)的執(zhí)行條件一般在周期性任務(wù)或中斷服務(wù)程序中產(chǎn)生,因此通過以上方式完成所有周期性實時任務(wù)的準時觸發(fā)后,就能保證系統(tǒng)中所有任務(wù)的到實時的觸發(fā)了。
4 結(jié)束語
本文從51單片機資源短缺、不適宜于布設(shè)操作系統(tǒng)說起,分析了51單品機系統(tǒng)開發(fā)中采用循環(huán)輪詢多任務(wù)思想的優(yōu)勢;然后針對循環(huán)輪詢中任務(wù)的特性和真實任務(wù)之間的不同,講述了如何根據(jù)真實任務(wù)本身的執(zhí)行流程,對其進行有目的拆分,以使得最終在系統(tǒng)布設(shè)的每個任務(wù)的執(zhí)行均不會出現(xiàn)長時間延時或等待事件產(chǎn)生的阻塞情況發(fā)生;最后分析了周期性實時任務(wù)和非周期性實時任務(wù)的觸發(fā)條件的產(chǎn)生源,以硬觸發(fā)為例設(shè)計了一個可以保證各任務(wù)準時觸發(fā)的系統(tǒng)實現(xiàn)模板。但是由于真實系統(tǒng)中任務(wù)的復(fù)雜性遠遠超出了本文所分析的范疇,因此該系統(tǒng)實現(xiàn)模板很難適應(yīng)所有開發(fā)場景,還需要針對具體應(yīng)用進行改進。由于作者才疏學(xué)淺,不妥或錯誤之處在所難免,懇請同行、專家批評指正。
參考文獻(References):
[1] 張威等.MCS-51嵌入式系統(tǒng)原理及應(yīng)用[M].中國石化出版社,2015.
[2] CSDN.51單片機多任務(wù)操作系統(tǒng)的原理與實現(xiàn)[EB/OL].[2016年03月14日].https://blog.csdn.net/wuhenyouyuyouyu/article/details/50883704l.
[3] 湯小丹等.計算機操作系統(tǒng)(第3版)[M].西安電子科技大學(xué)出版社,2007.
[4] 張仁寬.51單片機多任務(wù)編程設(shè)計及應(yīng)用淺談[J].中國培訓(xùn),2016.8:260
[5] 李鵬.51單片機多任務(wù)機制的實現(xiàn)策略研究[J].山東工業(yè)技術(shù),2016.7:252