• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > IC卡電表C語言程序結構

    IC卡電表C語言程序結構

    作者: 時間:2010-08-26 來源:網絡 收藏

    1 系統的改進

    本文引用地址:http://www.czjhyjcfj.com/article/151617.htm

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

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

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

      初始化數據。

      #define proc_cnt 0x08 //定義過程或任務數量
      //任務棧初始化
      code _op_ Op[proc_cnt]={{ic_check,10},{disp_loop,100},{calc_power,150},{set_led,2},…};
      //設置時間片初始值
      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;cntproc_cnt;cnt++)
        { time_val[cnt]--;
        }
      }

      任務的執行。

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

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

      也許大家都有這樣的認識,即一個實時系統中,差不多所有的具體任務都是有時間屬性的,即使是不需要定時的過程或任務,也不見得要時時進行查詢與刷新。如卡介質檢測,保證每秒一次就足夠了。因而,這些任務也可以列入到這個中來。

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

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

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


    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 龙山县| 和平区| 五莲县| 钟山县| 光泽县| 临泉县| 措美县| 湖州市| 阳山县| 都兰县| 囊谦县| 福鼎市| 长治县| 拉萨市| 黎川县| 工布江达县| 聊城市| 个旧市| 郯城县| 张家川| 宁南县| 安平县| 民丰县| 永年县| 沙雅县| 雅安市| 南召县| 清新县| 永春县| 内黄县| 西盟| 株洲市| 永春县| 鲁甸县| 汪清县| 合水县| 运城市| 晋江市| 宁武县| 合作市| 永修县|