国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

IC卡電表C語言程序結構

發布時間:2010-11-24 11:32    發布者:eetech
關鍵詞: c語言 , IC卡 , 程序 , 電表 , 結構
1 系統的改進

大家知道,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;cnt<proc_cnt;cnt++)
{ time_val[cnt]--;
}
}

任務的執行。

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);
}

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

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

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

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

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

則系統變為一個以執行頻率為優先級的任務調度系統。當然,設置此種方式得非常小心,并要注意時間片的分配,如果時間片過小,則可能導致執行頻率較低的任務難以被執行;而如果存在兩個同樣的時間片,則更加危險,可能導致第二個具有相同時間片的任務不被執行,因而,時間片的分配要合理,并保證其唯一性。

2 性能分析與任務拆分

以上兩種任務管理方式,前一種按任務棧的順序與時間片的大小依次進行調度,暫且稱其為流水作業調度;而后一種,且稱其為頻率優先調度。兩種方式各有優缺點。流水作業調度的各任務具有等同優先級,時間片一到即會被按序調用,時間片大小的次序與唯一性不作要求;缺點是可能導致時間片小的,即要求執行得較快的任務等待過長的時間。頻率優先調度的各任務按其時間片的大小,即執行頻率劃分優先級,時間片小的任務,其執行頻率高,總是具有較高的優先權,但時間片的分配得協調,否則可能會導致執行頻率低的任務長時間等待。

要特別注意的是,兩種方式都有可能導致一些任務長時間等待,時間片所設定的時間也因此不能作為精確時間的依據,根據系統的要求或需要,甚至要在任務執行過程中進行某些保護工作,如中斷屏蔽等,因而在進行任務規劃時要注意。如果一個任務較繁瑣或可能要等待很長時間,則應當考慮任務的拆分,把一個較大的任務細化為較小的任務,把一個費時長的任務劃分為多個費時小的任務,協同完成其功能。如在等待時間長的情況下,可附加一個定時任務,定時任務到則發送一個消息旗標,主過程沒有檢測到消息旗標就馬上返回,否則繼續執行。下面是示例代碼,假定該任務將等待很長時間,現將其拆分為兩個任務proc1與proc2協同完成原來的工作,proc1每100個時間單位執行一次,而proc2每200個時間單位執行一次。

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

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

由上例可以看出,任務拆分后,幾乎不占過多的CPU時間,使得任務的等待時間大減,讓CPU有足夠的時間進行任務管理與調度。同時也讓程序的結構性與可讀性大為加強。

結語

基于上述思路與結構對IC卡電表工作程序進行全部改寫后,系統的結構性能得到了很大改善。全部編寫完成后,程序代碼量約為3KB多一點,可見此種結構的程序構造并不會造成很大的系統開銷(大部分開銷是由于使用C的結果),卻使開發得到了簡化。這只要將系統細分為一系列任務,然后加入到任務棧進行編譯即可,很適合小容量單片機系統的開發,而筆者也在多個系統中成功地應用了此種結構。
本文地址:http://m.qingdxww.cn/thread-41212-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲性xo| 亚欧成人乱码一区二区| 性xxxxx大片免费视频| 天天射色综合| caoporn 免费视频| 久久亚洲高清观看| 亚洲幼女网| 日本高清视频成人网www| 特级aaa片毛片免费观看| 四虎地址| SM调教贱屁股眼哭叫求饶H| 美女露出撒尿的部位| 日本黄大片免播放视播放器| 香蕉碰碰| 我想看一级播放片一级的| 污小说h| 2020精品国产视| 久久中文字幕无码A片不卡| 夜夜穞狠狠穞| 青青青国产精品手机在线观看| 色欲天天天综合网| 天堂激情| 国产99视频精品免费播放| 让人爽到湿的小黄书| 亚洲性片| 色五月情| 午色影院| yin荡体育课羞耻play双性| 欧美精品乱码99久久蜜桃 | 日本护士在线观看| 青青视频国产依人在线| 性久久久久久久| 在线观看的免费网站| 久久频这里精品99香蕉久网址| 日韩福利在线观看| 日本不卡视频在线观看| 中文字幕婷婷| 中文字幕免费视频精品一| 青娱乐极品视觉盛宴国产视频| 日韩一区二区三区在线播放| 午夜在线视频国产|