文輝 余麗萍
【摘 要】文章以單片機(jī)芯片AT89C51為依托,利用高級編程C語言設(shè)計出8位單片機(jī)的多任務(wù)處理的方法。介紹了其設(shè)計的原理,從單任務(wù)入手逐步分析多任務(wù)處理的具體過程,從而實(shí)現(xiàn)多任務(wù)并發(fā)執(zhí)行的功能。
【關(guān)鍵詞】AT89C51;C語言;多任務(wù)
傳統(tǒng)的單片機(jī)程序一般采用單任務(wù)機(jī)制。所謂"單任務(wù)機(jī)制"是指該系統(tǒng)不能支持多任務(wù)并發(fā)操作,宏觀串行地執(zhí)行一個任務(wù)。由于程序只能按順序依次執(zhí)行,缺乏靈活性。多任務(wù)機(jī)制則可以宏觀并行(微觀上是串行)地"同時"執(zhí)行多個任務(wù)。筆者設(shè)計的這種多任務(wù)機(jī)制,不需使用匯編,采用常用的C語言編寫,按照所給出的參數(shù),添加自己的任務(wù)代碼,就可以實(shí)現(xiàn)多任務(wù)的并發(fā)執(zhí)行。
1、單片機(jī)多任務(wù)機(jī)制的工作流程
本文采用美國 ATMEL 公司生產(chǎn)的 MCS51 系列兼容芯片,在通常的單片 AT89C51應(yīng)用情況下,程序被設(shè)計成一段無限循環(huán)的代碼while(1),即構(gòu)成一個連續(xù)執(zhí)行的單任務(wù)系統(tǒng)。
2、多任務(wù)并發(fā)設(shè)計
假設(shè)要控制一個LED燈的閃爍,其實(shí)現(xiàn)過程為:點(diǎn)亮LED,延時,關(guān)閉LED,延時,依次循環(huán)下去。但是,如果需要控制兩個LED燈的閃爍,一個是每一秒閃爍一次,另一個沒0.5秒閃爍一次,這就需要考慮將處理器的時間進(jìn)行分割,不同的任務(wù)獲得一定時間片段來執(zhí)行程序,當(dāng)這個時間片到期了,就中斷轉(zhuǎn)而由另外任務(wù)來獲得處理器的資源。本文所設(shè)計的方法為:采用一個自定義的進(jìn)程控制器(變量stp)將其分成四個部分。在LEDLight()函數(shù)中實(shí)現(xiàn)的偽代碼如下。
void LEDLight(vopid){
switch(stp)
{case 0:亮燈;stp++;break;
case 1:延時;stp++;break;
case 2:滅燈;stp++;break;
case 3:延時;stp=0;break;}}
每次進(jìn)入LEDLight這個函數(shù)只執(zhí)行了其中的一個小部分。接下來,對其中的每個小部分進(jìn)行改進(jìn)為某個小的任務(wù),而每個小任務(wù)又分成多個小部分。這樣,就形成了如下圖1所示的多任務(wù)機(jī)制。
圖1 多任務(wù)結(jié)構(gòu)程序流程圖
由于每個任務(wù)的執(zhí)行時間不盡相同,因此引入定時器來處理不同的延時。其工作原理是程序判定任務(wù)的記時器是否滿足條件而決定任務(wù)是否繼續(xù)執(zhí)行。因此上面的程序就改為:
void LEDLight(void){
static unsigned int stp=0;
switch(stp)
{case 0:亮燈;stp++;定時器初始化;break;
case 1:if(定時器未到)break;stp++;break;
case 2:滅燈;stp++;定時器初始化;break;
case 3: if(定時器未到)break;;stp=0;break;}}
定時器就是用變量做累加或者遞減,當(dāng)所設(shè)定的值自增或自減到了一定數(shù)量后(即消耗掉一定的時間)則作為一種程序的判定,如果定時器未到,則轉(zhuǎn)為下一個任務(wù)執(zhí)行,如果定時器到了,就開始執(zhí)行本地的任務(wù)。為了使軟件定時器更精準(zhǔn),就可以對硬件定時器的溢出次數(shù)計數(shù)。那軟件定時器的定時時間就是硬件定時器溢出時間的整數(shù)倍。因此程序改為:
unsigned char Timer[2]; /*兩個軟件定時器*/
void Timere0Irq(void) interrupt 1
{Timer[0]++;Timer[1]++;}
void LEDLight(void){
static unsigned int stp=0;
switch(stp)
{case 0:亮燈;stp++;Timer [i]=0;break;
case 1:if(Timer[i] case 2:滅燈;stp++;Timer[i]=0;break; case 3: if(Timer[i] 3、結(jié)束語 實(shí)現(xiàn)多任務(wù)操作除了本文中所介紹的方法之外還有其他的方法,如ARM開發(fā)常用的?C/OS-II、RTX-51TINY等。但是RTX-51TINY必須采用Keil公司的C51編譯器,?C/OS-II則對芯片的RAM空間要求比較高,51系列的芯片內(nèi)存空間有限無法裝入此?C/OS-II系統(tǒng)。 文章所采用的方法其結(jié)構(gòu)清晰,不需使用匯編語言,所用代碼較少,易于理解有效的提高了單片機(jī)處理器的效率。 作者簡介: 文輝(1979-),男,漢族,江西萍鄉(xiāng)人,江西信息應(yīng)用職業(yè)技術(shù)學(xué)院計算機(jī)技術(shù)系網(wǎng)絡(luò)教研室教師,研究方向:嵌入式系統(tǒng)。 余麗萍(1985-),女,漢族,江西進(jìn)賢人,南昌航空大學(xué)自動化學(xué)院06級信號與信息處理碩士研究生,研究方向:圖像處理與模式識別。 參考文獻(xiàn): [1] 阿占文等.單片機(jī)多任務(wù)操作的多功能采集卡設(shè)計[J].自動化儀表.2014(1). [2]郭天祥.新概念 51 單片機(jī) C 語言教程: 入門、提高、開發(fā)、拓展全攻略[M]. 北京: 電子工業(yè)出版社.2009. [3] 錢宜平.基于單片機(jī)應(yīng)用系統(tǒng)的多任務(wù)程序結(jié)構(gòu)設(shè)計[J].無錫職業(yè)技術(shù)學(xué)院學(xué)報.2014(3).