看门狗是Nuttx中实现的一种定时器,该定时器底层基于硬件定时器,通过设置硬件定时器的定时触发来驱动看门狗。看门狗为系统提供了精确定时执行回调任务的机制。
注册底层硬件定时器
注册硬件定时器
系统在启动初始化过程中,通过void up_initialize(void)
函数调用void up_initialize(void)
,在up_initialize()
函数中初始化硬件定时器,作为watchdog的底层硬件定时器。这个定时器初始化模式为oneshot
,即为一次性定时,而非周期性定时。
启动硬件定时器
在Nuttx中,启动硬件定时器开始oneshot定时通过函数up_timer_start()
函数完成。该函数有一个参数ts,为定时时间。
int up_timer_start(FAR const struct timespec *ts)
{
return stm32_oneshot_start(&g_tickless.oneshot, stm32_oneshot_handler, NULL, ts);
}
看门狗定基于该定时器,每当一个看门狗任务定时时间到,该看门狗的服务函数开始执行。如果需要周期性地执行看门狗任务,那么可以在看门狗服务函数中重新调度该看门狗。
系统中可能注册了很多看门狗,当一个定时器时间到后,系统根据当前已注册的看门狗,计算出下一个定时时间间隔,重新调用up_time_start()
函数。
看门狗
数据结构
- 系统为看门狗分配了一个基本的数据结构
struct wdog_s
数组,每一个wdogs_s可以用来初始化一个看门狗。
static struct wdog_s g_wdpool[CONFIG_PREALLOC_WDOGS];
- 看门狗空闲资源单链表。该链表上的节点代表空闲的看门狗资源,系统分配看门狗的时候从该链表上取出一个空闲的wdgs_s,将其初始化,然后被链接到处于活动状态的看门狗链表上(
g_wdactivelist
)
sq_queue_t g_wdfreelist;
- 活动状态的看门狗链表。当一个看门狗wdgs_s被分配后,其被链接到
g_wdactivelist
链表上
sq_queue_t g_wdactivelist;
- 空闲看门狗资源个数
uint16_t g_wdnfree;
- struct wdg_s
s