Nuttx watchdog 看门狗

本文详细介绍了Nuttx系统中看门狗定时器的实现,包括如何注册和启动硬件定时器,看门狗的数据结构、初始化、分配和启动过程。看门狗基于硬件定时器提供精确的定时回调功能,系统通过维护活动状态链表来管理多个看门狗,确保在定时时间到时调用相应服务函数。
摘要由CSDN通过智能技术生成

看门狗是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值