當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]2002年初,筆者著手寫一個IC卡預(yù)付費電表的工作程序,該電表使用Philips公司的8位51擴(kuò)展型單片機(jī)87LPC764,要求實現(xiàn)很多功能,包括熄顯示、負(fù)荷計算與控制、指示閃爍以及電表各種參數(shù)的查詢等,總之,要使用時間的單

2002年初,筆者著手寫一個IC卡預(yù)付費電表的工作程序,該電表使用Philips公司的8位51擴(kuò)展型單片機(jī)87LPC764,要求實現(xiàn)很多功能,包括熄顯示、負(fù)荷計算與控制、指示閃爍以及電表各種參數(shù)的查詢等,總之,要使用時間的單元很多。筆者當(dāng)時使用ASM51完成了這個程序的編寫,完成后的程序量是2KB多一點。后來,由于種種原因,這個程序并沒有真正使用,只是作了一些改動之后用在一個老化設(shè)備上進(jìn)行計時與負(fù)荷計算。約一年后,筆者又重新改寫了這些代碼。

1  系統(tǒng)的改進(jìn)

  可以說,這個用ASM51實現(xiàn)的代碼是沒有什么組織性可言的,要什么功能就加入什么功能,弄得程序的結(jié)構(gòu)非常松散,其實這也是導(dǎo)致筆者最終決定重新改寫這些代碼的原因。

  大家知道,87LPC764有4KB的Flash ROM,而筆者的程序量只有2KB多點,因而第一個想法是改用C語言作為主要的開發(fā)語言,應(yīng)該不至于導(dǎo)致代碼空間不夠用。其次,考慮到需要定時功能的模塊(或稱任務(wù),以下統(tǒng)稱任務(wù))較多,有必要對這些任務(wù)進(jìn)行有序的管理。筆者考慮使用時間片輪詢方式,即給每個要求時間管理的任務(wù)以一個時間間隔,時間間隔一到,即運行其代碼,達(dá)到合理使用系統(tǒng)定時器資源的目的。就51系統(tǒng)而言,一般至少一個定時器可用來進(jìn)行時間片的輪詢。基于以上的想法,構(gòu)造了下述數(shù)據(jù)類型。

  typedef unsigned char uInt8
  typedef struct {
  void (*proc)(void); //處理程序
  uInt8 ms_count; //時間片大小
  } _op_;

  數(shù)據(jù)結(jié)構(gòu)定義好之后,接著就是實現(xiàn)代碼,包括三部分,即初始化數(shù)據(jù)、時間片的刷新與時間到執(zhí)行。

  初始化數(shù)據(jù)。

  #define proc_cnt 0x08 //定義過程或任務(wù)數(shù)量
  //任務(wù)棧初始化
  code _op_ Op[proc_cnt]={{ic_check,10},{disp_loop,100},{calc_power,150},{set_led,2},…};
  //設(shè)置時間片初始值
  data uInt8 time_val[proc_cnt]={10,100,150,2,…};時間片刷新。
  void time_int1(void) interrupt 3
  {   uInt8 cnt;
    Time_Counter:=Time_Unit;
    for(cnt=0;cnt<proc_cnt;cnt++)
    { time_val[cnt]--;
    }
  }

  任務(wù)的執(zhí)行。

  void main(void){
    uInt8 cnt;
    init(); //程序初始化
    interrupt_on(); //打開中斷
    do{
      for(cnt=0;cnt<proc_cnt;cnt++)
        { if(!time_val[cnt])
          { time_val[cnt]=Op[cnt].ms_count;
            Op[cnt].proc();
        }
      }
    }while(1);
  }

  在上面的結(jié)構(gòu)定義中,proc是不能帶參數(shù)的,各任務(wù)之間的通信可以定義一個參數(shù)內(nèi)存塊,通過一種機(jī)制進(jìn)行數(shù)據(jù)信息交互,如定義一個全局變量。對于小容量單片機(jī)系統(tǒng)而言,需要這樣做的任務(wù)并不多,總?cè)蝿?wù)量也不會太多,因而這種協(xié)調(diào)并不太難處理。

  也許大家都有這樣的認(rèn)識,即一個實時系統(tǒng)中,差不多所有的具體任務(wù)都是有時間屬性的,即使是不需要定時的過程或任務(wù),也不見得要時時進(jìn)行查詢與刷新。如IC卡介質(zhì)檢測,保證每秒一次就足夠了。因而,這些任務(wù)也可以列入到這個結(jié)構(gòu)中來。

  在以上的程序代碼中,考慮到單片機(jī)系統(tǒng)的RAM限制,不能像一些實時OS那樣將任務(wù)棧建立在RAM中。筆者將任務(wù)棧建立在代碼空間,因而不能在程序運行時動態(tài)地加入任務(wù),因此要求在程序編譯時,任務(wù)棧已經(jīng)確定。同時,定義一組計數(shù)值旗標(biāo)time_val,記錄程序運行時的時間量,并在一個定時器中斷中對其進(jìn)行刷新。改變時間片刷新中斷過程語句Time_Counter:=Time_Unit;中的Time_Unit,可以改變系統(tǒng)時間片的刷新粒度,一般這個值由系統(tǒng)的最小時間度量值確定。

  同時,由任務(wù)的執(zhí)行流程可知,此種系統(tǒng)構(gòu)造并沒有改變其前/后臺系統(tǒng)的性質(zhì),只是對后臺邏輯操作序列進(jìn)行了有效管理。同時,如果將任務(wù)執(zhí)行流程進(jìn)行一些更改,并保證時間片小的任務(wù)前置,如下述程序。

  do{
    for(cnt=0;cnt<proc_cnt;cnt++){
      if(!time_val[cnt]){
        time_val[cnt]=Op[cnt].ms_count;
        Op[cnt].proc();
        break; //執(zhí)行完成后,重新進(jìn)行優(yōu)先調(diào)度
      }
    }
  }while(1);

  則系統(tǒng)變?yōu)橐粋€以執(zhí)行頻率為優(yōu)先級的任務(wù)調(diào)度系統(tǒng)。當(dāng)然,設(shè)置此種方式得非常小心,并要注意時間片的分配,如果時間片過小,則可能導(dǎo)致執(zhí)行頻率較低的任務(wù)難以被執(zhí)行;而如果存在兩個同樣的時間片,則更加危險,可能導(dǎo)致第二個具有相同時間片的任務(wù)不被執(zhí)行,因而,時間片的分配要合理,并保證其唯一性。

2  性能分析與任務(wù)拆分

  以上兩種任務(wù)管理方式,前一種按任務(wù)棧的順序與時間片的大小依次進(jìn)行調(diào)度,暫且稱其為流水作業(yè)調(diào)度;而后一種,且稱其為頻率優(yōu)先調(diào)度。兩種方式各有優(yōu)缺點。流水作業(yè)調(diào)度的各任務(wù)具有等同優(yōu)先級,時間片一到即會被按序調(diào)用,時間片大小的次序與唯一性不作要求;缺點是可能導(dǎo)致時間片小的,即要求執(zhí)行得較快的任務(wù)等待過長的時間。頻率優(yōu)先調(diào)度的各任務(wù)按其時間片的大小,即執(zhí)行頻率劃分優(yōu)先級,時間片小的任務(wù),其執(zhí)行頻率高,總是具有較高的優(yōu)先權(quán),但時間片的分配得協(xié)調(diào),否則可能會導(dǎo)致執(zhí)行頻率低的任務(wù)長時間等待。
 要特別注意的是,兩種方式都有可能導(dǎo)致一些任務(wù)長時間等待,時間片所設(shè)定的時間也因此不能作為精確時間的依據(jù),根據(jù)系統(tǒng)的要求或需要,甚至要在任務(wù)執(zhí)行過程中進(jìn)行某些保護(hù)工作,如中斷屏蔽等,因而在進(jìn)行任務(wù)規(guī)劃時要注意。如果一個任務(wù)較繁瑣或可能要等待很長時間,則應(yīng)當(dāng)考慮任務(wù)的拆分,把一個較大的任務(wù)細(xì)化為較小的任務(wù),把一個費時長的任務(wù)劃分為多個費時小的任務(wù),協(xié)同完成其功能。如在等待時間長的情況下,可附加一個定時任務(wù),定時任務(wù)到則發(fā)送一個消息旗標(biāo),主過程沒有檢測到消息旗標(biāo)就馬上返回,否則繼續(xù)執(zhí)行。下面是示例代碼,假定該任務(wù)將等待很長時間,現(xiàn)將其拆分為兩個任務(wù)proc1與proc2協(xié)同完成原來的工作,proc1每100個時間單位執(zhí)行一次,而proc2每200個時間單位執(zhí)行一次。

  //定義兩個任務(wù),并將其加入到任務(wù)棧中。
  code _op_ Op[proc_cnt]={…,{proc1,100},{proc2,200}};
  data int time1_Seg; //定義一個全局旗標(biāo)
  //任務(wù)實現(xiàn)
  void proc1(void){
    if (time1_Seg)
      exit;
    else
      time1_Seg=const_Time1; //如果時間到了,則恢復(fù)初值并
                  //接著執(zhí)行下列代碼。
    …             //任務(wù)實際執(zhí)行代碼
  }

  void proc2(void){
    if(time1_Seg)
    time1_Seg--;
  }

  由上例可以看出,任務(wù)拆分后,幾乎不占過多的CPU時間,使得任務(wù)的等待時間大減,讓CPU有足夠的時間進(jìn)行任務(wù)管理與調(diào)度。同時也讓程序的結(jié)構(gòu)性與可讀性大為加強(qiáng)。

結(jié)語

  基于上述思路與結(jié)構(gòu)對IC卡電表工作程序進(jìn)行全部改寫后,系統(tǒng)的結(jié)構(gòu)性能得到了很大改善。全部編寫完成后,程序代碼量約為3KB多一點,可見此種結(jié)構(gòu)的程序構(gòu)造并不會造成很大的系統(tǒng)開銷(大部分開銷是由于使用C的結(jié)果),卻使開發(fā)得到了簡化。這只要將系統(tǒng)細(xì)分為一系列任務(wù),然后加入到任務(wù)棧進(jìn)行編譯即可,很適合小容量單片機(jī)系統(tǒng)的開發(fā),而筆者也在多個系統(tǒng)中成功地應(yīng)用了此種結(jié)構(gòu)。

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

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

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

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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