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