新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > IC卡電表C語(yǔ)言程序結(jié)構(gòu)

        IC卡電表C語(yǔ)言程序結(jié)構(gòu)

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

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

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

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

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

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

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

          #define proc_cnt 0x08 //定義過(guò)程或任務(wù)數(shù)量
          //任務(wù)棧初始化
          code _op_ Op[proc_cnt]={{ic_check,10},{disp_loop,100},{calc_power,150},{set_led,2},…};
          //設(shè)置時(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ù)的執(zhí)行。

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

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

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

          同時(shí),由任務(wù)的執(zhí)行流程可知,此種系統(tǒng)構(gòu)造并沒(méi)有改變其前/后臺(tái)系統(tǒng)的性質(zhì),只是對(duì)后臺(tái)邏輯操作序列進(jìn)行了有效管理。同時(shí),如果將任務(wù)執(zhí)行流程進(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; //執(zhí)行完成后,重新進(jìn)行優(yōu)先調(diào)度
              }
            }
          }while(1);


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

        評(píng)論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 巴里| 福州市| 株洲县| 诸城市| 垣曲县| 麻城市| 乐都县| 浦北县| 财经| 舞钢市| 海兴县| 旬邑县| 乾安县| 嵊州市| 石阡县| 临沧市| 哈密市| 富平县| 广宁县| 平果县| 临邑县| 浠水县| 大安市| 江都市| 黄骅市| 阳山县| 邳州市| 弥渡县| 桃江县| 巴彦县| 墨玉县| 南城县| 上虞市| 蓬安县| 兰考县| 固原市| 禹城市| 策勒县| 托里县| 玉环县| 平度市|