RT-Thread API参考手册  3.1.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 time)
 获取信号量 更多...
 
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_init ( rt_sem_t  sem,
const char *  name,
rt_uint32_t  value,
rt_uint8_t  flag 
)

初始化信号量

该函数将初始化信号量并将其置于内核管理器的控制之下。

参数
sem指定的信号量对象句柄
name信号量的名称
value信号量初始化时的值
flag信号量的标志位
返回
RT_EOK
示例:
producer_consumer.c , 以及 uart_sample.c.
rt_err_t rt_sem_detach ( rt_sem_t  sem)

脱离信号量

该函数将把指定的静态信号量从内核对象管理器中移除。

参数
sem指定的信号量对象
返回
脱离成功返回 RT_EOK
参见
rt_sem_delete
rt_sem_t rt_sem_create ( const char *  name,
rt_uint32_t  value,
rt_uint8_t  flag 
)

创建信号量

调用该函数时,系统将先从对象管理器中分配一个semaphore对象,并初始化这个对象, 然后初始化 IPC 对象以及与 semaphore 相关的部分。。

参数
name信号量的名称
value信号量初始化时的值
flag信号量的标志位
返回
返回创建的信号量控制块, 当错误时返回 RT_NULL
参见
rt_sem_init
示例:
semaphore_sample.c.
rt_err_t rt_sem_delete ( rt_sem_t  sem)

删除信号量

系统不再使用信号量时,可通过删除信号量以释放系统资源,适用于动态创建的信号量。 调用该函数将删除一个信号量对象,并释放其占用的内存空间。

参数
sem信号量对象句柄
返回
RT_EOK删除成功
参见
rt_sem_detach
示例:
semaphore_sample.c.
rt_err_t rt_sem_take ( rt_sem_t  sem,
rt_int32_t  time 
)

获取信号量

线程通过调用该函数获取信号量来获得信号量资源实例,当信号量值大于零时,线程将获得信号量, 并且相应的信号量值会减 1;如果信号量的值等于零,那么说明当前信号量资源实例不可用,申请 该信号量的线程将根据 time 参数的情况选择直接返回、或挂起等待一段时间、或永久等待,直到 其他线程或中断释放该信号量。

参数
sem信号量对象的句柄
time指定的等待时间,单位是操作系统时钟节拍(OS Tick)
返回
RT_EOK 成功获得信号量;-RT_ETIMEOUT 超时依然未获得信号量;-RT_ERROR 其他错误
示例:
producer_consumer.c, semaphore_sample.c , 以及 uart_sample.c.
rt_err_t rt_sem_trytake ( rt_sem_t  sem)

无等待获取信号量

当用户不想在申请的信号量上挂起线程进行等待时,可以调用该函数以无等待方式获取信号量。

参数
sem信号量对象的句柄
返回
RT_EOK 成功获得信号量;-RT_ETIMEOUT 获取失败
rt_err_t rt_sem_release ( rt_sem_t  sem)

释放信号量

该函数将释放一个信号量,当信号量的值等于零时,并且有线程等待这个信号量时, 释放信号量将唤醒等待在该信号量线程队列中的第一个线程,由它获取信号量;否则 将把信号量的值加一。

参数
sem信号量对象的句柄
返回
RT_EOK 成功释放信号量
示例:
producer_consumer.c, semaphore_sample.c , 以及 uart_sample.c.