打印

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

[复制链接]
4913|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanfengzhu|  楼主 | 2007-1-22 21:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
把自己的51程序的框架放出来,希望对初学者有帮助,如果高手不小心看了,也请提一下意见。

这个东东写了也有好长一段时间了,由于近来又有了一些想法,加上年底不是很忙了,因此就想对它进行修改。这两天看过之后真有点惨不忍睹的感觉,以前怎么会把简单的问题搞的那么复杂呢。

修改起来不知道怎么下手好了,主要是一些想法不好在51上实现,如果要实现就要牺牲较大的资源(要么是rom要么是执行时间),今天先把数据类型统一了一下,放上来先,过几天再把整理好的放上来。希望对初学者有些许的帮助,也请高手们给些意见和建议。感觉好长一段时间技术没有提高了,唉,郁闷!!!

这是我存放东东的地址。
http://yanfeng106.gbaopan.com

相关帖子

沙发
hotpower| | 2007-1-22 22:25 | 只看该作者

沙发~~~

使用特权

评论回复
板凳
fsaok| | 2007-1-22 23:01 | 只看该作者

.

该位置没有任何文件! 

使用特权

评论回复
地板
fsaok| | 2007-1-22 23:05 | 只看该作者

.

找到了,正在下载中,原来楼主的地址写错了

使用特权

评论回复
5
fsaok| | 2007-1-22 23:15 | 只看该作者

很好

粗略看了一下,楼主的程序框架真的别具一格,欣赏中

使用特权

评论回复
6
碧水长天| | 2007-1-22 23:27 | 只看该作者

还不错,感觉咱们有点类似,也贡献一下自己的代码风格,

读了lz的main结构,感觉有点类似,不过个人认为稍微欠缺的是,没有对任务的执行周期进行安排,这样不利于任务的增删。在平均处理器时间足够的情况下,安排好各个任务的执行周期,因增减任务而对原有任务的执行情况的影响将将被减至最小。


使用特权

评论回复
7
xwj| | 2007-1-22 23:29 | 只看该作者

LZ程序确实不错,结构很清晰

使用特权

评论回复
8
hotpower| | 2007-1-22 23:38 | 只看该作者

倒塌了~~~while(1)+CLS_WDT()是狗论打击的首要目标~~~

使用特权

评论回复
9
碧水长天| | 2007-1-22 23:48 | 只看该作者

能赐教么?

 您说“倒塌了~~~while(1)+CLS_WDT()是狗论打击的首要目标~~~”
弟子不太明白,请指点。

使用特权

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

啊,不看不知道,一看...

原来是只菜狗啊

杀了吃了!

使用特权

评论回复
11
hotpower| | 2007-1-22 23:54 | 只看该作者

倒塌了~~~到菜地里随便拉条菜狗炖着吃,xwj请客~~~

使用特权

评论回复
12
碧水长天| | 2007-1-23 00:11 | 只看该作者

感觉此狗似乎很菜,但一时还不特别明白,明天再来

呵呵,又要长见识了,谢谢各位,晚安。。

使用特权

评论回复
13
yewuyi| | 2007-1-23 09:00 | 只看该作者

俺比较这样写main()


void        main(void){
                InitSys(); 
                while(1){
                  if(flag.bmain){
                          flag.bmain=faultFlag;
                          clrwdt;
                  switch(maincase){
                           case 0:
                                  break;
                           case 1:
                                  break;
                           ...
                           ...
                           ...
                           case n:
                                  break;
                          default:while(1){}; //异常复位
                                  }
                               }
                        }
                       }
::::
能保证中断、主程序任意一个异常的情况下都能让WDT动作才可以。
flag.bmain必须由中断驱动产生;
需要添加的任务加到下面的CASE里面,自己感觉这样比较容易写状态迁移表。

xwj & hotpower也给俺指点指点……

使用特权

评论回复
14
xwj| | 2007-1-23 10:23 | 只看该作者

不错,这个结构值得参考

前台任务基于状态迁移(比如界面操作)
后台任务基于中断(随机事件)和时间片切换(并行轮循)

看门狗只需检查并保证前台和时间片轮循正常运行即可,当然也可附带检查或重设下中断

这样子实际上也就是自己的简易OS了

使用特权

评论回复
15
yewuyi| | 2007-1-23 11:25 | 只看该作者

呵呵,可以偷懒免掉检查中断

假若中断异常关闭后,flag.bmain就不能正常产生,从而导致clrwdt不能执行,WDT自然就要‘咬人’了……

中断也比较简洁,一般里面就是动态扫描、按键20ms消抖;

按键键意解析及响应一般放到main()中的一个CASE分支里面调用keyscan()




俺一直想找到更好的程序结构……

使用特权

评论回复
16
hotpower| | 2007-1-23 12:30 | 只看该作者

等着所长来上课~~~估计现在农忙之中~~~

使用特权

评论回复
17
yewuyi| | 2007-1-23 12:50 | 只看该作者

所长的书俺期待了很久……

可惜不知道到哪儿去了?

使用特权

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

看来英雄草莽所见略同

我的结构和碧水长天的相似,基于不同的clk进行事件驱动
但是这种结构中ClrWDT的时间间隔也就决定了中间可执行指令数
缺点是有的。

另外yewuyi,多任务的时候状态机要拿出去了,是不是。

使用特权

评论回复
19
gtw| | 2007-1-23 13:35 | 只看该作者

如楼主所说

时间、速度、代码量不可兼得~~

使用特权

评论回复
20
碧水长天| | 2007-1-23 17:22 | 只看该作者

关于喂狗的问题,今天思索了一下,总结如下:

    直接在while(1)内无条件清狗,只能监控主程序异常和中断跑飞的情况,但无法监控中断被异常关闭的情况.

     结构修改如下:
#define N 20    /*若主函数在20个定时中断周期中仍然未执行到清除U8Globe_CounterDog计数器指令,则判断主程序异常,可执行软件复位处理*/
volatile unsigned char U8Globe_CounterDog;  //软件复位用计数器
volatile bit  fGlobe_EnClsWDT; //允许喂狗标志

void main(void){
       test_system_reset(); //测试系统复位情况.. 
       init_system();     
       while(1){
           U8Globe_CounterDog = 0;  //

           ....//任务代码
           fGlobe_EnClsWDT = 1;  //在需要狗看门的地方,设立此标志              
           .... //任务代码
      }
}

void interrupt TimerIsr(oid){
     U8Globe_CounterDog ++;
     if (U8Globe_CounterDog > N) ProcTimerOutReset(); //
     else if (fGlobe_EnClsWDT) {  
          CLS_WDT();
          fGlobe_EnClsWDT = 0;
     }
     ...//处理其他事情
}

分析:
优点: 
1 主程序跑飞,则无法置fGlobe_EnClsWDT标志和清计数器U8Globe_CounterDog ,则中断服务程序也无法喂狗,将发生超时软件复位或者看门狗复位;
2 若中断被异常关闭,则无法喂狗,将发生看门狗复位;
3 若中断没被关闭但跑飞,也将无法喂狗,将发生看门狗复位;

缺点:
1 占用一定的中断处理器时间;
2 要求TimerIsr优先级为最高;

    若有人觉得在ISR中喂狗不好,那么也可以反过来,在TimerIsr中设立标志和清计数器,而在主程序中喂狗和处理超时软件复位.

    至于代码中加了计数器U8Globe_CounterDog,个人觉得,用户可以在复位前做一些工作,不象看门狗复位过程中,用户无法控制.

    请hotpower,xwj等前辈点评 

使用特权

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

本版积分规则

2

主题

56

帖子

0

粉丝