holts2 发表于 2014-8-24 07:35:33

FSL的MCU 看门狗在应用中有什么特别需要注意的(已解决)

本帖最后由 FSL_TICS_ZJJ 于 2014-9-11 14:33 编辑

家家的MCU片上都有看门狗,但在应用中,这个小东西常常是被弃用,FSL的看门狗有什么独特的地方,大家在应用中又是如合使用它的,可以分享下你的好ideal.

holts2 发表于 2014-8-24 07:53:00

我先来抛块砖,我在51中是这样用它的



/***********************************************************************
Function : Main
Note   : 主程序
***********************************************************************/
void main()
{
    Time_Init();    //定时器初始化

    EA=1;         //开总中断

    ADC_Init(0);    //设置AD转换通道为P1.0

    P1M0 = 0xFC;    //P1.234567置为推换口
    P1M1 = 0x03;    //P1.01置为高阻抗
    P2M0 = 0xFF;    //P2.01234567置为推勉输出
    P2 = 0x0F;

    PWM_Init();   //DDS初始化 把PCA置为PWM
       
    set90(2);       //初始设置相位
    setRng(Rang_idx);//初始设置量程
    setGain(Gain_idx); //初始设置增益
    setFrq(Frq_idx);   //DDS初始设置为1kHz       

    LCD_INIT();

    LCD_PrintString("LCR 3.0");
   
    while(1)
   {
           WDTC();喂狗

           //键盘处理
              if (Trg&KEY_M) {M_Done(Fun_idx);}//功能切换
              if (Trg&KEY_X) {X_Done(Mode_idx);} //模式切换
              if (Trg&KEY_R) {setRng(0);}      //量程步进
              if (Trg&KEY_C) {C_Done(0);}      //清零
              if (Cont&KEY_M)
              {
                       cnt_plus++;
                       if (cnt_plus>100){cnt_plus=0;M_Done(FUN_S);}
             }
              if (Cont&KEY_R)
              {
                       cnt_plus++;
                       if (cnt_plus>100) {cnt_plus=0;setRng(1);}
             }
              if (Cont&KEY_C)
              {
                       cnt_plus++;
                       if (cnt_plus>100) {cnt_plus=0;C_Done(1);}
             }
              if (!(Cont)){cnt_plus=0;}

           //显示处理
           if (Status == DISPLAY )
          {
                Status = METER;

                   //calcLCR();
                   //SendSem(meter_fine);
                   //showR();
            }
   }
}

stepby 发表于 2014-8-24 07:58:44

喂狗要及时,饿了会咬人。

holts2 发表于 2014-8-24 08:09:00

stepby 发表于 2014-8-24 07:58
喂狗要及时,饿了会咬人。

担心它咬人,你可以关了它,这也是一种办法,如果你能驾役它,爱它,用它

sunnyqd 发表于 2014-8-24 08:26:14

holts2 发表于 2014-8-24 08:09
担心它咬人,你可以关了它,这也是一种办法,如果你能驾役它,爱它,用它 ...

要不要这么肉麻呢。。及时喂就可以啦,别放在中断里,放在住循环里

holts2 发表于 2014-8-24 08:35:03

sunnyqd 发表于 2014-8-24 08:26
要不要这么肉麻呢。。及时喂就可以啦,别放在中断里,放在住循环里

别说这个小东西有时让人又爱又恨,在有些应用,任务的耗时不确定,放在循环里很难搞定的说,这种情型下,我通常是一关了之。

sunnyqd 发表于 2014-8-24 08:37:21

holts2 发表于 2014-8-24 08:35
别说这个小东西有时让人又爱又恨,在有些应用,任务的耗时不确定,放在循环里很难搞定的说,这种情型下, ...

我通常的做法是,主循环(或idle进程)放独立看门狗,再额外开一个高优先级进程,放窗口看门狗

fengyunyu 发表于 2014-8-24 08:38:11

holts2 发表于 2014-8-24 08:35
别说这个小东西有时让人又爱又恨,在有些应用,任务的耗时不确定,放在循环里很难搞定的说,这种情型下, ...

喂狗还是有必要。实时性不强的话,循环计数,中断喂狗。

holts2 发表于 2014-8-24 08:42:55

fengyunyu 发表于 2014-8-24 08:38
喂狗还是有必要。实时性不强的话,循环计数,中断喂狗。

中断喂狗基本上这只狗就等于是宠物狗了,只是个摆设而与

holts2 发表于 2014-8-24 08:44:15

sunnyqd 发表于 2014-8-24 08:37
我通常的做法是,主循环(或idle进程)放独立看门狗,再额外开一个高优先级进程,放窗口看门狗 ...

养两支狗 ? 能否上点代码片断,学习学习 ?{:lol:}

fengyunyu 发表于 2014-8-24 08:44:33

holts2 发表于 2014-8-24 08:42
中断喂狗基本上这只狗就等于是宠物狗了,只是个摆设而与

主循环里计数,中断中先判断计数值是否合理,再喂狗。

zhangchaoying 发表于 2014-8-24 08:47:30

进来先打死狗的飘过。学习了。

holts2 发表于 2014-8-24 08:48:36

fengyunyu 发表于 2014-8-24 08:44
主循环里计数,中断中先判断计数值是否合理,再喂狗。

喔,还有机关, 这不等于放主循环里,干码放中断,不是多些一急

wxfje 发表于 2014-8-24 08:51:40

fengyunyu 发表于 2014-8-24 08:38
喂狗还是有必要。实时性不强的话,循环计数,中断喂狗。

中断喂狗就算了吧,这样的狗也只能看看而已

fengyunyu 发表于 2014-8-24 08:52:21

holts2 发表于 2014-8-24 08:48
喔,还有机关, 这不等于放主循环里,干码放中断,不是多些一急

哎!这样可以把喂狗时间加长。通常看门狗触发时间比较短,正如你前面所说,主循环可能来不及处理。

fengyunyu 发表于 2014-8-24 08:52:57

wxfje 发表于 2014-8-24 08:51
中断喂狗就算了吧,这样的狗也只能看看而已

看帖要仔细!

holts2 发表于 2014-8-24 08:53:18

zhangchaoying 发表于 2014-8-24 08:47
进来先打死狗的飘过。学习了。

不行,恭献点ideal再走

wxfje 发表于 2014-8-24 08:53:32

一般主循环喂狗,在有些处理比较浪费时间的地方单独喂狗
有系统的时候,就单独开个任务喂狗

sunnyqd 发表于 2014-8-24 08:53:48

holts2 发表于 2014-8-24 08:44
养两支狗 ? 能否上点代码片断,学习学习 ?

对呢,两只狗
代码的话没有什么特点

考虑到几点就可以了(用操作系统的情况):
1. idle任务里面喂独立看门狗
2. 设定一个喂窗口看门狗的高优先级任务,2tick执行一次,或者放在tick钩子函数里,窗口看门狗喂狗时间为1tick~3tick
3. 其它任务的设定避免长时间占用CPU的情况,e.g. 有多条printf的话,应将其分开,并加一定的delay

holts2 发表于 2014-8-24 08:55:35

wxfje 发表于 2014-8-24 08:53
一般主循环喂狗,在有些处理比较浪费时间的地方单独喂狗
有系统的时候,就单独开个任务喂狗 ...

这倒是个新情况, 也就是说可以在多个地方喂狗 ?

sunnyqd 发表于 2014-8-24 08:56:49

holts2 发表于 2014-8-24 08:55
这倒是个新情况, 也就是说可以在多个地方喂狗 ?

多个地方喂一个狗的情况尽量避免

holts2 发表于 2014-8-24 08:57:24

sunnyqd 发表于 2014-8-24 08:53
对呢,两只狗
代码的话没有什么特点



两只狗的设计策重看点有什么不同 ? ,看死锁?看死机 ?, 窗口的只看窗口进程 ?

sunnyqd 发表于 2014-8-24 08:58:48

holts2 发表于 2014-8-24 08:55
这倒是个新情况, 也就是说可以在多个地方喂狗 ?

但可以多个地方喂多个狗
如,用RTOS时,我遇到过一种情况是调用库的FFT计算很占用时间,对实时性要求不高时,可以计算一步后,delay一下

fengyunyu 发表于 2014-8-24 08:59:18

sunnyqd 发表于 2014-8-24 08:56
多个地方喂一个狗的情况尽量避免

正解,经验之谈。

holts2 发表于 2014-8-24 08:59:19

sunnyqd 发表于 2014-8-24 08:56
多个地方喂一个狗的情况尽量避免

但对于多个任务,每个任务时间很难定的情况下,好象这是个解决的方法

sunnyqd 发表于 2014-8-24 09:02:47

holts2 发表于 2014-8-24 08:57
两只狗的设计策重看点有什么不同 ? ,看死锁?看死机 ?, 窗口的只看窗口进程 ?...

我自己采用的方法。。
独立看门狗可以避免RTOS任务进程的错误,或者是堆栈溢出之类的。因为RTOS部分任务堆栈溢出时,会一直占用CPU,导致低优先级的不能进行调度
窗口看门狗可以避免RTOS内核或中断,或cpu fault的错误,因为窗口看门狗的时间比独立看门狗短,响应速度快

sunnyqd 发表于 2014-8-24 09:03:20

holts2 发表于 2014-8-24 08:59
但对于多个任务,每个任务时间很难定的情况下,好象这是个解决的方法

每个任务时间很难确定的话,那就在任务里加delay。。

fengyunyu 发表于 2014-8-24 09:08:09

sunnyqd 发表于 2014-8-24 09:03
每个任务时间很难确定的话,那就在任务里加delay。。

这样和在多个”占用时间长的任务“中喂狗一样,不好控制,不是很”合理“。有os的情况,可以开一个高优先级的任务,开一个低优先级的任务,前者喂狗加维护一个计数器,后者将计数器清零。一旦计数器超限,停止喂狗,复位。

wxfje 发表于 2014-8-24 09:13:09

sunnyqd 发表于 2014-8-24 08:56
多个地方喂一个狗的情况尽量避免

是的,能避免就避免,特殊情况该用 的还是要用

wxfje 发表于 2014-8-24 10:15:41

fengyunyu 发表于 2014-8-24 08:52
看帖要仔细!

确实是我没看仔细,这种喂狗的方式确实不错,尤其是在多任务环境下

Ai_evan 发表于 2014-8-24 11:08:19

实际应用中更多加狗狗的吧,不加的话都保不准会死机的!

浪里白条 发表于 2014-8-24 15:43:36

sunnyqd 发表于 2014-8-24 08:53
对呢,两只狗
代码的话没有什么特点



高手!第一次听说这种做法,学习了

cn_x 发表于 2014-8-24 15:54:11

对喂狗真没什么了解,围观,学习

sunnyqd 发表于 2014-8-24 16:18:55

浪里白条 发表于 2014-8-24 15:43
高手!第一次听说这种做法,学习了

这个也是我平时用的时候,觉得这样做的话比较保险

qwert1213131 发表于 2014-8-24 16:53:54

一句话不要等狗饿了,否则后果自负啊

slotg 发表于 2014-8-24 18:36:03

holts2 发表于 2014-8-24 08:42
中断喂狗基本上这只狗就等于是宠物狗了,只是个摆设而与

中断喂狗会有什么问题呢?

sunfulong 发表于 2014-8-25 09:09:23

与楼上同问

laotui 发表于 2014-8-25 09:11:34

用其他单片机时第一步就是关狗,这个确实没用好。

rootxie 发表于 2014-8-25 10:35:05

产品最后肯定会加狗的

FSL_TICS_ZJJ 发表于 2014-8-25 11:19:01

slotg 发表于 2014-8-24 18:36
中断喂狗会有什么问题呢?

RM中这段话详细的解释了为什么不能放中断:
The write to the SRVCOP register that services (clears) the COP counter should not be
placed in an interrupt service routine (ISR) because the ISR could continue to be
executed periodically even if the main application program fails.
如果你的喂狗放在了中断中,而你程序死掉的时候,恰好一直在执行你的那个中断函数,那你且不是一直喂狗,这样你的看门狗根本不能复位。

chenguanghua 发表于 2014-8-25 11:40:30

中断里面喂狗不是掩耳盗铃吗
导致一直喂狗,那你的狗就不咬人了

slotg 发表于 2014-8-25 12:05:53

FSL_TICS_ZJJ 发表于 2014-8-25 11:19
RM中这段话详细的解释了为什么不能放中断:
The write to the SRVCOP register that services (clears) t ...

这个意思是否表示喂狗放在timer中断,当主程序死掉之后timer中断还是有可能继续喂狗?

FSL_TICS_ZJJ 发表于 2014-8-25 12:52:01

slotg 发表于 2014-8-25 12:05
这个意思是否表示喂狗放在timer中断,当主程序死掉之后timer中断还是有可能继续喂狗? ...

这个意思是不能放在中断中喂狗!
实际上不要放在任何中断中喂狗,最好放循环中喂狗。

fiddly 发表于 2014-8-26 07:36:49

一般也是放在中断内喂,中断内判断状态机的变量,或者单独加个全局变量,主程序运行的时候,该值有规律的变化,比如,在前半部分加一,后半部分减一,然后,中断内看该值,不在正常范围内就停止喂狗,这样的全局变量可以加多个,总之,有了定时中断,喂狗变的很灵活了。主循环喂狗,还有个说法是刚好飞到喂狗的地方反复喂狗,狗也就失效了。

hongyancl 发表于 2014-8-26 08:23:18

多个地方喂一个狗的情况尽量避免

holts2 发表于 2014-8-26 18:03:54

fengyunyu 发表于 2014-8-24 08:52
哎!这样可以把喂狗时间加长。通常看门狗触发时间比较短,正如你前面所说,主循环可能来不及处理。 ...

Sorry, 这里所说的把喂狗时间加长,是什么意思,我不是太明白。

holts2 发表于 2014-8-26 18:09:10

fiddly 发表于 2014-8-26 07:36
一般也是放在中断内喂,中断内判断状态机的变量,或者单独加个全局变量,主程序运行的时候,该值有规律的变 ...

即然你已经用循环变量和狗关联, 直接把狗放在主循环中喂不是更简捷, 关联又放在中断中喂有什么特别的考滤 ?

fengyunyu 发表于 2014-8-26 19:16:23

holts2 发表于 2014-8-26 18:09
即然你已经用循环变量和狗关联, 直接把狗放在主循环中喂不是更简捷, 关联又放在中断中喂有什么特别的考 ...

主循环的时间有可能比较长,而看门狗复位的时间一般比较短。所以,一般在定时中断中喂狗,同时维护一个计数器,在主循环中把计数器清零。如果定时器中断判断到计数器的值超过某个值,则放弃喂狗,复位。

holts2 发表于 2014-8-26 20:45:03

fengyunyu 发表于 2014-8-26 19:16
主循环的时间有可能比较长,而看门狗复位的时间一般比较短。所以,一般在定时中断中喂狗,同时维护一个计 ...

你的这种方式,多占用了系统资源,它比直接在主循环中喂狗有什么好处 ?

fengyunyu 发表于 2014-8-26 20:51:06

holts2 发表于 2014-8-26 20:45
你的这种方式,多占用了系统资源,它比直接在主循环中喂狗有什么好处 ? ...

仔细看帖,都已经说的这么清楚了。1、看门狗喂狗间隔可以“加长”;2、避免ls几位提到的在某些运行时间长的模块加喂狗代码

holts2 发表于 2014-8-26 21:22:14

fengyunyu 发表于 2014-8-26 20:51
仔细看帖,都已经说的这么清楚了。1、看门狗喂狗间隔可以“加长”;2、避免ls几位提到的在某些运行时间长 ...

简单来说:

while 1
{
taska();
taskb();
taskc();
}

如果主循环中的三个任务运行时长不确定,以变量+中断喂狗的方式, 我的全局变量是放在A,B,C 三个任务中更新 ? 这个很难处理吧, 实际上我认为如果主循环时长超过 狗的时长,多处喂狗实际上是不可避免的了。

fengyunyu 发表于 2014-8-26 21:29:09

holts2 发表于 2014-8-26 21:22
简单来说:

while 1


有os的情况看28楼。无os的话,则:

while(1)
{
      看门狗计数器清零

      task1

      task2

      ...
}

就此打住了。不清楚这位兄台是真没有看懂,还是...

holts2 发表于 2014-8-26 21:42:51

fengyunyu 发表于 2014-8-26 21:29
有os的情况看28楼。无os的话,则:

while(1)


不好意思,我还真没看懂,你之前的贴子一直说的是中断喂狗, 但上面你复我的例子分明中在循环中喂狗麻,而且就我说的这个例子,主循环时长超过狗的时长,在这个主循环中必需多处喂狗,哪能这样简单的在任务前喂一次狗了事?

fengyunyu 发表于 2014-8-26 21:47:51

holts2 发表于 2014-8-26 21:42
不好意思,我还真没看懂,你之前的贴子一直说的是中断喂狗, 但上面你复我的例子分明中在循环中喂狗麻, ...

timer_interupt()
{
       if 喂狗计数器大于预设值 不喂狗
       else 喂狗
}

main()
{
      ...

      while(1)
   {
         喂狗计数器清零

         task1

          task2

          ...
   }
}

sdlibin007 发表于 2014-8-26 21:52:37

楼主经验很丰富啊!!

sdlibin007 发表于 2014-8-26 21:53:56

楼主经验很丰富啊!!

holts2 发表于 2014-8-26 22:03:08

fengyunyu 发表于 2014-8-26 21:47
timer_interupt()
{
       if 喂狗计数器大于预设值 不喂狗


喂狗计数器是个变量 ? 这个变量在那里 +1?

如果假设喂狗时长必须小于100us,而上面这个主循环最大耗时1ms (不定长,但最长不超过1ms,最短可能小于100us), 在这样的情型下,我要如何设置合理的计数器值 ?

以我的理解,喂狗计数器在主循环中应该会出现多次才能满足狗不咬人的条件吧

fengyunyu 发表于 2014-8-26 22:07:24

本帖最后由 fengyunyu 于 2014-8-26 22:08 编辑

holts2 发表于 2014-8-26 22:03
喂狗计数器是个变量 ? 这个变量在那里 +1?

如果假设喂狗时长必须小于100us,而上面这个主循环最大 ...

中断中+1。如果“喂狗时长必须小于100us”,那就把定时器的定时定短点即可。

timer_interupt()
{
       if 喂狗计数器大于预设值 不喂狗
       else
      {
         喂狗计数器加1
         喂狗
      }
}

holts2 发表于 2014-8-26 22:19:04

fengyunyu 发表于 2014-8-26 22:07
中断中+1。如果“喂狗时长必须小于100us”,那就把定时器的定时定短点即可。

timer_interupt()


高手在明间啊, 好一个定时器 +1, 精华在这里啊, 这解决了多处喂狗的难题,虽然多用了一个中断,还是值的。

fengyunyu 发表于 2014-8-26 22:24:45

holts2 发表于 2014-8-26 22:19
高手在明间啊, 好一个定时器 +1, 精华在这里啊, 这解决了多处喂狗的难题,虽然多用了一个中断,还是值 ...

其实是很常用的一个喂狗方式。ls有提到的”中断中不能喂狗“过于教条了。”多用了一个中断“,这个一般不会多用一个中断的。无os的话,一般总要开一个定时器做任务调度的。

fiddly 发表于 2014-8-27 10:49:31

holts2 发表于 2014-8-26 18:09
即然你已经用循环变量和狗关联, 直接把狗放在主循环中喂不是更简捷, 关联又放在中断中喂有什么特别的考 ...

时间啊,内部的狗,一般时间不是很长的,关联的话,时间很方便。

weiwei4 发表于 2014-8-27 15:51:22

好多程序都没有用狗,用得很少

dongyanbo 发表于 2014-8-27 16:19:16

没想到喂狗还有这么多学问,学习了

lzl000 发表于 2014-8-27 17:07:21

我基本都是进程序关看门狗的

iwqt1983 发表于 2014-8-27 17:27:12

喂狗不要过于频繁的,而且不要到处都喂的.这个要注意下

holts2 发表于 2014-8-27 19:54:36

iwqt1983 发表于 2014-8-27 17:27
喂狗不要过于频繁的,而且不要到处都喂的.这个要注意下

什么叫过于频繁? 喂狗必须定时定量.

jiang887786 发表于 2014-9-1 10:09:41

飞卡的看门狗还有一种窗口模式,就是每次在时间的75%喂狗。其他时间无效。

oner 发表于 2014-9-1 10:19:13

我是进来学习的{:loveliness:}

holts2 发表于 2014-9-1 13:07:04

jiang887786 发表于 2014-9-1 10:09
飞卡的看门狗还有一种窗口模式,就是每次在时间的75%喂狗。其他时间无效。 ...

窗口模式,为什么一定要在75%喂,这样设计有什么好处 ?

jiang887786 发表于 2014-9-1 13:27:39

这我也不怎么懂,反正有这个说法,呵呵{:handshake:}

holts2 发表于 2014-9-1 16:15:22

jiang887786 发表于 2014-9-1 13:27
这我也不怎么懂,反正有这个说法,呵呵

在前面有XD提到过窗口看门狗,用来看窗口进程,倒也可以理解,只是FSL这个要求75%喂狗,参不透有什么弦机

songjie 发表于 2014-9-1 16:47:59

stepby 发表于 2014-8-24 07:58
喂狗要及时,饿了会咬人。

(⊙o⊙)…~~~~ 这回复 。。。 膜拜~~ 您是说相声的吧~

FSL_TICS_ZJJ 发表于 2014-9-11 14:32:43

楼主你好,kinetis的watchdog使用注意项在我们的用户手册中已经写了:
The write to the SRVCOP register that services (clears) the COP counter should not be
placed in an interrupt service routine (ISR) because the ISR could continue to be
executed periodically even if the main application program fails.
If the bus clock source is selected, the COP counter does not increment while the
microcontroller is in debug mode or while the system is in stop (including VLPS or LLS)
mode. The COP counter resumes when the microcontroller exits debug mode or stop
mode.

holts2 发表于 2014-9-11 20:24:41

FSL_TICS_ZJJ 发表于 2014-9-11 14:32
楼主你好,kinetis的watchdog使用注意项在我们的用户手册中已经写了:
The write to the SRVCOP register t ...

你这只是一般原则,楼上有个XD说FSL这个要求75%喂狗,没看到详细说明为什么非在75%内喂狗的说明。
页: [1]
查看完整版本: FSL的MCU 看门狗在应用中有什么特别需要注意的(已解决)