$darkmode
RuiChing API 参考手册
V0.9.1

提供基于计数器的线程同步机制 更多...

结构体

struct  rt_semaphore
 信号量结构体 更多...
 

类型定义

typedef struct rt_semaphorert_sem_t
 信号量类型指针定义
 

函数

rt_err_t rt_sem_init (rt_sem_t sem, const char *name, rt_uint32_t value, rt_uint8_t flag)
 初始化静态信号量 更多...
 
rt_err_t rt_sem_detach (rt_sem_t sem)
 脱离静态信号量 更多...
 
rt_sem_t rt_sem_create (const char *name, rt_uint32_t value, rt_uint8_t flag)
 创建动态信号量 更多...
 
rt_err_t rt_sem_delete (rt_sem_t sem)
 删除动态信号量对象 更多...
 
rt_err_t rt_sem_take (rt_sem_t sem, rt_int32_t timeout)
 获取信号量 更多...
 
rt_err_t rt_sem_trytake (rt_sem_t sem)
 尝试立即获取信号量 更多...
 
rt_err_t rt_sem_release (rt_sem_t sem)
 释放信号量 更多...
 
rt_err_t rt_sem_control (rt_sem_t sem, int cmd, void *arg)
 控制信号量属性或行为 更多...
 

详细描述

提供基于计数器的线程同步机制

RT-Thread 信号量具有以下特性:

典型应用场景:

函数说明

◆ rt_sem_init()

rt_err_t rt_sem_init ( rt_sem_t  sem,
const char *  name,
rt_uint32_t  value,
rt_uint8_t  flag 
)

初始化静态信号量

初始化用户提供的静态信号量对象

参数
[in]sem静态信号量对象
[in]name信号量名称
[in]value初始信号量值
[in]flag等待标志位
标志位 含义
RT_IPC_FLAG_FIFO 先进先出方式等待
RT_IPC_FLAG_PRIO 按线程优先级等待(高优先级先获取)
返回值
RT_EOK成功
!RT_EOK失败
注解
  • 信号量名称的最大长度由 rtconfig.h 中定义的 RT_NAME_MAX 宏指定, 多余部分会被自动截掉

◆ rt_sem_detach()

rt_err_t rt_sem_detach ( rt_sem_t  sem)

脱离静态信号量

从内核对象管理中移除静态信号量对象

参数
[in]sem静态信号量对象
返回值
RT_EOK成功
!RT_EOK失败
警告
  • 需要脱离静态信号量必须是由 rt_sem_init() 初始化

◆ rt_sem_create()

rt_sem_t rt_sem_create ( const char *  name,
rt_uint32_t  value,
rt_uint8_t  flag 
)

创建动态信号量

创建动态信号量,内核会自动分配内存空间

参数
[in]name信号量名称
[in]value初始值
[in]flag等待标志位
标志位 含义
RT_IPC_FLAG_FIFO 先进先出方式等待
RT_IPC_FLAG_PRIO 按线程优先级等待(高优先级先获取)
返回值
!RT_NULL成功
RT_NULL失败
注解
  • 信号量名称的最大长度由 rtconfig.h 中定义的 RT_NAME_MAX 宏指定, 多余部分会被自动截掉

◆ rt_sem_delete()

rt_err_t rt_sem_delete ( rt_sem_t  sem)

删除动态信号量对象

删除创建的信号量,释放其占用的内存资源

参数
[in]sem信号量对象指针
返回值
RT_EOK成功
!RT_EOK失败
警告

◆ rt_sem_take()

rt_err_t rt_sem_take ( rt_sem_t  sem,
rt_int32_t  timeout 
)

获取信号量

尝试从信号量获取一个资源,若资源不可用,则阻塞指定时间等待

参数
[in]sem信号量对象指针
[in]timeout超时时间
标志位 含义
RT_WAITING_FOREVER 永久等待
RT_WAITING_NO 不等待立即返回
其他数值 timeout * 系统 tick 超时时间
返回值
RT_EOK成功获取信号量
-RT_ETIMEOUT超时

◆ rt_sem_trytake()

rt_err_t rt_sem_trytake ( rt_sem_t  sem)

尝试立即获取信号量

若信号量资源可用则立即获取,等效于 rt_sem_take(..., RT_WAITING_NO)

参数
[in]sem信号量对象指针
返回值
RT_EOK成功获取信号量
!RT_EOK失败

◆ rt_sem_release()

rt_err_t rt_sem_release ( rt_sem_t  sem)

释放信号量

向信号量添加一个资源计数器,可能会唤醒正在等待的线程

参数
[in]sem信号量对象指针
返回值
RT_EOK成功
!RT_EOK失败
注解

◆ rt_sem_control()

rt_err_t rt_sem_control ( rt_sem_t  sem,
int  cmd,
void *  arg 
)

控制信号量属性或行为

对信号量对象执行特定控制命令

参数
[in]sem信号量对象指针
[in]cmd控制命令
[in]arg命令参数指针
返回值
RT_EOK成功
!RT_EOK失败