www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]本文介紹了一種在MCS51單片機(jī)程序中實(shí)現(xiàn)多任務(wù)機(jī)制的簡單方法,并給出了源代碼和一個(gè)應(yīng)用實(shí)例。

摘要:本文介紹了一種在MCS51單片機(jī)程序中實(shí)現(xiàn)多任務(wù)機(jī)制的簡單方法,并給出了源代碼和一個(gè)應(yīng)用實(shí)例。通過中斷進(jìn)行實(shí)時(shí)任務(wù)切換,具有結(jié)構(gòu)簡單清晰、代碼量少、不需使用匯編等優(yōu)點(diǎn)。該方法亦可應(yīng)用于其他單片機(jī)系統(tǒng)。
關(guān)鍵詞:多任務(wù)系統(tǒng) 單片機(jī) C51  中斷 安防系統(tǒng)

引言
    傳統(tǒng)的單片機(jī)程序一般采用單任務(wù)機(jī)制,單任務(wù)系統(tǒng)具有簡單直觀、易于控制的優(yōu)點(diǎn)。然而由于程序只能按順序依次執(zhí)行,缺乏靈活性,只能使用中斷函數(shù)實(shí)時(shí)地處理一些較短的任務(wù),在較復(fù)雜的應(yīng)用中使用極為不便。嵌入式多任務(wù)操作系統(tǒng)的出現(xiàn)解決了這個(gè)問題。在多任務(wù)系統(tǒng)中,可以同時(shí)執(zhí)行多個(gè)并行任務(wù),任務(wù)之間可以相互跳轉(zhuǎn)。但是嵌入式操作系統(tǒng)在提供強(qiáng)大功能的同時(shí),也帶來了代碼量大、結(jié)構(gòu)復(fù)雜、對(duì)硬件要求較高、開發(fā)難度大且成本高等問題。而很多時(shí)候只需要實(shí)現(xiàn)簡單的多任務(wù)操作就可以滿足實(shí)際需要,本文設(shè)計(jì)的這種簡單的多任務(wù)機(jī)制,在只增加極少量C語言代碼的前提下,不需使用匯編,無需對(duì)原本的程序進(jìn)行大改動(dòng),就可以實(shí)現(xiàn)多任務(wù)操作。

     實(shí)時(shí)操作系統(tǒng)RTOS的核心是中斷,利用中斷進(jìn)行任務(wù)切換。在大部分RTOS如μC/OS-II中,每個(gè)任務(wù)都有自己的堆棧,用來保存任務(wù)的一些信息,任務(wù)之間通過信號(hào)量、郵箱、消息隊(duì)列等傳遞信息。在很多情況下并不需要這些功能,只需要使單片機(jī)在接收到控制信號(hào)后,切換到不同的工作狀態(tài),也就是只要進(jìn)行任務(wù)切換,不需要保存任務(wù)的相關(guān)信息。舍棄這些復(fù)雜的功能可以使程序結(jié)構(gòu)變得簡潔易用。

兩種機(jī)制在應(yīng)用實(shí)例中的比較
    下面用一個(gè)應(yīng)用實(shí)例來說明本設(shè)計(jì)的思路。要設(shè)計(jì)一個(gè)智能安防系統(tǒng),它的功能包括:當(dāng)有人入侵時(shí)執(zhí)行報(bào)警工作;用戶可以通過鍵盤板進(jìn)行功能設(shè)置;主板能與管理中心進(jìn)行通訊,當(dāng)發(fā)生火災(zāi)、地震等災(zāi)情時(shí),管理中心能通知用戶。其結(jié)構(gòu)如圖1所示。平時(shí)狀態(tài)下,主板的CPU不斷地掃描各個(gè)傳感器的狀態(tài)。當(dāng)檢測(cè)到傳感器的異常信號(hào)(有人闖入)時(shí),CPU進(jìn)入入侵報(bào)警狀態(tài),執(zhí)行響警鈴、撥打戶主電話、通知管理中心等工作。當(dāng)發(fā)生火災(zāi)地震時(shí),管理中心發(fā)送一個(gè)串口代碼給主板CPU,使CPU進(jìn)入災(zāi)難報(bào)警狀態(tài),執(zhí)行響警鈴、語音報(bào)警等操作。用戶需要進(jìn)行功能設(shè)置時(shí)可以通過鍵盤板使主板CPU進(jìn)入功能設(shè)置狀態(tài)。因此主板的CPU有4種不同的工作狀態(tài)。


 
圖1  智能安防系統(tǒng)結(jié)構(gòu)示意圖

    如果采用單任務(wù)機(jī)制, 主板的程序流程如圖2所示。在主函數(shù)中循環(huán)檢測(cè)傳感器狀態(tài),如有異常則調(diào)用報(bào)警函數(shù),災(zāi)難報(bào)警和功能設(shè)置在串口中斷中完成。這種單任務(wù)結(jié)構(gòu)有兩個(gè)缺點(diǎn)。首先,在各種非平時(shí)狀態(tài)中,程序需要不停地檢測(cè)是否收到撤除信號(hào),這個(gè)要求在程序代碼量大、執(zhí)行工作較多的情況下很難實(shí)現(xiàn)。其次,各狀態(tài)之間的切換十分困難,用C語言寫的程序?yàn)榍竽K化,一般函數(shù)數(shù)量較多,函數(shù)調(diào)用的嵌套層數(shù)也多,要從一個(gè)較深的嵌套立刻跳出到主函數(shù),是非常困難的。一般的解決方法或是使用C51的庫函數(shù)setjmp()和longjmp()實(shí)現(xiàn)長跳轉(zhuǎn),但是這兩個(gè)函數(shù)在中斷函數(shù)內(nèi)部是無能為力的;再或是在C函數(shù)中嵌入?yún)R編指令。雖然用匯編指令可以實(shí)現(xiàn)程序的長距離跳轉(zhuǎn),但是這種方法的調(diào)試過程十分煩瑣,而且程序的可移植性差。對(duì)于習(xí)慣用C51編程而不想用匯編的設(shè)計(jì)者,該部分程序是一個(gè)難題。


 圖2  單任務(wù)機(jī)制程序流程

實(shí)現(xiàn)多任務(wù)機(jī)制的程序結(jié)構(gòu)
    本文提供了一種方法,可以在完全不使用匯編指令的前提下實(shí)現(xiàn)可移植性強(qiáng)的多任務(wù)程序,程序流程如圖3所示。
 

圖3  多任務(wù)結(jié)構(gòu)程序流程

    實(shí)現(xiàn)這個(gè)多任務(wù)機(jī)制的完整源代碼如下:
word idata PC_Value, SP_Value;     file://儲(chǔ)存中斷返回點(diǎn)、SP初值的全局變量
byte idata Ctrl_Code;               file://控制任務(wù)切換的全局變量,在中斷函數(shù)里被賦值
void main()               
{
 Initial();          file://初始化函數(shù),與程序結(jié)構(gòu)無關(guān)
 SP_Value=SP;        file://獲?。樱械某跏贾?BR>    PC_Value=Get_Next_PC();             file://獲取下一條指令的地址
 EA=1;          file://獲取PC、SP初值后再開中斷保證穩(wěn)定性
 if(Ctrl_Code!=0)
    SP=SP_Value;         file://重置堆棧指針,防止堆棧溢出
    switch( Ctrl_Code)        file://任務(wù)入口地址,即中斷的返回點(diǎn) 
 {
  case 1:   goto  TASK1;
  case 2:   goto  TASK2;
  case 3:   goto  TASK3;
  default:  break;
 }
TASK1:  for( ; ; )
        {          file://任務(wù)1代碼        }
TASK2:  for( ; ; )
        {          file://任務(wù)2代碼        }
TASK3:  for( ; ; )
        {          file://任務(wù)2代碼        }
}
word Get_Next_PC(void)     file://獲取下一條指令的地址
{
  word address;
  address=*((unsigned char *)SP);    file://PC的高字節(jié)
  address <<= 8;
  address+=*((unsigned char *)(SP-1));  file://PC的低字節(jié)
  return address+4;       file://查看反匯編代碼,計(jì)算所得
}
void Chuan_Kou_Interrupt(void) interrupt 4 using 0
{
    byte a1,a2;
 a1=a1*a2;
 *((unsigned char *)(SP-5))=PC_Value>>8;
 *((unsigned char *)(SP-6))=PC_Value & 0x00ff;
 {
     file://接收串口代碼并根據(jù)代碼修改Ctrl_Code的值
  file://其他操作
 }
 }

任務(wù)調(diào)度原理與實(shí)現(xiàn)
    程序的整體思路是在主函數(shù)main中依次放置幾個(gè)死循環(huán)作為任務(wù)框架,即每個(gè)任務(wù)都是一個(gè)死循環(huán),利用中斷進(jìn)行任務(wù)切換。以剛才所說的安防系統(tǒng)為例,由于主板、鍵盤、管理中心之間是通過串口通訊的,因此串口是用來觸發(fā)任務(wù)切換的理想中斷源。程序?yàn)樗腥蝿?wù)設(shè)置一個(gè)總?cè)肟诓⒎旁谥骱瘮?shù)中,串口中斷每次返回時(shí)必須先經(jīng)過這個(gè)總?cè)肟?,在總?cè)肟谔帣z查任務(wù)控制變量(全局變量)的值,任務(wù)控制變量已在串口中斷中被賦值,其值決定要切換到哪個(gè)任務(wù)。

  設(shè)計(jì)中可以把平時(shí)狀態(tài)、入侵報(bào)警狀態(tài)、危機(jī)報(bào)警狀態(tài)、功能設(shè)置狀態(tài)分別作為任務(wù)1、任務(wù)2、任務(wù)3、任務(wù)4。主板CPU平常工作在平時(shí)狀態(tài),即任務(wù)1;當(dāng)串口收到管理中心的危機(jī)代碼,在串口中斷函數(shù)中令Ctrl_Code = 3,中斷返回后會(huì)切換到任務(wù)3;同樣,接收到鍵盤的功能設(shè)置代碼后,會(huì)切換到任務(wù)4;由于入侵檢測(cè)是由主板CPU自己負(fù)責(zé),因此如果檢測(cè)到有人入侵需要切換到入侵報(bào)警狀態(tài)時(shí),可以借由鍵盤中轉(zhuǎn)產(chǎn)生串口中斷,即向鍵盤發(fā)送一串口數(shù)據(jù)并要求鍵盤回送。這樣就實(shí)現(xiàn)了各個(gè)狀態(tài)的切換。

  實(shí)現(xiàn)任務(wù)調(diào)度需要解決3個(gè)關(guān)鍵問題:

  ① 獲取任務(wù)入口點(diǎn)的程序地址。由于使用C語言不能直接獲取和修改程序計(jì)數(shù)器PC的值,而在調(diào)用函數(shù)時(shí)會(huì)將PC值入棧,利用這個(gè)特點(diǎn)在任務(wù)入口處之前調(diào)用Get_Next_PC函數(shù)即可從堆棧中獲得入口地址。Get_Next_PC中,SP為堆棧指針,得到的PC值要加4才是任務(wù)入口地址,因?yàn)椴榭捶磪R編窗口可知,將函數(shù)返回值傳給全局變量PC_Value需要兩條2字節(jié)長的mov指令。

    ② 修改中斷返回地址。修改中斷返回地址的操作與獲取PC值類似,都是通過修改堆棧中的內(nèi)容實(shí)現(xiàn)。但是由于編譯器自身的特點(diǎn),在進(jìn)入中斷時(shí),編譯器除了把返回地址入棧外,還會(huì)計(jì)算自身及它所調(diào)用的函數(shù)對(duì)寄存器ACC、 B、 DPH、 DPL、 PSW、 R0 ~ R7的改變,并將它認(rèn)為被改變了的寄存器也入棧保護(hù)。如果堆棧結(jié)構(gòu)會(huì)隨中斷函數(shù)內(nèi)容改變而變化,就沒辦法計(jì)算中斷返回地址堆棧中的位置。解決方法是,在中斷函數(shù)定義時(shí)加上關(guān)鍵字using 0 告訴編譯器中斷函數(shù)及其調(diào)用的函數(shù)將使用寄存器組0,這樣工作寄存器R0~R7將不會(huì)被保存。ACC、PSW、DPH、DPL在對(duì)PC_Value操作時(shí)已經(jīng)用到,在中斷函數(shù)開頭定義兩個(gè)變量a1、b1并令它們相乘,使B寄存器也被入棧,這樣堆棧的結(jié)構(gòu)就是固定的了。

  ?、鄯乐苟褩R绯?。由于在調(diào)用函數(shù)時(shí)編譯器會(huì)將當(dāng)前地址入棧,返回時(shí)再出棧,當(dāng)任務(wù)切換即中斷多次發(fā)生在函數(shù)調(diào)用過程中時(shí),堆棧會(huì)因?yàn)橹蝗氩怀龆罱K導(dǎo)致溢出。這是不能容許的。因此,應(yīng)在主函數(shù)開頭初始化后立刻將SP值保存,再在每次任務(wù)切換后都將SP恢復(fù)為初值,這可以有效防止堆棧溢出。

結(jié)語
  根據(jù)以上的比較與分析可以看出這種實(shí)現(xiàn)多任務(wù)機(jī)制的方法具有如下優(yōu)點(diǎn):與采用單任務(wù)機(jī)制的程序相比,其結(jié)構(gòu)簡單清晰,易于控制;利用中斷和堆棧實(shí)現(xiàn)任務(wù)切換時(shí)的長跳轉(zhuǎn),完全不需使用匯編語言,可移植性強(qiáng);增加的代碼量極小,實(shí)時(shí)性好,節(jié)省程序開發(fā)時(shí)間。

    以上介紹的方法已經(jīng)通過測(cè)試并應(yīng)用于幾個(gè)實(shí)際項(xiàng)目中,包括智能小區(qū)安防系統(tǒng)、汽車CAN總線控制系統(tǒng)等,取得了良好效果。只要根據(jù)具體的硬件與編譯環(huán)境稍作修改,亦可應(yīng)用于其他的單片機(jī)系統(tǒng)中。

參考文獻(xiàn)
1. 張培仁. 基于C語言編程MCS-51單片機(jī)原理與應(yīng)用. 北京:清華大學(xué)出版社, 2003.1.
2. 胡大可等. 基于單片機(jī)8051的嵌入式開發(fā)指南. 北京:電子工業(yè)出版社, 2003.1

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉