请教,如何决定看门狗的定时时间?两种看门狗的场合?
1.如何决定看门狗的时间?是根据程序执行一周所用的时间来确定个大概吗?
然后在while循环里喂一次狗?
2.独立看门狗和窗口看门狗各自的应用场合有哪些?
查了些资料,知道独立看门狗只有下限,有独立的40K左右时钟源;软件看门狗,有下限和上限,只有在下限和上限区间内,才能正常喂狗。
在循环里面喂狗还是在定时器里面喂狗这个问题谈论了很久了。
1.在循环里面喂狗时间不固定 可能比较浪费时间 是MCU 的效率比较低 。
2. 在定时器里面喂狗,有可能达不到喂狗的效果,因为有可能程序跑到一个死循环里面了,但是能够进入到定时器中断里面喂狗。
这些纯属于个人的意见,高手勿喷!各抒己见而已!!!讨论讨论!!!:lol:lol:lol:lol:lol:lol 当然是根据你程序运行的时间来算,比如你的while循环中有个任务大概运行10ms,超过10MS说明已经跑飞了,这个时候就把看门狗设置为10ms,如果跑飞了就不能喂狗了,然后就重启了 看门狗需要用定时器来喂,你用while语句喂狗需要算里面的执行时间。
没用过窗口的类型,没办法给意见:L
二楼回答正确 奏奏奏 发表于 2016-12-28 19:03
看门狗需要用定时器来喂,你用while语句喂狗需要算里面的执行时间。
没用过窗口的类型,没办法给意见
...
额,需要用定时器来喂,这句话什么意思?看门狗本来不就是个定时器吗?
我用的是HAL库,现在是这么用的:
...
MX_IWDG_Init();
HAL_IWDG_Start(&hiwdg);
...
while(1)
{
...
HAL_IWDG_Refresh(&hiwdg);
} any012 发表于 2016-12-29 08:55
额,需要用定时器来喂,这句话什么意思?看门狗本来不就是个定时器吗?
我用的是HAL库,现在是这么用的: ...
关键在于你的“HAL_IWDG_Refresh(&hiwdg);”前面的省略号是什么代码,是否是固定延时的语句。
我的做法是加载FreeRTOS,用单独的一个任务喂狗:
/* StartTask10 function */
void StartTask10(void const * argument)
{
/* USER CODE BEGIN StartTask10 */
/* Infinite loop */
for(;;)
{
osDelay(500);
HAL_IWDG_Refresh(&hiwdg);
// 每隔 500 毫秒喂一次看门狗 看门狗设置 1000 毫秒重启
}
/* USER CODE END StartTask10 */
} 看门狗不要用定时器来喂,某些程序跑飞了,但定时器硬件依然可以工作。最好在大循环里面喂。 andypanfan 发表于 2016-12-29 09:21
在循环里面喂狗还是在定时器里面喂狗这个问题谈论了很久了。
1.在循环里面喂狗时间不固定 可 ...
跑实时操作系统的话,有任务调度的原因。
只要其中一个任务跑死了,就跑不到另外一个任务,所以我这么做。
调试程序的时候,主任务出问题,确实会因为没喂狗而引起MCU重启。 ts2000 发表于 2016-12-29 09:26
看门狗不要用定时器来喂,某些程序跑飞了,但定时器硬件依然可以工作。最好在大循环里面喂。 ...
言之有理,顶
页:
[1]
2