前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zephyr 工作队列(work queue)

zephyr 工作队列(work queue)

原创
作者头像
无限之生
修改2020-07-01 17:45:49
1.2K0
修改2020-07-01 17:45:49
举报
文章被收录于专栏:技术日记技术日记

工作队列(workqueue)

概述

zephyr中的工作队列与Linux的工作队列功能类似,用于实现中断的底半部。

也就是说中断ISR中比较耗时的操作,放到工作队列中去执行。

zephyr中工作队列是基于线程的,简单来说,就是有一个线程一直在等待工作队列的api发来的工作项,当有工作项时(一个待 执行的函数)就处理(把函数调用了),当有多个工作项时就按顺序处理,没有工作项时就休眠。

工作队列线程

工作队列是一个内核对象,用专用的线程以先进先出(FIFO)的方式去处理被提交的工作元项(work item)。

每个被处理的工作项会调用这个工作项指定的函数(通俗来讲,工作项就是一个一个等待调用的函数)。

使用方式类似于Linux的工作队列和Tasklet。

结构体

k_work

k_work_q

子主题 3

API

void k_work_init(struct k_work *work, k_work_handler_t handler)

void k_work_q_start(struct k_work_q *work_q, k_thread_stack_t *stack,size_t stack_size, int prio)

void k_work_submit(struct k_work *work)

void k_work_submit_to_queue(struct k_work_q *work_q, struct k_work *work)

bool k_work_pending(struct k_work *work)

delayed API

void k_delayed_work_init(struct k_delayed_work *work, k_work_handler_t handler)

int k_delayed_work_submit(struct k_delayed_work *work,s32_t delay)

int k_delayed_work_submit_to_queue(struct k_work_q *work_q,struct k_delayed_work *work,s32_t delay)

int k_delayed_work_cancel(struct k_delayed_work *work)

样例:

定义工作队列

代码语言:javascript
复制
#define MY_STACK_SIZE (K_THREAD_SIZEOF + 500)
#define MY_PRIORITY 5

char __noinit __stack my_stack_area[MY_STACK_SIZE];

struct k_work_q my_work_q;

k_work_q_start(&my_work_q, my_stack_area, MY_STACK_SIZE, MY_PRIORITY);

提交工作项

代码语言:javascript
复制
    struct k_work work;
    char name[16]
} my_device;

void my_isr(void *arg)
{
    ...
    if (error detected) {
        k_work_submit(&my_device.work);
    }
    ...
}

void print_error(struct k_work *item)
{
    struct device_info *the_device =
        CONTAINER_OF(item, struct device_info, work);
    printk("Got error on device %s\n", the_device->name);
}

/* initialize name info for a device */
strcpy(my_device.name, "FOO_dev");

/* initialize work item for printing device's error messages */
k_work_init(&my_device.work, print_error);

/* install my_isr() as interrupt handler for the device (not shown) */
...

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 工作队列(workqueue)
    • 概述
      • 工作队列线程
        • 结构体
          • API
            • delayed API
            • 样例:
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档