打印

关于单片机看门狗溢出 保存关键数据至FLASH

[复制链接]
6725|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hwk612167|  楼主 | 2011-6-22 13:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问,若想在程序跑飞,看门狗溢出致系统复位前保存数据至FLASH,因为狗叫后直接跳到程序开头运行,那么该如何实现呢?
现在,我的做法是不用单片机的硬件看门狗,而是用定时器来实现“软看门狗”,当定时器溢出时,在中断里保存数据,然后写0到WDT寄存器,高8写口令错误,然后产生复位。这样,有没有什么弊端??

请问大家有什么好的办法来实现,欢迎指教?

相关帖子

沙发
yewuyi| | 2011-6-22 16:14 | 只看该作者
方法错误。

正确的方法应该是:现在很多MCU都支持通过内部的寄存器位查询,可以得知是上电复位还是掉电复位或者是看门狗复位,在程序的开头判断是何种复位,然后根本复位原因去执行相关任务,如果是用C语言,则需要关闭编译器自带的启动文件,改成自己的启动文件,在自己的启动文件做相关复位状态判断。

你的那种办法是不行的,因为你无法抓到复位发生的时刻。

使用特权

评论回复
板凳
hwk612167|  楼主 | 2011-6-22 17:12 | 只看该作者
刚刚在研究IAR自带的启动文件,会清0全局变量,还有一些数据复制。

使用特权

评论回复
地板
hwk612167|  楼主 | 2011-6-22 17:15 | 只看该作者
晕,没写完,不小心发出去了,MSP430狗最长1S。不够长,怎么办呢
我开头写的那种方法,是否有什么隐藏bug,产品量产了几十K,有将近1年尚未发现什么bug

使用特权

评论回复
5
hwk612167|  楼主 | 2011-6-23 09:07 | 只看该作者
"因为你无法抓到复位发生的时刻。"这句话没太明白,例如程序跑飞,看门狗也不能立即知道呀,也要等到定时结束没有喂狗,我这个软定时狗也会定时喂的。
还有,那个IAR怎么设置不用自带的启动文件,自己的又该如何编写?谢谢!
发现全局变量全部存储在const memory中,这个和code memory有什么不出,分别存放在何处?在C语言中,如const int A = 5; //const不是译为只读吗

2# yewuyi

使用特权

评论回复
6
xwj| | 2011-6-23 09:14 | 只看该作者
内部有“硬件看门狗”的单片机,必然有不同的复位向量或者有寄存器能够判断复位来源的,否则只能说是设计的人脑袋缺了一块。

至于LZ的方法,你凭什么保证你的监视定时器就不会被干扰或者意外修改呢?而且在别的程序都被干扰到不能正常工作时又凭什么来保证你的这个监视定时器还一定是正常的呢?

使用特权

评论回复
7
joyme| | 2011-6-23 09:16 | 只看该作者
看门狗主要是程序跑飞或意外终止,真碰到这种情况你的定时中断也不会有效

使用特权

评论回复
8
t.jm| | 2011-6-23 09:18 | 只看该作者
晕,没写完,不小心发出去了,MSP430狗最长1S。不够长,怎么办呢
我开头写的那种方法,是否有什么隐藏bug,产品量产了几十K,有将近1年尚未发现什么bug ...
hwk612167 发表于 2011-6-22 17:15

你的方法肯定是不对的,应该用2L的方法。
没出问题恐怕是因为没遇到看门狗复位而已。

使用特权

评论回复
9
hwk612167|  楼主 | 2011-6-23 09:35 | 只看该作者
程序跑飞,定时器还在工作啊,那么只要中断未关闭,就能够进入中断保存数据,然后产生系统复位。除非,跑飞后以外关闭中断了。

6# xwj

使用特权

评论回复
10
hwk612167|  楼主 | 2011-6-23 09:35 | 只看该作者
如9楼所述,还请详细说明下,谢谢!
7# joyme

使用特权

评论回复
11
hwk612167|  楼主 | 2011-6-23 09:37 | 只看该作者
2L之方法需修改编译器自带启动文件,请问这种方法常规吗,有没有更好的办法?在这之前我从没修改过这些,可能我井底蛙了。这个,怕是不少人都不知道这个在MAIN之前编译器具体干了啥把。

8# t.jm

使用特权

评论回复
12
xwj| | 2011-6-23 09:40 | 只看该作者
LZ,问题是你“凭什么保证” 程序跑飞时,定时器还在工作、并且定时器条件还正常、中断向量、使能、屏蔽位、堆栈......等等等等仍旧全部正常?

任何一个条件不对定时中断就进不了,你“凭什么保证”CPU受到干扰时都跑飞了时,这么多定时器相关的东西就100%的一点都不会被破坏???

使用特权

评论回复
13
hwk612167|  楼主 | 2011-6-23 09:49 | 只看该作者
定时器是内部硬件逻辑,应该不出错把。我理解的跑飞大多情况下是陷入某个死循环出不来了,我程序里用while的地方一般都没有操作中断使能等的,至于堆栈未考虑到,也有可能吧,跑飞能把指令全乱了吗,如指令有2字节,跳到第2字节开始,后面就全乱了,有可能没?这样,若中断正常,我这个定时器能否产生正常的复位呢

其实,用这个定时器也没办法,我这个430单片机狗最长间隔1S,就的喂狗,满足不了我的要求。
12# xwj

使用特权

评论回复
14
t.jm| | 2011-6-23 09:53 | 只看该作者
客观地说你的方法也是有一定的效果,但是还不够完善。
MSP430的看门狗不是可以设置工作模式的吗?可以选复位还是中断!你把它设为看门狗溢出中断不好一点吗?

使用特权

评论回复
15
xwj| | 2011-6-23 09:58 | 只看该作者
“定时器是内部硬件逻辑,应该不出错把。”那CPU内部也全是硬件逻辑呢,就不出错?

“最长间隔1S,就的喂狗”为什么就不能满足要求了?

“产品量产了几十K,有将近1年尚未发现什么bug”就代表这样做没隐患了吗?那世界时那么多根本就没用看门狗或者没开看门狗的东西或设计呢?

使用特权

评论回复
16
xwj| | 2011-6-23 10:06 | 只看该作者
本帖最后由 xwj 于 2011-6-23 10:07 编辑

并不是说软件看门狗就不能用,但是既然是软件的、可编程的,那就必然会有被修改的可能和隐患。

而且东西越多出问题的可能越多,这个基本的道理搞设计的都懂吧?
而好的硬件看门,就只一个独立的计数器和不能关闭的中断,并且看门狗开了就不能关闭,你说相对来说那个更可靠?

所以有条件的话,能启用独立的看门狗更好,内部硬件看门狗也可,还可以再加上软件看门狗再加一道保险;
实在没条件那当然没办法,比如受成本、耗电等限制时,这是软件看门狗有总比没有好。

使用特权

评论回复
17
hgjinwei| | 2011-6-23 12:34 | 只看该作者
不要用正常的思维来考虑异常的状况,程序跑飞时,你要保存的“关键数据”都有可能被打得乱七八糟。

使用特权

评论回复
18
hwk612167|  楼主 | 2011-6-23 17:32 | 只看该作者
1秒 这样,我要在很多地方喂狗了

15# xwj

使用特权

评论回复
19
hwk612167|  楼主 | 2011-6-23 17:34 | 只看该作者
未发现bug并不是说就没有bug,这个我也知道,只是想就这个看门狗问题,想请教下有没有什么潜在的较明显的bug。
这个软看门狗为了提高可靠性,但也只能提高一些,不可能100%可靠
15# xwj

使用特权

评论回复
20
hwk612167|  楼主 | 2011-6-23 17:36 | 只看该作者
是不是考虑的太深了,照这样,按2L所述方法,复位后全局变量或静态变量保持原值,也没有意义了。
17# hgjinwei

使用特权

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

本版积分规则

个人签名:前进 前进 前进

20

主题

511

帖子

3

粉丝