打印

程序走飞时,重要数据怎么办?

[复制链接]
2072|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
happystar|  楼主 | 2007-3-10 09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在正做一个电能东西。里边含有掉电切换电池的电路,所以程序只有在掉电的时候把电能写到EEP里。板子有个看门狗芯片,但是现在在想:如果在没有掉电的情况下,程序走飞了,那么看门狗将复位MCU了,如果此刻数据没有写入EEP,那么就会丢失的。
请教大家:怎样能在程序走飞的时候写EEP呢?

相关帖子

沙发
平常人| | 2007-3-10 10:06 | 只看该作者

程序走飞了,看门狗将复位MCU——你应在MCU复位后保存重要

MCU复位后先判断复位源,如果是上电复位则正常运行,如果是看门狗复位则进行数据保存。

使用特权

评论回复
板凳
happystar|  楼主 | 2007-3-10 11:41 | 只看该作者

to 平常人

这样实现可以么?
........
int flag_aa=0x11;//掉电标志
........
void main(){
  init_device();
  if(aa==0x11){//看门狗复位
    save_data_to_eep();//保存数据
  }
  else{ //上电复位 
    read_data_from_eep();//从EEP里读出先前保存的数据
  }
  while(1){//主程序里的一些循环
    ........
  }
}
现在突然想到一个问题:既然看门狗复位了(没有掉电的情况),那么RAM里的要保存的数据是不变的。所以也没有必要再往写EEP里写了。
比如我要保存的是电能,程序走飞,看门狗复位后电能数据是不变的,复位后就可以直接可以用这个数据了。没必要再写了。
你说我的这个理解正确吗?谢谢拉   
  

使用特权

评论回复
地板
bc107| | 2007-3-10 17:00 | 只看该作者

应该是对的

只有没有掉电,RAM里面的信息正常情况下不会被修改
watch dog 复位以后,程序从新开始,唯一需要注意的是,从新开始以后,你原来保存数据的地址如果是 动态地址,有可能会出问题

使用特权

评论回复
5
happystar|  楼主 | 2007-3-10 18:00 | 只看该作者

to bc107

“你原来保存数据的地址如果是 动态地址,有可能会出问题”这个可能是什么意思啊?是堆栈原因么?

我的数据保存的地址是C编译器动态分配的啊。以前做过绝对地址宏定义,感觉这样很不好的。所以我让编译器自动分配地址的。如果可能出问题的话,那么watchdog复位后写的地址就是错误的啊。
如果这样的情况下该怎么做呢?谢谢拉

使用特权

评论回复
6
平常人| | 2007-3-10 18:03 | 只看该作者

你对变量的初值设置的理解有错误

单片机复位后,进入main之前,有一段startup程序是在程序链接时自动加入的,这段startup程序用于实现全局变量的初始化,你程序中的那一行“int flag_aa=0x11; //掉电标志”就是由这段startup程序实现的。

因此,你的程序每次进入main时,不管是上电复位还是看门狗复位,变量flag_aa的值都是0x11,所以你要求的目的不能达到!

一般带看门狗的单片机都有硬件的标志,供程序区别是看门狗复位还是上电复位。

使用特权

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

本版积分规则

58

主题

409

帖子

1

粉丝