RT-Thread学习笔记 —— 信号量

信号量控制块

1
2
3
4
5
6
struct rt_semaphore
{
struct rt_ipc_object parent;
rt_unit16_t value;
};
typedef struct rt_semaphore* rt_sem_t;

信号量的管理方式

信号量的相关接口如下:
rt_sem_create 创建信号量
rt_sem_delete 删除信号量
rt_sem_init 初始化信号量
rt_sem_detach 脱离信号量
rt_sem_take/trytake 获取信号量
rt_sem_release 释放信号量

创建信号量

1
2
3
4
5
6
7
8
rt_sem_t rt_sem_create(const char *name,           //信号量名称
rt_uint32_t vaule, //信号量初始值
rt_uint8_t flag); //信号量标志

-> 成功返回信号量控制块指针,失败返回RT_NULL
-> flag可取值如下:
RT_IPC_FLAG_FIFO(先进先出)
RT_IPC_FLAG_PRIO(优先级等待)

删除信号量

1
2
3
rt_err_t rt_sem_delete(rt_sem_t sem);               //信号量对象

-> 成功返回RT_EOK

初始化信号量

1
2
3
4
5
6
rt_err_t rt_sem_init(rt_sem_t sem,              //信号量对象句柄
const char *name, //信号量名称
rt_uint32_t vaule, //信号量初始值
rt_uint8_t flag); //信号量标志

-> 成功返回RT_EOK

脱离信号量

1
rt_err_t rt_sem_detach(rt_sem_t sem);

获取信号量

1
2
3
4
5
6
rt_err_t rt_sem_take(rt_sem_t sem,              //信号量对象句柄
rt_uint32_t time); //等待时间

-> 成功返回RT_EOK,超时返回-RT_ETIMEOUT,其他错误返回-RT_ERROR

rt_err_t rt_sem_trytake(rt_sem_t sem); //无等待获取信号量

释放信号量

1
2
3
rt_err_t rt_sem_release(rt_sem_t sem);

-> 成功返回RT_EOK