跳转至

wait

wait 提供等待队列的初始化、条件等待、超时等待、唤醒与销毁功能,用于线程间的同步与事件通知。

头文件清单

#include "include/osal/schedule/osal_wait.h"

接口清单

接口名称 功能简述
osal_wait_init 初始化等待队列
osal_wait_interruptible 可中断方式等待条件为真
osal_wait_uninterruptible 不可中断方式等待条件为真
osal_wait_timeout_interruptible 可中断方式等待条件为真或超时
osal_wait_timeout_uninterruptible 不可中断方式等待条件为真或超时
osal_wait_wakeup 唤醒等待队列上的所有线程
osal_wait_wakeup_interruptible 唤醒等待队列上的可中断线程
osal_wait_destroy 销毁等待队列

Functions

osal_wait_init

int osal_wait_init(osal_wait *wait)

头文件清单

#include "include/osal/schedule/osal_wait.h"

功能说明

  • 初始化等待队列,为等待队列分配内部资源
  • 初始化后等待队列可被用于后续的等待/唤醒操作
  • 支持系统:linux liteos freertos

前置条件

  • 调用时序约束:无前置接口调用要求,可在任何需要等待队列的时刻调用
  • 依赖关系:调用者需确保 wait 对象的内存空间已有效分配

出参

名称 数据类型 输出说明
wait osal_wait * 待初始化的等待队列指针,由调用方分配内存,函数填充内部实现指针

返回值

  • 返回类型:int
返回值 文字含义 触发场景
OSAL_SUCCESS(0) 初始化成功 等待队列资源分配成功
OSAL_FAILURE(-1) 初始化失败 参数无效或内存分配失败

参考案例

osal_wait_interruptible

int osal_wait_interruptible(osal_wait *wait, osal_wait_condition_func func, const void *param)

头文件清单

#include "include/osal/schedule/osal_wait.h"

功能说明

  • 将当前线程置于可中断睡眠状态(TASK_INTERRUPTIBLE),等待条件函数返回真或收到信号
  • 每次等待队列被唤醒时重新检查条件函数的返回值
  • LiteOS 不支持可中断等待,该接口与 osal_wait_uninterruptible 行为一致
  • 支持系统:linux liteos

前置条件

  • 调用时序约束:wait 已通过 osal_wait_init() 初始化成功(wait->wait 不为 NULL)
  • 依赖关系:修改等待条件后,需调用 osal_wait_wakeup() 或 osal_wait_wakeup_interruptible() 唤醒等待队列

入参

名称 参数类型 详细说明 约束取值范围
wait osal_wait * 等待队列指针 非 NULL,且已通过 osal_wait_init 初始化
func osal_wait_condition_func 条件判断函数指针 非 NULL;返回值为 bool 类型,非零表示条件为真
param const void * 传递给条件函数的参数 由条件函数定义决定

返回值

  • 返回类型:int
返回值 文字含义 触发场景
OSAL_SUCCESS(0) 条件为真,等待结束 条件函数返回非零值
OSAL_FAILURE(-1) 等待失败 参数无效(wait 为 NULL 或 wait->wait 为 NULL)
-ERESTARTSYS 被信号中断 Linux 下收到信号(LiteOS 下不会返回此值)

参考案例

osal_wait_uninterruptible

int osal_wait_uninterruptible(osal_wait *wait, osal_wait_condition_func func, const void *param)

头文件清单

#include "include/osal/schedule/osal_wait.h"

功能说明

  • 将当前线程置于不可中断睡眠状态(TASK_UNINTERRUPTIBLE),等待条件函数返回真
  • 每次等待队列被唤醒时重新检查条件函数的返回值
  • 支持系统:linux liteos freertos

前置条件

  • 调用时序约束:wait 已通过 osal_wait_init() 初始化成功(wait->wait 不为 NULL)
  • 依赖关系:修改等待条件后,需调用 osal_wait_wakeup() 唤醒等待队列

入参

名称 参数类型 详细说明 约束取值范围
wait osal_wait * 等待队列指针 非 NULL,且已通过 osal_wait_init 初始化
func osal_wait_condition_func 条件判断函数指针 非 NULL;返回值为 bool 类型,非零表示条件为真
param const void * 传递给条件函数的参数 由条件函数定义决定

返回值

  • 返回类型:int
返回值 文字含义 触发场景
OSAL_SUCCESS(0) 条件为真,等待结束 条件函数返回非零值
OSAL_FAILURE(-1) 等待失败 参数无效(wait 为 NULL 或 wait->wait 为 NULL)

参考案例

osal_wait_timeout_interruptible

int osal_wait_timeout_interruptible(osal_wait *wait, osal_wait_condition_func func, const void *param, unsigned long ms)

头文件清单

#include "include/osal/schedule/osal_wait.h"

功能说明

  • 将当前线程置于可中断睡眠状态,等待条件函数返回真或超时
  • 每次等待队列被唤醒时重新检查条件函数的返回值
  • 超时时间到达后,无论条件是否为真均返回
  • 支持系统:linux liteos freertos

前置条件

  • 调用时序约束:wait 已通过 osal_wait_init() 初始化成功(wait->wait 不为 NULL)
  • 依赖关系:修改等待条件后,需调用 osal_wait_wakeup() 唤醒等待队列

入参

名称 参数类型 详细说明 约束取值范围
wait osal_wait * 等待队列指针 非 NULL,且已通过 osal_wait_init 初始化
func osal_wait_condition_func 条件判断函数指针 非 NULL;返回值为 bool 类型,非零表示条件为真
param const void * 传递给条件函数的参数 由条件函数定义决定
ms unsigned long 超时时间,单位为毫秒 不超过 int 取值范围;OSAL_WAIT_FOREVER(0xFFFFFFFF) 表示永久等待

返回值

  • 返回类型:int
返回值 文字含义 触发场景
OSAL_SUCCESS(0) 条件为真 条件在超时前为真
OSAL_FAILURE(-1) 等待失败 参数无效(wait 为 NULL 或 wait->wait 为 NULL)
1 条件为真 条件在超时前为真(LiteOS 实现)
0 超时且条件为假 超时后条件仍为假
>1(剩余ticks) 条件为真 条件在超时前为真,返回剩余等待时间

参考案例

osal_wait_timeout_uninterruptible

int osal_wait_timeout_uninterruptible(osal_wait *wait, osal_wait_condition_func func, const void *param, unsigned long ms)

头文件清单

#include "include/osal/schedule/osal_wait.h"

功能说明

  • 将当前线程置于不可中断睡眠状态,等待条件函数返回真或超时
  • 每次等待队列被唤醒时重新检查条件函数的返回值
  • LiteOS 实现与 osal_wait_timeout_interruptible 行为一致
  • 支持系统:linux liteos

前置条件

  • 调用时序约束:wait 已通过 osal_wait_init() 初始化成功(wait->wait 不为 NULL)
  • 依赖关系:修改等待条件后,需调用 osal_wait_wakeup() 唤醒等待队列

入参

名称 参数类型 详细说明 约束取值范围
wait osal_wait * 等待队列指针 非 NULL,且已通过 osal_wait_init 初始化
func osal_wait_condition_func 条件判断函数指针 非 NULL;返回值为 bool 类型,非零表示条件为真
param const void * 传递给条件函数的参数 由条件函数定义决定
ms unsigned long 超时时间,单位为毫秒 不超过 int 取值范围;OSAL_WAIT_FOREVER(0xFFFFFFFF) 表示永久等待

返回值

  • 返回类型:int
返回值 文字含义 触发场景
OSAL_SUCCESS(0) 条件为真 条件在超时前为真
OSAL_FAILURE(-1) 等待失败 参数无效(wait 为 NULL 或 wait->wait 为 NULL)
1 条件为真 条件在超时前为真(LiteOS 实现)
0 超时且条件为假 超时后条件仍为假
>1(剩余ticks) 条件为真 条件在超时前为真,返回剩余等待时间

参考案例

osal_wait_wakeup

void osal_wait_wakeup(osal_wait *wait)

头文件清单

#include "include/osal/schedule/osal_wait.h"

功能说明

  • 唤醒等待队列上的所有线程,与 wait_event 配对使用
  • 唤醒后等待线程将重新检查条件函数
  • 支持系统:linux liteos freertos

前置条件

  • 调用时序约束:wait 已通过 osal_wait_init() 初始化成功(wait->wait 不为 NULL)
  • 依赖关系:当前接口依赖等待队列上已有线程处于等待状态

入参

名称 参数类型 详细说明 约束取值范围
wait osal_wait * 待唤醒的等待队列指针 非 NULL,且已通过 osal_wait_init 初始化

参考案例

osal_wait_wakeup_interruptible

void osal_wait_wakeup_interruptible(osal_wait *wait)

头文件清单

#include "include/osal/schedule/osal_wait.h"

功能说明

  • 唤醒等待队列上的可中断线程,与 wait_event_interruptible 配对使用
  • LiteOS 实现与 osal_wait_wakeup 行为一致
  • 支持系统:linux liteos

前置条件

  • 调用时序约束:wait 已通过 osal_wait_init() 初始化成功(wait->wait 不为 NULL)
  • 依赖关系:当前接口依赖等待队列上已有线程处于可中断等待状态

入参

名称 参数类型 详细说明 约束取值范围
wait osal_wait * 待唤醒的等待队列指针 非 NULL,且已通过 osal_wait_init 初始化

参考案例

osal_wait_destroy

void osal_wait_destroy(osal_wait *wait)

头文件清单

#include "include/osal/schedule/osal_wait.h"

功能说明

  • 销毁等待队列,释放内部资源
  • 该接口可能释放内存,wait 应由 osal_wait_init 初始化
  • 支持系统:linux liteos freertos

前置条件

  • 调用时序约束:wait 已通过 osal_wait_init() 初始化成功(wait->wait 不为 NULL)
  • 依赖关系:销毁前确保无线程正在该等待队列上等待

入参

名称 参数类型 详细说明 约束取值范围
wait osal_wait * 待销毁的等待队列指针 非 NULL,且已通过 osal_wait_init 初始化

参考案例

Type definitions

osal_wait_condition_func

typedef int (*osal_wait_condition_func)(const void *param);

使用说明

  • 用于 osal_wait_interruptible、osal_wait_uninterruptible、osal_wait_timeout_interruptible、osal_wait_timeout_uninterruptible 接口的条件判断回调函数参数类型
  • 调用时机:等待队列被唤醒时调用,返回值决定是否结束等待(非零表示条件为真,结束等待;零表示条件为假,继续等待)
  • 参数 param:由等待接口的 param 参数透传传入
  • 返回值处理:返回值作为条件判断结果,非零表示条件为真

Structures

osal_wait

typedef struct {
    void *wait;
} osal_wait;

成员说明

成员名称 数据类型 描述
wait void * 等待队列内部实现指针,由 osal_wait_init 初始化赋值

Macros

OSAL_WAIT_FOREVER

#define OSAL_WAIT_FOREVER 0xFFFFFFFF

OSAL_WAIT_CONDITION_TRUE

#define OSAL_WAIT_CONDITION_TRUE 1