C51编程多任务程序设计的结构.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C51编程多任务程序设计的结构

C51编程:多任务程序设计的结构,纯属个人观点,希望大家借签一下,提出更好的意见。 [小师⊕] [156次] 01-7-31 下午 08:48:27 C51的一些特征技巧可供利用: ??1.时间的模糊性. ????在大多数情况下,时间是具有模糊性的.象秒,分钟,小时..,从长的时间角度,即使你计秒的时 间被退后0.5秒, 在大多数情况下都是允许的,包括一些显示.还有象扫描键盘,你可在20MS去抖,也可在30,30MS时 间去抖,这个时间范围是有一定弹性的.又如闪烁要求400MS,你可在410MS去刷新,下次在 2*400MS,只要保证长的周期定时是准确的,个别时间是可推迟的。这样的情形会在许多地方发 生,这就给设计多任务程序提供了一个基础. ??2.消息的周期循环性. ????消息指系统函数(定时类的),模块之间有状态变化,模块内部有状态请求而相应产生的标志数 据或变量数据,它的特点是它的遍历整个模块,直到有模块接收它后让它消失,没有模块接收时,循 环一周被自身消失. ???举个例,有T0计数器0.1MS产生一个中断,让其他所有模块都知道,模块不能消灭它,它只能被自 己消灭: ????void?timer0(void)?interrupt?1?/*T0中断*/ ????{ ???????fSYS_100us=1; ????} bit?fSYS_TimeNow; #define?Timer0_MainLoop()?{fSYS_TimeNow=0;if(fSYS_100us) {fSYS_TimeNow=1;fSYS_100us=0;}} unsigned?char?uCount; main() { ?init(); ?uCount=100; ?while(1){ ???Time0_MainLoop(); ???Task0(); ???if(fSYS_TimeNow)Task1(); ???Task2(); ???if(fSYS_TimeNow){ ??????uCount--; ??????if(uCount==0){ ????????uCount=100; ????????Task3(); ??????} ???} ?} } 这样消息具有自我生成消失发布的能力,而且使模块具有独立性(Time0_MainLoop();可放在 WHILE中的任何地方而不影响它的作用). ??而象键盘之类产生的消息,常常是每个模块接收到它后,就使它消失,避免其他模块也接收. 消息在多任务程序中的作用:相当与桥梁,使模块间既相互独立又相互连接。比如说,有个按键 产生的消息,打开设置画面显示:nSetScreenOn,让其它的模块中相应程序运行,这是连接。如 果你的程序没写到设置画面显示部分,完全不影响整个程序,照常运行正确,这是独立性。 消息通常用队列存储,一如按键缓冲队列,一般包括函数:NewsPush(unsigned?char?nData)压 入消息,unsigned?char?NewsPop()弹出消息,NewsRead()宏定义的读队列中最前端的消息, fNewsEnable表示有消息需要各个模块接收,gNewsNum消息个数。一个模块接收后执行NewsPop ();fNewsEnable=0消灭消息。 现在举个例,P1.0键盘扫描模块作为多任务模块,并产生消息nKeyPush按键按下,nKeyPop松 开。nKeyPush时P1.1=1,nKeyPop时P1.1=0. /**********************************/ void?timer0(void)?interrupt?1?/*T0中断*/{ ??fSYS_1ms=1; } bit?fSYS_TimeNow;????/*1MS时间到消息*/ #define?Timer0_MainLoop()?{fSYS_TimeNow=0;if(fSYS_1ms) {fSYS_TimeNow=1;fSYS_1ms=0;}} main(){ ??init(); ??while(1){ ????Timer0_MainLoop();????/*系统时间循环*/ ?????/*----------------------------------*/ ?????if(fSYS_TimeNow)???/*如果有1MS到的消息产生*/ ???????Key_MainLoop();????/*按键检查循环*/ ?????} ?????/*----------------------------------*/ ???????Work_MainLoop();????/*按键的任务循环*/ ?????/*----------------------------------*/ ?????/

您可能关注的文档

文档评论(0)

shenlan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档