tobudos-kernel/osal/cosit/documentation/work_queue.md

201 lines
7.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 工作队列
工作队列workqueue是一种转移任务执行环境的工具例如当系统产生一个中断时我们可以在中断处理函数里做一些紧急地操作然后将另外一些不那么紧急而且需要一定时间的任务封装成函数交给工作队列执行此时该函数的执行环境就从 中断环境 变成了 线程环境,即中断处理 “下半部”。
## 类型
```C
typedef struct cos_workqueue* cos_wq_t;
```
工作队列控制块工作队列控制块是操作系统用于管理工作队列的一个数据结构由结构体cos_workqueue表示cos_wq_t是工作队列的句柄工作队列结构体主要保存了当前系统工作队列的相关信息如:当前工作项,工作队列的链表,工作队列所使用的线程等。
```C
typedef struct cos_work* cos_work_t;
```
工作项控制块,工作项控制块用于管理该任务,保存了该任务相关的信息,如:任务函数,用户数据等,当该工作项被执行时就会调用该任务函数。
```C
typedef void cos_work_handle_t(void *arg);
```
工作项控制块,工作项控制块用于管理该任务,保存了该任务相关的信息,如:任务函数,用户数据等,当该工作项被执行时就会调用该任务函数。
## 函数
### cos_work_init
初始化工作项
原型
```C
#include <cos_wq.h>
cos_status_t cos_work_init(cos_work_t work, cos_work_handle_t work_func, void *work_data);
```
**描述**
该接口初始化 work 指针指向的工作项,并绑定回调函数 work_func 以及用户自定义数据 work_data。
**参数**
| 参数名称 | 参数类型 | 参数方向 | 描述 |
| ----------- | ----------- | ------------------ | ------------------ |
| work | cos_work_t | 入参 | 工作项 |
| work_func | cos_work_handle_t | 入参 | 工作项的回调函数 |
| work_data | size_t | 入参 | 用户自定义数据,回调函数参数 |
**返回值**
函数执行成功返回cos_OK失败则返回错误码均为负值
| 参数名称 | 描述 |
| ----------- | ------------------ |
| cos_ERROR_PARAM | 非法参数 |
### cos_work_dowork
触发work
原型
```C
#include <cos_wq.h>
cos_status_t cos_work_dowork(cos_work_t work, cos_tick_t time);
```
**描述**
work触发函数由系统默认工作队列来执行。若 time 大于 0则提交过程会延时 time 个 ticks 。
**参数**
| 参数名称 | 参数类型 | 参数方向 | 描述 |
| ----------- | ----------- | ------------------ | ------------------ |
| work | cos_work_t | 入参 | 工作项 |
| time | cos_tick_t | 入参 | 提交延时,以 tick 为单位 |
**返回值**
函数执行成功返回cos_OK失败则返回错误码均为负值
| 参数名称 | 描述 |
| ----------- | ------------------ |
| cos_ERROR_PARAM | 非法参数 |
### cos_work_submit
向 queue 提交work
原型
```C
#include <cos_wq.h>
cos_status_t cos_work_submit(cos_wq_t wq, cos_work_t work, cos_tick_t time);
```
**描述**
将 work 指向的工作项提交到 queue 指向的工作队列中,若 time 大于 0则该提交延时 time 个 tick 之后执行。
**参数**
| 参数名称 | 参数类型 | 参数方向 | 描述 |
| ----------- | ----------- | ------------------ | ------------------ |
| wq | cos_wq_t | 入参 | 工作队列 |
| work | cos_work_t | 入参 | 工作项 |
| time | cos_tick_t | 入参 | 提交延时,以 tick 为单位 |
**返回值**
函数执行成功返回cos_OK失败则返回错误码均为负值
| 参数名称 | 描述 |
| ----------- | ------------------ |
| cos_ERROR_PARAM | 非法参数 |
### cos_work_cancel
取消指定工作项
原型
```C
#include <cos_wq.h>
cos_status_t cos_work_cancel(cos_wq_t queue, cos_work_t work);
```
**描述**
从 queue 指向的工作队列中将 work 指向的工作项移除。
**参数**
| 参数名称 | 参数类型 | 参数方向 | 描述 |
| ----------- | ----------- | ------------------ | ------------------ |
| queue | cos_wq_t | 入参 | 工作队列 |
| work | cos_work_t | 入参 | 工作项 |
**返回值**
函数执行成功返回cos_OK失败则返回错误码均为负值
| 参数名称 | 描述 |
| ----------- | ------------------ |
| cos_ERROR_PARAM | 非法参数 |
| cos_ERROR_BUSY | 该工作项正在执行 |
### cos_workqueue_create
工作队列创建函数
原型
```C
#include <cos_wq.h>
cos_status_t cos_workqueue_create(cos_wq_t* wq, const char *name uint16_t stack_size, uint8_t priority);
```
**描述**
该函数创建并初始化一个工作队列,利用参数 namestack_size 和 priority 创建工作队列内部线程,最终返回创建的工作队列。下表描述了该函数的输入参数与返回值
**参数**
| 参数名称 | 参数类型 | 参数方向 | 描述 |
| ----------- | ----------- | ------------------ | ------------------ |
| wq | cos_wq_t | 出参 | 工作队列控制块 |
| name | const char * | 入参 | 线程名字 |
| stack_size | uint16_t | 入参 | 线程栈大小 |
| priority | uint8_t | 入参 | 线程优先级 |
**返回值**
函数执行成功返回cos_OK失败则返回错误码均为负值
| 参数名称 | 描述 |
| ----------- | ------------------ |
| cos_ERROR_PARAM | 非法参数 |
### cos_workqueue_destroy
工作队列销毁函数
原型
```C
#include <cos_wq.h>
cos_status_t cos_workqueue_destroy(cos_wq_t wq);
```
**描述**
销毁指定工作队列
**参数**
| 参数名称 | 参数类型 | 参数方向 | 描述 |
| ----------- | ----------- | ------------------ | ------------------ |
| wq | cos_wq_t | 入参 | 工作队列控制块 |
**返回值**
函数执行成功返回cos_OK失败则返回错误码均为负值
| 参数名称 | 描述 |
| ----------- | ------------------ |
| cos_ERROR_PARAM | 非法参数 |