问题零:添加看门狗之前,好多天,遇到2次卡死;添加看门狗之后,经常复位,今天已经十多次了。不知道是程序本身有问题,还是看门狗添加不对导致的。
问题一:溢出时间timeout可以设置多少?我的需求是程序卡死后,能自己重启就行,现在是5s
static int wdt_sample(void)
{
rt_err_t ret = RT_EOK;
rt_uint32_t timeout = 5; /* 溢出时间,单位:秒 */
/* 根据设备名称查找看门狗设备,获取设备句柄 */
wdg_dev = rt_device_find(WDT_DEVICE_NAME);
if (!wdg_dev)
{
// rt_kprintf("find %s failed!\n", device_name);
return RT_ERROR;
}
/* 设置看门狗溢出时间 */
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
if (ret != RT_EOK)
{
// rt_kprintf("set %s timeout failed!\n", device_name);
return RT_ERROR;
}
/* 启动看门狗 */
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
if (ret != RT_EOK)
{
// rt_kprintf("start %s failed!\n", device_name);
return -RT_ERROR;
}
/* 设置空闲线程回调函数 */
// rt_thread_idle_sethook(idle_hook);
return ret;
}
问题二:事件组send函数,如果我send了,但是还在等待其他线程发送事件,此时如果我再发送一个,这个event还是只有一个,对吧
发送喂狗事件,共5个
rt_event_send(&feed_dog_event, EVENT_FLAG3);
最高优先级线程中喂狗
void feed_dog(void* parameter)
{
rt_uint32_t e = 0;
while(1)
{
if (rt_event_recv(&feed_dog_event, (EVENT_FLAG1 & EVENT_FLAG2 & EVENT_FLAG3 & EVENT_FLAG4 & EVENT_FLAG5),
RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
30, &e) == RT_EOK)
{
if ((e & DOG_BIT_ALL) == DOG_BIT_ALL)
{
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
e = 0;
}
}
rt_thread_delay(500);
}
}
麻烦大家帮忙看看,有没有问题,谢谢
嗯,应该是按位或。
但是有新问题,就是接收的时候,有一个event发送过来,就会把整个32位清零了,比如 1 3来,就清零,然后 2 4 5来了,但是已经清零了,就不符合条件了