改进一个可实现多任务操作电表的代码程序.doc

上传人:白大夫 文档编号:3442416 上传时间:2019-08-26 格式:DOC 页数:2 大小:15KB
返回 下载 相关 举报
改进一个可实现多任务操作电表的代码程序.doc_第1页
第1页 / 共2页
亲,该文档总共2页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《改进一个可实现多任务操作电表的代码程序.doc》由会员分享,可在线阅读,更多相关《改进一个可实现多任务操作电表的代码程序.doc(2页珍藏版)》请在三一文库上搜索。

1、改进一个可实现多任务操作电表的代码程序2002年初,笔者着手写一个IC卡预付费电表的工作程序,该电表使用Philips公司的8位51扩展型单片机87LPC764,要求实现很多功能,包括熄显示、负荷计算与控制、指示闪烁以及电表各种参数的查询等,总之,要使用时间的单元很多。笔者当时使用ASM51完成了这个程序的编写,完成后的程序量是2KB多一点。后来,由于种种原因,这个程序并没有真正使用,只是作了一些改动之后用在一个老化设备上进行计时与负荷计算。约一年后,笔者又重新改写了这些代码。1系统的改进可以说,这个用ASM51实现的代码是没有什么组织性可言的,要什么功能就加入什么功能,弄得程序的结构非常松散

2、,其实这也是导致笔者最终决定重新改写这些代码的原因。大家知道,87LPC764有4KB的FlashROM,而笔者的程序量只有2KB多点,因而第一个想法是改用C语言作为主要的开发语言,应该不至于导致代码空间不够用。其次,考虑到需要定时功能的模块(或称任务,以下统称任务)较多,有必要对这些任务进行有序的管理。笔者考虑使用时间片轮询方式,即给每个要求时间管理的任务以一个时间间隔,时间间隔一到,即运行其代码,达到合理使用系统定时器资源的目的。就51系统而言,一般至少一个定时器可用来进行时间片的轮询。基于以上的想法,构造了下述数据类型。typedef unsigned char uInt8typedef

3、 struct void (*proc)( void ); /* 处理程序 */uInt8 ms_count; /* 时间片大小 */ _op_;数据结构定义好之后,接着就是实现代码,包括三部分,即初始化数据、时间片的刷新与时间到执行。初始化数据。#defineproc_cnt0x08/定义过程或任务数量/任务栈初始化code _op_ Opproc_cnt = ic_check 10 disp_loop 100 calc_power 150 set_led 2 ;/设置时间片初始值datauInt8time_valproc_cnt=10,100,150,2,;时间片刷新。void time_

4、int1( void ) interrupt 3uInt8 cnt;Time_Counter: = Time_Unit;for ( cnt = 0; cnt RAM限制,不能像一些实时OS那样将任务栈建立在RAM中。笔者将任务栈建立在代码空间,因而不能在程序运行时动态地加入任务,因此要求在程序编译时,任务栈已经确定。同时,定义一组计数值旗标time_val,记录程序运行时的时间量,并在一个定时器中断中对其进行刷新。改变时间片刷新中断过程语句Time_Counter:=Time_Unit;中的Time_Unit,可以改变系统时间片的刷新粒度,一般这个值由系统的最小时间度量值确定。同时,由任务的执行流程可知,此种系统构造并没有改变其前/后台系统的性质,只是对后台逻辑操作序列进行了有效管理。同时,如果将任务执行流程进行一些更改,并保证时间片小的任务前置,如下述程序。dofor ( cnt = 0; cnt CPU时间,使得任务的等待时间大减,让CPU有足够的时间进行任务管理与调度。同时也让程序的结构性与可读性大为加强。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1