发新帖我要提问
12
返回列表
打印

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

[复制链接]
楼主: yanfengzhu
手机看帖
扫描二维码
随时随地手机跟帖
21
gtw| | 2007-1-23 17:43 | 只看该作者 回帖奖励 |倒序浏览

何必

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

我用两个狗,一个硬件狗,再虚拟一个软件狗……哈哈
用软件狗检测异常,提前处理
不过应用还是有限

使用特权

评论回复
22
hmin500| | 2007-1-23 18:50 | 只看该作者

程序框架

都是高手,俺看不明白呀

使用特权

评论回复
23
gtw| | 2007-1-24 08:25 | 只看该作者
如100ms时,你的1ms,2ms,5ms,10ms,100ms里的任务都要执行,如果这些任务执行的时间和超过了2ms, 那么对1ms的任务肯定是有影响的。

肯定会的……

使用特权

评论回复
24
yanfengzhu|  楼主 | 2007-1-24 18:55 | 只看该作者

v2版终于该好了。

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

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

因为比较喜欢在cygwin下工作,今天想写个makefile来自动编译工程没有成功。我已经想到了解决的方法,但是想到的这两个方法我都不会。看来想摆脱uv2这个ide还是有点困难啊!有没有对makefile方面比较精通的高手,能否指点一下。主要的问题在包里的ChangeLog文件里。

使用特权

评论回复
25
荒野门士| | 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周期的任务*/

使用特权

评论回复
26
joy晴天| | 2007-1-25 10:52 | 只看该作者

先收藏了,好好学习

使用特权

评论回复
27
wnch| | 2007-1-25 15:31 | 只看该作者

收藏起来学习

使用特权

评论回复
28
碧水长天| | 2007-1-25 21:22 | 只看该作者

个人意见

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

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

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

使用特权

评论回复
29
happystar| | 2007-1-25 21:33 | 只看该作者

好资料啊。

水平有限,对这些不太懂,收藏起来,帮前辈们顶顶

使用特权

评论回复
30
gtw| | 2007-1-26 08:57 | 只看该作者

比较同意碧水长天的说法

但在系统负荷最重的情况下其他任务有可能被滞后……
需要即时处理的任务只能放到中断去

使用特权

评论回复
31
happystar| | 2007-1-27 17:18 | 只看该作者

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

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

使用特权

评论回复
32
yanfengzhu|  楼主 | 2007-1-28 11:25 | 只看该作者

答楼上。

你可以添加自己的文件,在自己的文件中定义,也可以在main.c文件中定义。

使用特权

评论回复
33
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文件里定义。

使用特权

评论回复
34
happystar| | 2007-1-28 21:29 | 只看该作者

回楼主

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

使用特权

评论回复
35
yanfengzhu|  楼主 | 2007-1-28 21:57 | 只看该作者

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

这样我也不能确定是什么问题,如果还是不能解决,你可发邮件给我。

使用特权

评论回复
36
qianlidou| | 2007-1-31 16:49 | 只看该作者

谢谢,学到很多

谢谢,学到很多

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则