引 言: 2002年头,笔者着手写一个IC卡预付费电表的作业程序,该电表运用Philips公司的8位51扩展型单片机87LPC764,要求完成许多功用,包含熄显现、负荷核算与操控、指示闪耀以及电表各种参数的查询等,总归,要运用时刻的单元许多。笔者其时运用ASM51完成了这个程序的编写,完成后的程序量是2KB多一点。后来,由于种种原因,这个程序并没有真实运用,仅仅作了一些改动之后用在一个老化设备上进行计时与负荷核算。约一年后,笔者又从头改写了这些代码。 1 体系的改善 可以说,这个用ASM51完成的代码是没有什么组织性可言的,要什么功用就参加什么功用,弄得程序的结构十分松懈,其实这也是导致笔者终究决议从头改写这些代码的原因。 我们知道,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