IC卡电表C语言程序结构

发布者:平静的33号最新更新时间:2010-09-01 来源: 单片机与嵌入式系统关键字: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    { time_val[cnt]--;
    }
  }

  任务的执行。

  void main(void){
    uInt8 cnt;
    init(); //程序初始化
    interrupt_on(); //打开中断
    do{
      for(cnt=0;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      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的结果),却使开发得到了简化。这只要将系统细分为一系列任务,然后加入到任务栈进行编译即可,很适合小容量单片机系统的开发,而笔者也在多个系统中成功地应用了此种结构。

关键字:C语言  IC卡电表  任务调度 引用地址:IC卡电表C语言程序结构

上一篇:高集成与低功耗:引领RF4CE全业务平台的设计要素
下一篇:Silicon Labs推出USB接口IC 简化触摸屏开发

推荐阅读最新更新时间:2024-05-02 21:08

51单片机C语言编程中对单片机绝对地址访问的两种方法
在进行8051单片机应用系统程序设计时,编程都往往少不了要直接操作系统的各个存储器地址空间。C51程序经过编译之后产生的目标代码具有浮动地址,其绝对地址必须经过BL51连接定位后才能确定。为了能够在C51程序中直接对任意指定的存储器地址进行操作,可以采用扩展关键字 at 、指针、预定义以及连接定位控制命令。 在这些方法中,本人认为最简单而有效的方法是用 _at_ 关键字来对指定变量存储器空间绝对地址来指定。一般格式如下: 数据类型 标识符 _at_ 地址常数 其中:
[单片机]
51单片机,C语言编程,控制指示灯闪烁的频率
c51单片机,c语言编程,关于指示灯定时闪烁的。 P1.0 P1.1 P1.2 P1.3上面各接有一个指示灯,P2.0接一个外接按键。 要求: 按一下按键P1.0以1Hz的频率闪烁 半周期为500ms 第二次按下按键P1.1以2Hz的频率闪烁 半周期为250ms 第三次按下按键P1.2以3Hz的频率闪烁 半周期为165ms 第四次按下按键P1.3以4Hz的频率闪烁 半周期为125ms 第五次按下按键P1.0以1Hz的频率闪烁 半周期为500ms 如此循环。 单片机外接6MHz晶振,如何写这个程序? 悬赏分:30 本程序有实用价值,在不同的工作状态,以不同的速度闪烁,可表现出不同的紧急程度。 系统的晶振是6MHz,则机器周
[单片机]
51单片机,<font color='red'>C语言</font>编程,控制指示灯闪烁的频率
基于C语言设置TMS320 DSP中断向量表
摘要: 随着DSP芯片应用的不断深入,用C语言开发DSP芯片,不仅可以使DSP芯片的开发速度大大提高,也使得程序的修改和移植变得十分方便。C语言设置TMS320系列DSP中断向量表是高级语言开发DSP的一个具体应用。 1、引言 DSP(数字信号处理器)自二十世纪70年代末80年代初诞生以来,得到了突飞猛进的发展,在信号处理、通讯、雷达等方面应用越来越广泛,而且开发手段和开发设备也越来越多样化。其中C语言在DSP开发应用中起着越来越重要的作用,以C语言编写的DSP应用程序具有可读性、可移植性,易于维护和修改。另外在DSP应用系统中,中断是完成数据传递、实时处理等的重要手段,因而用C语言完成对DSP中断设置是DSP开发的重要
[嵌入式]
九种简单的数字滤波算法(C语言源程序)
假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad(); 1、限副滤波 /* A值可根据实际情况调整 value为有效值,new_value为当前采样值 滤波程序返回有效的实际值 */ #define A 10 char value; char fiLTEr() { char new_value; new_value = get_ad(); if ( ( new_value - value A ) || ( value - new_value A ) return value; return new_value; } 2、中位值滤波法 /* N值可根据实际情
[单片机]
本科刚毕业有点迷茫,想入门单片机,应该怎么开始?
刚毕业的大学生,或者即将毕业的,心中都会有一些不自信,焦躁,迷茫,不自信。 读了将近20年的书,即将步入社会,有点不知所措。 自己可以找到对口专业的工作吗?自己的专业有前景吗?自己学的知识够用吗?该如何选择自己的就业方向? 每个人都是从这样的经历过来的,我大学刚毕业那会,也是不知所措,学校的实习单位很多,但自己也是不知道如何抉择。 我毕业的时候,学校里可以选择实习的单位很多,但大多数都是做流水线工作的,好的单位,竞争又非常大。 我们几个参加电赛的兄弟商量了一下,干脆自己去找工作。 我们一伙3个人,一起背个包,开始了自己跨入社会的第一步—-找工作。 我们本来是想去深圳,但听学长说深圳太乱了,苏州,杭州,上海好。我们几个最终选择的
[单片机]
PIC CCS C语言程序范例
The CCS C compiler includes a library of example programs for many common applications. Each example program contains a header with instructions on how to run the example, and if necessary, the wiring instructions for interfacing external devices. Here are three such example programs included with our compiler, as we
[单片机]
PIC单片机C语言延时程序和循环子程序
很多朋友说C中不能精确控制延时时间,不能象汇编那样直观。 其实不然,对延时函数深入了解一下就能设计出一个理想的框价出来。 一般的我们都用 for(x=100;--x;){;}此句等同与x=100;while(--x){;}; 或for(x=0;x 100;x++){;} 来写一个延时函数。 在这里要特别注意:X=100,并不表示只运行100个指令时间就跳出循环。 可以看看编译后的汇编: x=100;while(--x){;} 汇编后: movlw 100 bcf 3,5 bcf 3,6 movwf_delay l2 decfsz _delay goto l2 return 从代码可以看出总的
[单片机]
小容量单片机系统的C语言程序结构
引 言:   2002年初,笔者着手写一个IC卡预付费电表的工作程序,该电表使用Philips公司的8位51扩展型单片机87LPC764,要求实现很多功能,包括熄显示、负荷计算与控制、指示闪烁以及电表各种参数的查询等,总之,要使用时间的单元很多。笔者当时使用ASM51完成了这个程序的编写,完成后的程序量是2KB多一点。后来,由于种种原因,这个程序并没有真正使用,只是作了一些改动之后用在一个老化设备上进行计时与负荷计算。约一年后,笔者又重新改写了这些代码。 1 系统的改进   可以说,这个用ASM51实现的代码是没有什么组织性可言的,要什么功能就加入什么功能,弄得程序的结构非常松散,其实这也是导致笔者最终决定重新改写这些代
[单片机]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved