闫刚 nuttx的posix的定时器原理

定时器工作原理

定时器主要是使用waitdog进行实现,周期处理是通过timer_timeout进行处理

资源

nuttx_posix_timer.md
闫刚 nuttx的posix的定时器原理

定时器模块初始化

主要是创建定时器的资源, 静态分配资源到链表中。

void weak_function timer_initialize(void)
{
#if CONFIG_PREALLOC_TIMERS > 0
int i;

/* Place all of the pre-allocated timers into the free timer list */

sq_init((FAR sq_queue_t *)&g_freetimers);

for (i = 0; i < CONFIG_PREALLOC_TIMERS; i++)
{
g_prealloctimers[i].pt_flags = PT_FLAGS_PREALLOCATED;
sq_addlast((FAR sq_entry_t *)&g_prealloctimers[i],
(FAR sq_queue_t *)&g_freetimers);
}
#endif

/* Initialize the list of allocated timers */

sq_init((FAR sq_queue_t *)&g_alloctimers);
}

定时器创建

创建定时器主要是设置1个signal信号,后期通过发信号通知用户程序
int timer_create(clockid_t clockid, FAR struct sigevent *evp,
FAR timer_t *timerid)
wdog = wd_create();
ret = timer_allocate();
ret->pt_wdog = wdog;
信号实现
ret->pt_event.sigev_notify = SIGEV_SIGNAL; //设置信号ALARM
ret->pt_event.sigev_signo = SIGALRM;
ret->pt_event.sigev_value.sival_ptr = ret;

启动定时器

启动定时器是通过timer_settime进行启动的
int timer_settime(timer_t timerid, int flags,
FAR const struct itimerspec *value,
FAR struct itimerspec *ovalue)
->
timer->pt_last = delay;
ret = wd_start(timer->pt_wdog, delay, (wdentry_t)timer_timeout,
1, (uint32_t)((wdparm_t)timer));

定时器超时函数

static void timer_timeout(int argc, wdparm_t itimer)

timer_restart(u.timer, itimer);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值