闫刚 nuttx的work队列实现原理

本文详细介绍了Nuttx实时操作系统中的工作队列机制,包括其实现原理、优缺点及如何添加工作对象到队列中。同时,深入探讨了工作队列的执行流程,为开发者提供了深入了解Nuttx内核调度机制的机会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

资源

nuttx_wqueue.md

工作队列实现

优点:最短时间调度
缺点:工作队列执行完后,需要重新创建.

添加工作对象

static int work_qqueue(FAR struct usr_wqueue_s *wqueue,
                       FAR struct work_s *work, worker_t worker,
                       FAR void *arg, systime_t delay)
 -> dq_addlast((FAR dq_entry_t *)work, &wqueue->q);

工作队列执行进程

void work_process(FAR struct kwork_wqueue_s *wqueue, systime_t period, int wndx)
{

  work = (FAR struct work_s *)wqueue->q.head;
  while (work)

	ctick   = clock_systimer();
	elapsed = ctick - work->qtime;
	if (elapsed >= work->delay)
	{

	//时间到了,就执行这个节点, 执行完后,立即删除这个节点,
			(void)dq_rem((struct dq_entry_s *)work, &wqueue->q);
			work  = (FAR struct work_s *)wqueue->q.head;
			worker(arg); //执行函数

     else /* elapsed < work->delay */
        {
    //找到需要等待最短时间的那个节点。
          elapsed += (ctick - stick);
          if (elapsed > work->delay)
            {
              elapsed = work->delay;
            
          remaining = work->delay - elapsed;
          if (remaining < next)
            {
              next = remaining;
            }
          work = (FAR struct work_s *)work->dq.flink;
      

   //工作队列的对象的时间小于hpwork队列时间,则使用任务调用的时间period: 100ms
  elapsed = clock_systimer() - stick;
  if (elapsed < period && next > 0)
    {
      remaining = period - elapsed;
      next      = MIN(next, remaining);
      wqueue->worker[wndx].busy = false;
      usleep(next * USEC_PER_TICK);
      wqueue->worker[wndx].busy = true;
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值