请问使用agile_modbus做了个三主一从的模块,开启了五个线程,线程设置均为同等级与同时间片大小的线程,设置代码如下
rs485_slave_thread_UART4 = rt_thread_create("rs485_slave_thread_UART4", rs485_slave_thread_entry_UART4, RT_NULL, 2048, 15, 10);
但是当我整个一个模块开发完成之后想要再加个看门狗,功能调用使用空闲钩子函数如下
void idle_hook(void)
{
/* 在空闲线程的回调函数里喂狗 */
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
// 打印喂狗信息,可在调试完成后根据需要去掉
rt_kprintf("feed the dog!\n");
}
static int wdt_sample(void)
{
rt_err_t ret = RT_EOK;
// 根据设备名称查找看门狗设备,获取设备句柄
wdg_dev = rt_device_find(WDT_DEVICE_NAME);
if (!wdg_dev) {
// 打印查找设备失败信息
rt_kprintf("find %s failed!\n", WDT_DEVICE_NAME);
return RT_ERROR;
}
// 初始化设备
ret = rt_device_init(wdg_dev);
if (ret!= RT_EOK) {
// 打印设备初始化失败信息
rt_kprintf("initialize %s failed!\n", WDT_DEVICE_NAME);
return RT_ERROR;
}
// 设置看门狗溢出时间
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &WDT_TIMEOUT);
if (ret!= RT_EOK) {
// 打印设置超时时间失败信息
rt_kprintf("set %s timeout failed!\n", WDT_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", WDT_DEVICE_NAME);
return RT_ERROR;
}
// 设置空闲线程回调函数
rt_thread_idle_sethook(idle_hook);
return ret;
}
int main(void)
{
at24c64_Config();
led_init();
system_startup_init();
/* 初始化看门狗 */
wdt_sample();
int count = 1;
rt_pin_mode(LED, PIN_MODE_OUTPUT);
while (count++)
{
//运行led
rt_pin_write(LED, PIN_LOW);
rt_thread_mdelay(100);
rt_pin_write(LED, PIN_HIGH);
rt_thread_mdelay(100);
}
return RT_EOK;
}
问题在于我只要在初始化里面调用wdt_sample();单片机会总是反复的在复位,会在执行几次我设置好的五个线程中的功能后重复复位,也就是看门狗喂狗有问题,我的超时时间如果设置为10或者30、50都不行,单片机都会重复复位。但是当我的超时时间设置为100之后模块运行就是正常的,目前看来没有任何问题,这就很奇怪了,不知道哪里出了问题。
我后面尝试了给看门狗也加个线程,我发现线程优先级设置低了还是不行,单片机还会复位,设置的优先级比我的另外五个线程高之后,单片机会正常运行一段时间,然后会复位,在正常运行一段时间。
现在的问题就是很奇怪,虽然我把超时时间设置100之后没什么问题,但是我怕有隐患,例如三天,一周,一个月之后我怕会有问题。
请问这大概从什么地方排查呢,我这是哪里出了问题?
我现在尝试了一种方法可以,就是把喂狗放在我的五个线程里面。现在测试是没问题,但是不知道这样靠不靠谱,目前短时间看没问题,长时间可行吗?
@很认真的人
可以试下syswatch组件