杜隆胤 方冰 鄭軍
摘 要: 針對(duì)51單片機(jī)內(nèi)存資源非常有限,很難布設(shè)操作系統(tǒng),從而導(dǎo)致51單片機(jī)中多個(gè)功能有機(jī)融合比較困難的問題,首先分析了使用輕型的循環(huán)輪詢多任務(wù)編程思想在51單片機(jī)編程中的優(yōu)勢(shì);然后針對(duì)真實(shí)任務(wù)中存在阻塞問題,講述了如何對(duì)真實(shí)任務(wù)進(jìn)行分解以滿足系統(tǒng)實(shí)時(shí)性要求;最后分析了循環(huán)輪詢系統(tǒng)中周期性實(shí)時(shí)任務(wù)和非周期性實(shí)時(shí)任務(wù)的觸發(fā)方式,設(shè)計(jì)出了較為通用的、以周期性實(shí)時(shí)任務(wù)和中斷服務(wù)任務(wù)為基本觸發(fā)源的系統(tǒng)實(shí)現(xiàn)模板。
關(guān)鍵詞: 51單片機(jī); 循環(huán)輪詢系統(tǒng); 多任務(wù); 觸發(fā)條件
中圖分類號(hào):TP368.1 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):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)正悄然進(jìn)入到人們的生活。作為低成本、低功耗和易上手的嵌入式芯片典型代表——51單片機(jī)一開始就成為嵌入式家族中不可或缺的重要一分子[1]。但是,51單片機(jī)最典型的缺點(diǎn)就是片載資源少,一般不能采用操作系統(tǒng)作為系統(tǒng)的支撐,這就使得系統(tǒng)實(shí)現(xiàn)時(shí)缺少了進(jìn)程或任務(wù)的概念。在實(shí)現(xiàn)一些較復(fù)雜的應(yīng)用時(shí),多個(gè)真實(shí)任務(wù)相互制約使得系統(tǒng)實(shí)現(xiàn)非常困難,也為調(diào)試帶來較大的挑戰(zhàn)。因此、研究如何在51單片機(jī)有限資源的環(huán)境里實(shí)現(xiàn)輕型任務(wù)、以實(shí)現(xiàn)多任務(wù)編程以降低系統(tǒng)實(shí)現(xiàn)難度是非常有意義的。特別對(duì)于一些剛接觸51編程的人來說,多任務(wù)的思想無疑為編碼和調(diào)試帶來極大的便利。
1 背景
由于51單片機(jī)片載資源非常有限,因此在51單片機(jī)中布設(shè)操作系統(tǒng)非常困難[2]。沒有操作系統(tǒng)的支持,就為多功能有機(jī)融合帶來了困難。雖然沒有操作系統(tǒng)的支撐,但在系統(tǒng)實(shí)現(xiàn)過程中,采用任務(wù)的概念還是很必要的,否則將導(dǎo)致各個(gè)功能的融合很艱難。
一般情況下、任務(wù)可能的狀態(tài)有就緒態(tài)、執(zhí)行態(tài)和阻塞態(tài),在一些大型系統(tǒng)中會(huì)考慮的多任務(wù)執(zhí)行時(shí)資源的短缺而引入掛起態(tài)[3]。在51系統(tǒng)中一般不考慮任務(wù)的掛起問題,因?yàn)槿蝿?wù)的掛起也需要額外的資源;同時(shí)因?yàn)?1系統(tǒng)中內(nèi)存資源非常短缺,一般不考慮將任務(wù)包裝成“進(jìn)程”。因此51系統(tǒng)中、可仿照操作系統(tǒng)實(shí)現(xiàn)多任務(wù)的理念,將真實(shí)的任務(wù)轉(zhuǎn)換成無需占用太多資源的輕型任務(wù)。
系統(tǒng)多任務(wù)的實(shí)現(xiàn),按其最終的實(shí)現(xiàn)方式可分為批處理系統(tǒng)的多任務(wù)方式、分時(shí)系統(tǒng)多任務(wù)方式和循環(huán)輪詢方式。批處理系統(tǒng)的多任務(wù)方式是按一定先后順序?qū)⒍鄠€(gè)任務(wù)逐個(gè)完成的。為避免整個(gè)計(jì)算機(jī)系統(tǒng)處于阻塞態(tài)、需將任務(wù)包裝成“進(jìn)程”,這會(huì)引起額外的資源開銷,同時(shí)批處理系統(tǒng)在保證系統(tǒng)的實(shí)時(shí)性方面也表現(xiàn)得不夠好;在分時(shí)實(shí)現(xiàn)方式中,采用合適的時(shí)間片和任務(wù)優(yōu)先級(jí)可以較好的保證系統(tǒng)的實(shí)時(shí)性,但是分時(shí)系統(tǒng)中的任務(wù)需要進(jìn)行包裝。即為了實(shí)現(xiàn)任務(wù)的自由切換而將從執(zhí)行態(tài)的任務(wù)執(zhí)行現(xiàn)場(chǎng)進(jìn)行保存,為下一次投入運(yùn)行作準(zhǔn)備。因此采用分時(shí)系統(tǒng)理念的多任務(wù)實(shí)現(xiàn)方式也會(huì)產(chǎn)生額外的資源需求,因此在51系統(tǒng)中一般不考慮采用分時(shí)系統(tǒng)的多任務(wù)實(shí)現(xiàn)方式。
因此,在資源短缺的51單片及系統(tǒng)中,循環(huán)輪詢的輕型多任務(wù)思想是一個(gè)不錯(cuò)的選擇。經(jīng)過筆者多年的實(shí)踐證明,該實(shí)現(xiàn)方法能有效降低系統(tǒng)實(shí)現(xiàn)的復(fù)雜性,使得編程思路清晰,實(shí)現(xiàn)的系統(tǒng)調(diào)試方便,且能滿足應(yīng)用的實(shí)時(shí)性方面的需求。
2 循環(huán)輪詢?nèi)蝿?wù)的設(shè)計(jì)
循環(huán)輪詢的實(shí)現(xiàn)方式中,認(rèn)為每個(gè)任務(wù)的執(zhí)行都是有一定的前提條件的,常見的執(zhí)行條件有時(shí)間點(diǎn)到、前驅(qū)任務(wù)執(zhí)行結(jié)束、某一特殊事件發(fā)生等等。因此設(shè)計(jì)系統(tǒng)時(shí)在系統(tǒng)的主循環(huán)里不斷地查詢各個(gè)任務(wù)的執(zhí)行條件,一旦條件滿足就立即執(zhí)行任務(wù)。一個(gè)簡(jiǎn)單的循環(huán)輪詢系統(tǒng)程序流程圖如圖1所示。
循環(huán)輪詢中查詢的順序與任務(wù)的優(yōu)先級(jí)有一定關(guān)系,通過改變查詢順序可以改變?nèi)蝿?wù)之間的優(yōu)先級(jí)。各任務(wù)的執(zhí)行條件可能在其他任務(wù)的執(zhí)行期間產(chǎn)生,也可能在中斷服務(wù)程序執(zhí)行期間產(chǎn)生。對(duì)于執(zhí)行條件在其他任務(wù)中產(chǎn)生的那種具有前驅(qū)和后繼關(guān)系的任務(wù),不能簡(jiǎn)單改變查詢順序來改變?nèi)蝿?wù)之間的優(yōu)先級(jí)。而在循環(huán)輪詢系統(tǒng)中,任務(wù)的前驅(qū)/后繼關(guān)系的應(yīng)用是非常重要的。
為了能夠保證系統(tǒng)的實(shí)時(shí)性,在循環(huán)輪詢系統(tǒng)中各任務(wù)的執(zhí)行是不允許出現(xiàn)“阻塞態(tài)”的。因?yàn)橐坏┠骋蝗蝿?wù)進(jìn)入阻塞態(tài),特別是一些需要長(zhǎng)時(shí)間延時(shí)的阻塞或需要其他任務(wù)或中斷程序的執(zhí)行而產(chǎn)生條件的阻塞,輕則降低系統(tǒng)的實(shí)時(shí)性,嚴(yán)重時(shí)可能導(dǎo)致系統(tǒng)無法繼續(xù)運(yùn)行。在設(shè)計(jì)循環(huán)輪詢系統(tǒng)時(shí)盡量避免在任務(wù)執(zhí)行中有長(zhǎng)時(shí)間的延時(shí)或無時(shí)間限制地等待某一事件的產(chǎn)生[4]。
因此可以說循環(huán)輪詢系統(tǒng)中的任務(wù)只有執(zhí)行態(tài)和就緒態(tài),沒有阻塞態(tài)。即每個(gè)任務(wù)都是當(dāng)條件滿足就得以順利執(zhí)行、直至執(zhí)行結(jié)束。正因?yàn)槿∠俗枞母拍?,在設(shè)計(jì)任務(wù)時(shí)就不能將一些需要等待某一事件的發(fā)生或等待某一事件發(fā)生的過程設(shè)計(jì)在任務(wù)內(nèi)。每個(gè)任務(wù)都應(yīng)該是“一帆風(fēng)順”地執(zhí)行的,當(dāng)條件成熟就順利地執(zhí)行完所有操作,而且這些操作不應(yīng)該占用太多處理器時(shí)間。然而實(shí)際應(yīng)用中真實(shí)任務(wù)的往往并非"一帆風(fēng)順",一般都需要延時(shí)或等待某一條件的產(chǎn)生才能往下執(zhí)行。即一般意義的任務(wù)往往是具有“阻塞”情況的。
因此在設(shè)計(jì)循環(huán)輪詢?nèi)蝿?wù)時(shí)不能再按照原始的真實(shí)任務(wù)設(shè)計(jì),而應(yīng)將阻塞前的任務(wù)和阻塞后的任務(wù)分成不同的輪詢?nèi)蝿?wù)。具體分解方法如圖2所示。
因?yàn)樽枞蟮拇a是等待某個(gè)事件的發(fā)生才能執(zhí)行的,而該事件的捕捉一般是在其他任務(wù)里或中斷中。因此可以在等待某個(gè)事件發(fā)生時(shí)設(shè)置一個(gè)輪詢條件,而阻塞后的任務(wù)以此為輪詢條件即可實(shí)現(xiàn)等待事件發(fā)生后執(zhí)行相應(yīng)任務(wù)。
該解決方案也存在一個(gè)缺陷:當(dāng)阻塞條件滿足后,等待該阻塞條件的任務(wù)不一定馬上能執(zhí)行,不能保證后續(xù)任務(wù)的實(shí)時(shí)性。可以通過合理安排輪詢順序,或者在捕捉阻塞條件的任務(wù)或中斷中,立即執(zhí)行后續(xù)任務(wù)進(jìn)行改善。
3 循環(huán)輪詢系統(tǒng)多任務(wù)的實(shí)現(xiàn)
循環(huán)輪詢系統(tǒng)中的任務(wù)都是通過查詢執(zhí)行條件執(zhí)行的,因此、任務(wù)執(zhí)行條件的產(chǎn)生就成了循環(huán)輪詢系統(tǒng)設(shè)計(jì)中非常關(guān)鍵的一環(huán)。只有每個(gè)任務(wù)的執(zhí)行條件都按要求實(shí)時(shí)地產(chǎn)生了,在系統(tǒng)輪詢優(yōu)先級(jí)恰當(dāng)?shù)那闆r下才能保證系統(tǒng)的實(shí)時(shí)性。為了準(zhǔn)確及時(shí)的產(chǎn)生各任務(wù)的執(zhí)行條件,我們首先必須對(duì)任務(wù)本身的特性進(jìn)行分析。
實(shí)時(shí)系統(tǒng)中的任務(wù)可根據(jù)其執(zhí)行與時(shí)間的關(guān)系分為周期性實(shí)時(shí)任務(wù)和非周期性實(shí)時(shí)任務(wù)。等待某一特定事件發(fā)生的任務(wù)一般為非周期性實(shí)時(shí)任務(wù),如按鍵響應(yīng)任務(wù)、溫度值達(dá)到某一水平時(shí)執(zhí)行的任務(wù)等;需要按固定周期執(zhí)行的任務(wù)叫做周期性實(shí)時(shí)任務(wù),如多位數(shù)碼管的刷新任務(wù)、按鍵掃描任務(wù)、系統(tǒng)時(shí)鐘更新任務(wù)等等。經(jīng)分析發(fā)現(xiàn),實(shí)時(shí)系統(tǒng)中一般非周期性任務(wù)的執(zhí)行條件都是由其他任務(wù)或中斷服務(wù)程序產(chǎn)生的,即非周期性實(shí)時(shí)任務(wù)的執(zhí)行條件發(fā)生源包括周期性實(shí)時(shí)任務(wù)、中斷服務(wù)程序和其他非周期任務(wù),而非周期性實(shí)時(shí)任務(wù)最終都是由周期性實(shí)時(shí)任務(wù)和中斷服務(wù)程序驅(qū)動(dòng)的[5]。因此設(shè)計(jì)循環(huán)輪詢系統(tǒng)時(shí),首先需要設(shè)計(jì)好系統(tǒng)中各中斷服務(wù)程序來及時(shí)產(chǎn)生觸發(fā)條件,其次要設(shè)計(jì)好各周期性實(shí)時(shí)任務(wù)的觸發(fā)。
對(duì)于中斷服務(wù)程序驅(qū)動(dòng)非周期性實(shí)時(shí)任務(wù)的情況,相對(duì)比較簡(jiǎn)單,只要在中斷服務(wù)程序中判斷其需觸發(fā)的程序的先決條件是否達(dá)到要求,一旦滿足要求就將其循環(huán)輪詢條件值置真即可。
系統(tǒng)中周期性實(shí)時(shí)任務(wù)的觸發(fā)條件產(chǎn)生方式有兩種:硬觸發(fā)和軟觸發(fā)。所謂軟觸發(fā)就是通過軟件延時(shí)實(shí)現(xiàn)周期性任務(wù)的觸發(fā)。該方式實(shí)現(xiàn)思路簡(jiǎn)單,但觸發(fā)周期不夠準(zhǔn)確,只能實(shí)現(xiàn)比較初略的周期定時(shí),在一些小型的對(duì)實(shí)時(shí)性要求不高的應(yīng)用中采用;所謂硬觸發(fā)就是利用系統(tǒng)內(nèi)的定時(shí)/計(jì)數(shù)器周期性地產(chǎn)生觸發(fā)信號(hào)。該方式能較為準(zhǔn)確的產(chǎn)生周期性的觸發(fā)信號(hào),保證每個(gè)周期任務(wù)能及時(shí)執(zhí)行,但該方式需要程序員對(duì)系統(tǒng)整體結(jié)構(gòu)要有清晰的認(rèn)識(shí)。兩種方式在不同周期的周期性任務(wù)的觸發(fā)條件產(chǎn)生方式上是一致的,本文就以硬觸發(fā)方式為例,探討如何為不同周期的周期性實(shí)時(shí)任務(wù)產(chǎn)生觸發(fā)條件。
假設(shè)系統(tǒng)內(nèi)有n個(gè)周期性實(shí)時(shí)任務(wù)t1,t2,……,tn,它們的執(zhí)行周期分別為c1,c2,……,cn,我們可以計(jì)算出c1,c2,……,cn的最大公約數(shù)Δt,因此,可以得到每個(gè)任務(wù)的執(zhí)行周期與Δt的倍數(shù)關(guān)系值M1,M2,……,Mn。可以通過設(shè)置定時(shí)/計(jì)數(shù)器以實(shí)現(xiàn)每Δt發(fā)生一次定時(shí)/計(jì)數(shù)器中斷,在編寫中斷服務(wù)程序時(shí)就可以根據(jù)需要周期性的產(chǎn)生各周期性任務(wù)的觸發(fā)信號(hào)了。其關(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可以盡量避免在同一個(gè)時(shí)間點(diǎn)執(zhí)行多道任務(wù)的情況發(fā)生,同時(shí)也可以實(shí)現(xiàn)將多個(gè)執(zhí)行周期相同的任務(wù)的按一定時(shí)延(Δt的整數(shù)倍)先后被觸發(fā)的效果。該方法針對(duì)一些需要周期性執(zhí)行、而且在執(zhí)行期間有較長(zhǎng)延時(shí)而分解成多個(gè)任務(wù)的情況非常有用。對(duì)于一些應(yīng)用中計(jì)算出的Δt比較小的情況,可以根據(jù)實(shí)際情況適當(dāng)調(diào)整各任務(wù)的周期,使得它們的最大公約數(shù)更大,一般最理想的情況是Δt為最小任務(wù)周期,即Δt=min(c1,c2,……,cn),這樣可以減少因?yàn)槎〞r(shí)中斷而產(chǎn)生的CPU時(shí)間開銷。
由于非周期性實(shí)時(shí)任務(wù)的執(zhí)行條件一般在周期性任務(wù)或中斷服務(wù)程序中產(chǎn)生,因此通過以上方式完成所有周期性實(shí)時(shí)任務(wù)的準(zhǔn)時(shí)觸發(fā)后,就能保證系統(tǒng)中所有任務(wù)的到實(shí)時(shí)的觸發(fā)了。
4 結(jié)束語
本文從51單片機(jī)資源短缺、不適宜于布設(shè)操作系統(tǒng)說起,分析了51單品機(jī)系統(tǒng)開發(fā)中采用循環(huán)輪詢多任務(wù)思想的優(yōu)勢(shì);然后針對(duì)循環(huán)輪詢中任務(wù)的特性和真實(shí)任務(wù)之間的不同,講述了如何根據(jù)真實(shí)任務(wù)本身的執(zhí)行流程,對(duì)其進(jìn)行有目的拆分,以使得最終在系統(tǒng)布設(shè)的每個(gè)任務(wù)的執(zhí)行均不會(huì)出現(xiàn)長(zhǎng)時(shí)間延時(shí)或等待事件產(chǎn)生的阻塞情況發(fā)生;最后分析了周期性實(shí)時(shí)任務(wù)和非周期性實(shí)時(shí)任務(wù)的觸發(fā)條件的產(chǎn)生源,以硬觸發(fā)為例設(shè)計(jì)了一個(gè)可以保證各任務(wù)準(zhǔn)時(shí)觸發(fā)的系統(tǒng)實(shí)現(xiàn)模板。但是由于真實(shí)系統(tǒng)中任務(wù)的復(fù)雜性遠(yuǎn)遠(yuǎn)超出了本文所分析的范疇,因此該系統(tǒng)實(shí)現(xiàn)模板很難適應(yīng)所有開發(fā)場(chǎng)景,還需要針對(duì)具體應(yīng)用進(jìn)行改進(jìn)。由于作者才疏學(xué)淺,不妥或錯(cuò)誤之處在所難免,懇請(qǐng)同行、專家批評(píng)指正。
參考文獻(xiàn)(References):
[1] 張威等.MCS-51嵌入式系統(tǒng)原理及應(yīng)用[M].中國(guó)石化出版社,2015.
[2] CSDN.51單片機(jī)多任務(wù)操作系統(tǒng)的原理與實(shí)現(xiàn)[EB/OL].[2016年03月14日].https://blog.csdn.net/wuhenyouyuyouyu/article/details/50883704l.
[3] 湯小丹等.計(jì)算機(jī)操作系統(tǒng)(第3版)[M].西安電子科技大學(xué)出版社,2007.
[4] 張仁寬.51單片機(jī)多任務(wù)編程設(shè)計(jì)及應(yīng)用淺談[J].中國(guó)培訓(xùn),2016.8:260
[5] 李鵬.51單片機(jī)多任務(wù)機(jī)制的實(shí)現(xiàn)策略研究[J].山東工業(yè)技術(shù),2016.7:252