把自己的51程序的框架放出来,希望对初学者有帮助。

[复制链接]
5851|36
gtw 发表于 2007-1-23 17:43 | 显示全部楼层

何必

这一点和yewuyi的架构类似
不过是将ClrWDT放到检测到时钟标志后清狗
if (fGlobe_1ms){
    ClrWDT();
    ......
}
只是挪一下地方而已,效果相同

我用两个狗,一个硬件狗,再虚拟一个软件狗……哈哈
用软件狗检测异常,提前处理
不过应用还是有限
hmin500 发表于 2007-1-23 18:50 | 显示全部楼层

程序框架

都是高手,俺看不明白呀
gtw 发表于 2007-1-24 08:25 | 显示全部楼层
如100ms时,你的1ms,2ms,5ms,10ms,100ms里的任务都要执行,如果这些任务执行的时间和超过了2ms, 那么对1ms的任务肯定是有影响的。

肯定会的……
 楼主| yanfengzhu 发表于 2007-1-24 18:55 | 显示全部楼层

v2版终于该好了。

v2版终于该好了。仍然放在原来的地方。
http://yanfeng106.gbaopan.com/

在文件的安排上做了较大的修改,更新并调整了文件。即具体的细节上改动较大,而思想方面基本没什么变化。

因为比较喜欢在cygwin下工作,今天想写个makefile来自动编译工程没有成功。我已经想到了解决的方法,但是想到的这两个方法我都不会。看来想摆脱uv2这个ide还是有点困难啊!有没有对makefile方面比较精通的高手,能否指点一下。主要的问题在包里的ChangeLog文件里。
荒野门士 发表于 2007-1-25 10:39 | 显示全部楼层

碧水长天 ,问你一个问题?

else if (U81msCounterA == 1) ProcMotorProtect(); /*2ms周期的任务*/
中的ProcMotorProtect();程序应该是1ms周期的任务,因为你的标志位fGlobe_1ms是一秒标志位的, 这只是个人想法。。有错的说一下谢谢
下面几个也差不多的,,
else if (U81msCounterB == 1) ProcPwmAdjust();  /*5ms周期的任务*/

else if (U81msCounterB == 3) ProcSpeedCount(); 
 Proc6sCruise();/*100ms周期的任务*/
joy晴天 发表于 2007-1-25 10:52 | 显示全部楼层

先收藏了,好好学习

wnch 发表于 2007-1-25 15:31 | 显示全部楼层

收藏起来学习

碧水长天 发表于 2007-1-25 21:22 | 显示全部楼层

个人意见

荒野门士,我的注释是对的,请再仔细看看代码,思考一下。

关于提到1ms,2ms,5ms等任务是1ms任务的整数倍时,因此对1ms的任务有影响的问题,我不同意上述几位同志的观点,我个人觉得:
当所有Xms的任务都要执行的时候,此时是处理器的最大负荷,设计任务的时候,要计算此最大负荷是否超出了处理器的能力。在满足处理器能力足够的情况下,那么,这样的设计会带来这样的好处:

1 再添加数量适当的非1ms的任务,不会对其他任务有任何影响,我可以添加到5个1ms的任务,10个10ms的任务等等...;
2 各个任务均按照比较严格的时间周期运行,在需要计时的时候(比如键盘扫描、显示刷新、定时通信等),均比较方便;
happystar 发表于 2007-1-25 21:33 | 显示全部楼层

好资料啊。

水平有限,对这些不太懂,收藏起来,帮前辈们顶顶
gtw 发表于 2007-1-26 08:57 | 显示全部楼层

比较同意碧水长天的说法

但在系统负荷最重的情况下其他任务有可能被滞后……
需要即时处理的任务只能放到中断去
happystar 发表于 2007-1-27 17:18 | 显示全部楼层

仔细学习了一下,还是不懂

好贴再帮顶一下。我对这个模块花结构很感兴趣,增删都很简单啊。但是我不明白:如果你定义一个大的缓冲区(全局变量),比如缓冲里的那些变量在每个模块都要用到(串口模块往外发,定时器模块显示它们),这个缓冲在你的那些文件中具体到哪个文件定义呢?
本人刚学MCU,编程都是在一个文件里的,这样感觉结构很糟糕。多谢楼主提供给这么好的结构,谢谢拉。
问题很菜,别见笑啊。
 楼主| yanfengzhu 发表于 2007-1-28 11:25 | 显示全部楼层

答楼上。

你可以添加自己的文件,在自己的文件中定义,也可以在main.c文件中定义。
 楼主| yanfengzhu 发表于 2007-1-28 18:30 | 显示全部楼层

首先你要确认你用的是v1版还是v2版。

v1版是很久以前写的,我把它放在网上之前只是把数据类型统一了一下。我现在都觉得那时把问题复杂化了,所以才会有v2版的初学。v1的文件不是放在同一个目录的,因此你那样写是有问题的,应该改为#include "..keyboardkb_scan.h"。建议使用v2版。
还有一个可能时你没有在config.h文件里使能KEYBOARD_EN,即把按键关闭了,这样这个模块的定义及声明都被屏蔽了,因此会提示你没有错误。
#define KEYBOARD_EN    0

建议你不要在keyboard里面定义delay函数,一个好的建议时自己写一个delay.c的文件并在里面定义,或者在misc.c文件里定义。

happystar 发表于 2007-1-28 21:29 | 显示全部楼层

回楼主

我使用的V2版本的,而且和你的一样,所有的.h和.c在同一个目录下。所以用#include ""。
但是问题是为什么我存放全局变量的那个.h可以被每个模块调用,而每个模块的出口函数用extern定义后再调用不可以呢?它们都是同一目录啊。
不好意思,让楼主多费心拉
 楼主| yanfengzhu 发表于 2007-1-28 21:57 | 显示全部楼层

头文件只用来声明,不要用来定义变量。

这样我也不能确定是什么问题,如果还是不能解决,你可发邮件给我。
qianlidou 发表于 2007-1-31 16:49 | 显示全部楼层

谢谢,学到很多

谢谢,学到很多
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部