一定要加几句watchdog_update();吗? 点击:764 | 回复:2



rejoicewang

    
  • 精华:2帖
  • 求助:0帖
  • 帖子:41帖 | 149回
  • 年度积分:0
  • 历史总积分:336
  • 注册:2002年5月15日
发表于:2003-02-28 11:06:00
楼主
我的源程序,用的是8选1的74ls151,主要功能,采集8路高频脉冲的平均频率。有位老师认为fl_from_ulong(pulse_value,&temp);    fl_div(&temp,&f0839,&temp);    T12=fl_to_ulong(&temp); 这种语句花费时间比较长,可以加几句 watchdog_update(); 这样就不容易发生超时错误了。 看门狗时间周期将近为0.84s,我用的对象是pulsecount input,它 在固定的时间内0。839秒,对输入边沿数计数,我要求平均频率,所以要除0.839. 我不太清楚看门狗的工作原理,在我的程序中一定要加几句 watchdog_update();吗?不加会有什么问题?请高手指点迷津。   #include<float.h>   IO_0 output bit a0;   IO_1 output bit a1;   IO_2 output bit a2;   const float_type f0839={0,0x3f,0,0x56,0xc8b4} /* 0.839 */;   float_type temp;   network output unsigned long T18,T17,T16,T15,T14,T13,T12,T11;   IO_4 input pulsecount ded io_total_ticks;   unsigned long pulse_value;   unsigned int k;   when(io_update_occurs(io_total_ticks))   {          switch(k){    case 0:    pulse_value=io_in(io_total_ticks);    fl_from_ulong(pulse_value,&temp);    fl_div(&temp,&f0839,&temp);    T18=fl_to_ulong(&temp);    io_out(a0,0);    io_out(a1,0);    io_out(a2,0);    break;    case 1:    pulse_value=io_in(io_total_ticks);    fl_from_ulong(pulse_value,&temp);    fl_div(&temp,&f0839,&temp);    T11=fl_to_ulong(&temp);    io_out(a0,0);    io_out(a1,0);    io_out(a2,1);    break;    case 2:    pulse_value=io_in(io_total_ticks);    fl_from_ulong(pulse_value,&temp);    fl_div(&temp,&f0839,&temp);    T15=fl_to_ulong(&temp);    io_out(a0,0);    io_out(a1,1);    io_out(a2,0);    break;    case 3:    pulse_value=io_in(io_total_ticks);    fl_from_ulong(pulse_value,&temp);    fl_div(&temp,&f0839,&temp);    T13=fl_to_ulong(&temp);    io_out(a0,0);    io_out(a1,1);    io_out(a2,1);    break;    case 4:    pulse_value=io_in(io_total_ticks);    fl_from_ulong(pulse_value,&temp);    fl_div(&temp,&f0839,&temp);    T17=fl_to_ulong(&temp);    io_out(a0,1);    io_out(a1,0);    io_out(a2,0);    break;    case 5:    pulse_value=io_in(io_total_ticks);    fl_from_ulong(pulse_value,&temp);    fl_div(&temp,&f0839,&temp);    T12=fl_to_ulong(&temp);    io_out(a0,1);    io_out(a1,0);    io_out(a2,1);    break;    case 6:    pulse_value=io_in(io_total_ticks);    fl_from_ulong(pulse_value,&temp);    fl_div(&temp,&f0839,&temp);    T16=fl_to_ulong(&temp);    io_out(a0,1);    io_out(a1,1);    io_out(a2,0);    break;    case 7:    pulse_value=io_in(io_total_ticks);    fl_from_ulong(pulse_value,&temp);    fl_div(&temp,&f0839,&temp);    T14=fl_to_ulong(&temp);    io_out(a0,1);    io_out(a1,1);    io_out(a2,1);    break;    }      k++;   if(k==8)   k=0;      }



gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-02-20 11:49:00
1楼
如果你的程序运行时间过长导致看门狗计时溢出,芯片就会自动复位,正在运行的程序就完蛋了;不知我说的对不对,清高手指点

戴陈海

  • 精华:0帖
  • 求助:0帖
  • 帖子:19帖 | 75回
  • 年度积分:0
  • 历史总积分:272
  • 注册:2003年2月19日
发表于:2003-02-28 11:06:00
2楼
watchdog_update语句是把看门狗定时器的数值重新刷新,刷新后在一个when子句内一个固定的时间(可以根据晶体频率由公式计算出时间)如果没有再次调用watchdog_update语句,Neuron芯片就会自动复位,并在复位引脚输出复位脉冲。所以在when字句中,估计执行时间比较长的语句后面,适当地加入watchdog_update语句,防止看门狗定时器溢出而使芯片复位。 我看了你上面的程序,fl_div(&temp,&f0839,&temp);和T12=fl_to_ulong(&temp);两句语句后面可以加watchdog_update语句,不过你可以试着不加watchdog_update语句,如果芯片复位再加上,在你上面程序里的when子句中,8段类似的代码是不会同时执行的,但是总有一段要执行,所以如果要加,每个浮点运算函数的后面都要加上watchdog_update语句。

热门招聘
相关主题

官方公众号

智造工程师