打印

程序每个1天左右必看门狗复位一次,不知为何?求各位指教

[复制链接]
3583|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hwk612167|  楼主 | 2011-9-5 12:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在发现上电复位后过10到30小时,MCU必然看门狗复位,且LCD显示3,即在运行完子程序B之后就出现看门狗复位?程序B返回后PC跑飞了??debug了2天毫无收获,求各位大大指教,谢谢!相关程序大致结构如下:
整个结构为一个状态机,现程序一直在运行状态FuncA,FuncA中除了休眠1秒时间外,其它程序平时占用时间约为1-10ms。
_no_init INT8U gu8_test;
void FuncB(INT32U u32_dgt, INT8U_P pu8_bcd)
{
  '''
  '''
  gu8_test = 3;
}
void FuncA(void)
{
  INT32U u32_dgt;
  INT8U au8_buf[7];
  ...
  gu8_test = 1;
  FuncB(u32_dgt, (INT8U_P)au8_buf);
  gu8_test = 2;
  ...
  MCU_sleep_s(1);
}

int main(void)
{
   若判断得为看门狗复位,则LCD显示gu8_test;否则程序正常运行。
}

相关帖子

沙发
hwk612167|  楼主 | 2011-9-5 12:50 | 只看该作者
补充:gu8_test在程序复位后若判断不为看门狗复位,则会清0该变量。程序其它地方绝对没有将gu8_test设为3。

使用特权

评论回复
板凳
nino_1| | 2011-9-5 15:53 | 只看该作者
问:喂狗的判断条件是什么?

使用特权

评论回复
地板
airwill| | 2011-9-5 16:31 | 只看该作者
频率这么低, 通常有两种可能.
1. 外界干扰.  排除和测试办法, 增加干扰源信号, 看是否看门狗复位的频率会改变.
2. 软件缺陷. 不知道你的看门狗动作时间设置为多少? 是否与 1S 距离不太大.
由于mcu 的看门狗定时器通常精度很差, 所以通常要把喂狗间隔设为最小狗动作时间的 3/4 以内.
测试办法, 把 MCU_sleep_s(1); 休眠 1 秒改成 500ms 或者 800ms 等等, 看是否已经不出现狗复位了?

使用特权

评论回复
5
hwk612167|  楼主 | 2011-9-5 18:19 | 只看该作者
回Ls各位,休眠函数内部是 500ms喂一次,比较器定时。
实际我程序是mcu_sleep_500ms(2);

使用特权

评论回复
6
hwk612167|  楼主 | 2011-9-6 08:51 | 只看该作者
【补充】__no_init volatile INT8U gu8_test; //实际程序是这样写的

使用特权

评论回复
7
原野之狼| | 2011-9-6 10:27 | 只看该作者
1 先找个好点的环境来测试。
2 看看电源的信号质量怎么样。
3 软件上加入各种调试信息来捕捉异常。
我估计是软件的BUG,你可以把软件精简到只剩下喂狗操作。

使用特权

评论回复
8
ayb_ice| | 2011-9-6 11:09 | 只看该作者
喂饱点是不会咬人的

使用特权

评论回复
9
hwk612167|  楼主 | 2011-9-6 12:21 | 只看该作者
2节干电池供电,电量充足,工作环境就是在办公室了

使用特权

评论回复
10
hwk612167|  楼主 | 2011-9-6 12:24 | 只看该作者
void FuncB(INT32U u32_dgt, INT8U_P pu8_bcd)
{
  '''
  '''
  gu8_test = 3;
gu8_test = 4;
gu8_test = 5;
gu8_test = 6;
。。。
gu8_test = 10;
}
我在FuncB后加了几条语句,过了一天,LCD显示10。
奇怪的是当天我9点上电复位,到下班也没有异常,我下午上电复位,到第2天也要大概中午以后才出现异常。
只有慢慢调试了

使用特权

评论回复
11
aihe| | 2011-9-6 19:23 | 只看该作者
狗的问题是假象,是不是有什么数溢出了

使用特权

评论回复
12
hwk612167|  楼主 | 2011-9-7 08:26 | 只看该作者
昨天把狗关了 ,今天看结果

使用特权

评论回复
13
liuyuxiier| | 2011-9-30 21:50 | 只看该作者
不知楼主的问题解决了没有~
以前我也碰到过一次这种问题,没有仿真器,为了查清楚原因,在复位以后,在串口输出一串字符,然后连接至PC,通电观察,发现每次工作的时间都是固定的N小时(时间久,记不清了),前后不超过2秒的误差。
最终发现问题出在单片机的一个悬空的引脚上,这个悬空的引脚对工频信号进行了计数,我的底层程序以前是别的项目移植过来的,这个悬空引脚刚好是内部计数器的输入,计数器中断打开却没有写中断服务函数,所以经过了N个小时以后出现了狗饿了咬人的情况
希望对楼主有帮助

使用特权

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

本版积分规则

个人签名:前进 前进 前进

20

主题

511

帖子

3

粉丝