<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > IC卡電表C語(yǔ)言程序結構性能分析

IC卡電表C語(yǔ)言程序結構性能分析

作者: 時(shí)間:2012-05-30 來(lái)源:網(wǎng)絡(luò ) 收藏

1 系統的改進(jìn)

本文引用地址:http://dyxdggzs.com/article/148963.htm

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

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

  數據定義好之后,接著(zhù)就是實(shí)現代碼,包括三部分,即初始化數據、時(shí)間片的刷新與時(shí)間到執行。

  初始化數據。

  #define proc_cnt 0x08 //定義過(guò)程或任務(wù)數量
  //任務(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,…};時(shí)間片刷新。
  void time_int1(void) interrupt 3
  { uInt8 cnt;
    Time_Counter:=Time_Unit;
    for(cnt=0;cntproc_cnt;cnt++)
    { time_val[cnt]--;
    }
  }

  任務(wù)的執行。

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

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

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

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

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

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


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>