workqueue
workqueue 提供工作队列机制,支持将工作任务提交到内核全局工作队列异步执行,适用于中断上下文延迟处理和并发任务调度场景。
头文件清单
接口清单
| 接口名称 | 功能简述 |
|---|---|
| osal_workqueue_init | 初始化工作队列,绑定回调处理函数 |
| osal_workqueue_schedule | 将工作任务提交到全局工作队列 |
| osal_workqueue_destroy | 销毁工作队列,释放关联资源 |
| osal_workqueue_flush | 等待工作队列最后一次执行完成 |
Functions
osal_workqueue_init
头文件清单
功能说明
- 初始化工作队列结构体,绑定回调处理函数
- 注册工作节点到全局工作队列,使后续可调度执行
- 支持 linux、liteos、freertos 系统
前置条件
- 调用时序约束:当前工作队列未被重复初始化(work->work 须为 NULL)
- 依赖关系:全局工作队列已就绪
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| work | osal_workqueue * | 待初始化的工作队列结构体指针 | 非NULL,且 work->work 为 NULL |
| handler | osal_workqueue_handler | 工作队列回调处理函数指针 | 非NULL,函数签名需匹配 void ()(osal_workqueue workqueue) |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| work | osal_workqueue * | work->work 成员被设置为底层工作结构体指针,由调用方分配内存、函数填充 |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_SUCCESS(0) | 初始化成功 | 参数合法且内存分配成功 |
| OSAL_FAILURE(-1) | 初始化失败 | work 为 NULL 或 work->work 非 NULL 或内存分配失败 |
参考案例
middleware/services/gpu/drv/vau/isr/vau_isr.c
osal_workqueue_schedule
头文件清单
功能说明
- 将工作任务提交到内核全局工作队列执行
- 若工作未被排队则加入队列,若已在队列中则保持原位置不重复入队
- 回调函数将在全局工作队列的工作线程上下文中异步执行
- 支持 linux、liteos、freertos 系统
前置条件
- 调用时序约束:work 已通过 osal_workqueue_init() 成功初始化
- 依赖关系:全局工作队列已就绪
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| work | osal_workqueue * | 待调度的工作队列结构体指针 | 非NULL,且 work->work 非 NULL |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| TRUE(1) | 调度成功 | 工作成功加入全局工作队列 |
| FALSE(0) | 调度失败 | work 为 NULL 或 work->work 为 NULL 或底层 schedule_work 返回失败 |
参考案例
middleware/services/gpu/drv/vau/isr/vau_isr.c
osal_workqueue_destroy
头文件清单
功能说明
- 销毁工作队列,释放关联资源
- 销毁后工作队列不可再用于调度
- 支持 linux、liteos、freertos 系统
前置条件
- 调用时序约束:work 已通过 osal_workqueue_init() 成功初始化
- 依赖关系:全局工作队列已就绪
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| work | osal_workqueue * | 待销毁的工作队列结构体指针 | 非NULL,且 work->work 非 NULL |
参考案例
middleware/services/gpu/drv/vau/isr/vau_isr.c
osal_workqueue_flush
头文件清单
功能说明
- 等待工作队列最后一次排队实例执行完成
- 调用后阻塞等待直到当前工作执行完毕,若 flush 开始后未重新入队则返回时保证工作处于空闲状态
- 支持 linux、liteos 系统
前置条件
- 调用时序约束:work 已通过 osal_workqueue_init() 成功初始化
- 依赖关系:全局工作队列已就绪
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| work | osal_workqueue * | 待刷新的工作队列结构体指针 | 非NULL,且 work->work 非 NULL |
返回值
- 返回类型:int
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| TRUE(1) | 刷新成功 | 工作已执行完成 |
| FALSE(0) | 刷新失败 | work 为 NULL 或 work->work 为 NULL 或底层 flush_work 返回失败 |
Type definitions
osal_workqueue_handler
使用说明
作为 osal_workqueue_init() 的 handler 参数类型,指定工作队列回调处理函数签名。回调在工作被调度执行时,由全局工作队列的工作线程上下文调用。
Structures
osal_workqueue
typedef struct osal_workqueue_ {
int queue_flag;
void *work;
void (*handler)(struct osal_workqueue_ *workqueue);
} osal_workqueue;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| queue_flag | int | 工作队列标志位 |
| work | void * | 底层工作结构体指针,由 osal_workqueue_init() 分配 |
| handler | void ()(struct osal_workqueue_ workqueue) | 工作队列回调处理函数指针 |