欢迎来到天天文库
浏览记录
ID:27689600
大小:100.23 KB
页数:7页
时间:2018-12-03
《c51编程多任务程序设计的结构》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、C51编程:多任务程序设计的结构,纯属个人观点,希望大家借签一下,提出更好的意见。[小师©][156次]01-7-31下午08:48:27C51的一些特征技巧可供利用:1.时间的模糊性.在大多数情况下,时间是具有模糊性的.象秒,分钟,小时..,从长的时间角度,即使你计秒的时间被退后0.5秒,在大多数情况下都是允许的,包括一些显示.还有象扫描键盘,你可在20MS去抖,也可在30,30MS时间去抖,这个时间范围是有一定弹性的.又如闪烁耍求400MS,你可在410MS去刷新,下次在2M00MS,只要保证长的周期定时是准确的,
2、个别时间是可推迟的。这样的情形会在许多地方发生,这就给设计多任务程序提供了一个基础.2.消息的周期循环性.消息指系统函数(定时类的),模块之间有状态变化,模块内部有状态请求而相应产生的标志数据或变量数据,它的特点是它的遍历整个模块,直到有模块接收它后让它消失,没有模块接收时,循环一周被自身消失.举个例,有T0计数器0.IMS产生一个中断,让其他所有模块都知道,模块不能消火它,它只能被自己消灭:voidtimerO(void)interrupt1/*T0中断*/{fSYS_100us=l;}bitfSYSTimeNow;
3、^defineTimerOMainLoop(){fSYS_TimeNow=0;if(fSYSlOOus){fSYS_TimeNow=l;fSYS_100us=0;}}unsignedcharuCount;main(){init();uCount=100;while⑴{TimeO_MainLoop();TaskO();if(fSYS_TimeNow)Taskl();Task20;if(fSYS_TimeNow){uCount—;if(uCount==0){uCount=100;Task3();}}}}这样消息具有自我生成
4、消失发布的能力,而且使模块具有独立性(TimeO_MainLoop();可放在WHILE+的任何地方而不影响它的作用).而象键盘之类产生的消息,常常是每个模块接收到它后,就使它消失,避免其他模块也接收.消息在多任务程序中的作用:相当与桥梁,使模块间既相互独立又相互连接。比如说,有个按键产生的消息,打幵设置画面显示:nSetScreenOn,让其它的模块中相应程序运行,这是连接。如果你的程序没写到设置画面显示部分,完全不影响整个程序,照常运行正确,这是独立性。消息通常用队列存储,一如按键缓冲队列,一般包括函数:NewsP
5、ush(unsignedcharnData)压入消息,unsignedcharNewsPopO弹出消息,NewsReadO宏定义的读队列中最前端的消息,fNewsEnable表豕有消息需耍各个模抉接收,gNewsNum消息个数。一个模块接收后执行NewsPop();fNewsEnable=O消灭消息。现在举个例,P1.0键盘扫描模块作为多任务模块,并产生消息nKeyPush按键按卜,nKeyPop松开。nKeyPush时P1.1=1,nKeyPop时P1.1=0.f///voidtimerO(void)interrup
6、t1/*T0中断*/{fSYS_lms:l;}bitfSYSTimeNow;AIMS时间到消息*/#defineTimerOMainLoopO{fSYS_TimeNow=0;if(fSYSlms){fSYS_TimeNow=l;fSYS_lms=0;}}mainO{init();while(l){TimerO_MainLoop();/*系统时间循环*/卜%!if(fSYS_TimeNow)/*如果有IMS到的消息产生*/Key_MainLoop();/*按键检查循环*/}/%VWork_MainLoop();A按键的任
7、务循环*/卜%!/*消息处理中心,可写成宏较直观*/fNewsRnable=O;if(gNcwsNum)fNewsEnable=l;/*有消息,通知*//*多任务中模块的任务号,代表模块的执/*按键检查循环模块*/unsignedcharmKeyTask;行点*/sbitfKeyIn=Pl"O;unsignedcharmKeyTime;voidKey_MainLoop(){switch(mKeyTask){case0:/*现在是常规状态*/if(fKeyIn==0){mKcyTimc=30;A大概30MS的去抖时间*/
8、mKeyTask++;}break;case1:A按下去抖29-30MSVmKeyTime—;if(mKeyTime==0)mKeyTask++;break;case2:/*判断按键是否保持按下*/if(fKeyIn==0){NewsPush(nKeyPush);A压入按键按下消息*/mKeyTask++;}elsemKcyTas
此文档下载收益归作者所有