RT-Thread API参考手册
3.1.1
嵌入式实时操作系统
|
信号量接口 更多...
结构体 | |
struct | rt_semaphore |
信号量控制块 更多... | |
类型定义 | |
typedef struct rt_semaphore * | rt_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_sem_t rt_sem_create | ( | const char * | name, |
rt_uint32_t | value, | ||
rt_uint8_t | flag | ||
) |
创建信号量
调用该函数时,系统将先从对象管理器中分配一个semaphore对象,并初始化这个对象, 然后初始化 IPC 对象以及与 semaphore 相关的部分。。
name | 信号量的名称 |
value | 信号量初始化时的值 |
flag | 信号量的标志位 |
删除信号量
系统不再使用信号量时,可通过删除信号量以释放系统资源,适用于动态创建的信号量。 调用该函数将删除一个信号量对象,并释放其占用的内存空间。
sem | 信号量对象句柄 |
rt_err_t rt_sem_take | ( | rt_sem_t | sem, |
rt_int32_t | time | ||
) |
获取信号量
线程通过调用该函数获取信号量来获得信号量资源实例,当信号量值大于零时,线程将获得信号量, 并且相应的信号量值会减 1;如果信号量的值等于零,那么说明当前信号量资源实例不可用,申请 该信号量的线程将根据 time 参数的情况选择直接返回、或挂起等待一段时间、或永久等待,直到 其他线程或中断释放该信号量。
sem | 信号量对象的句柄 |
time | 指定的等待时间,单位是操作系统时钟节拍(OS Tick) |
无等待获取信号量
当用户不想在申请的信号量上挂起线程进行等待时,可以调用该函数以无等待方式获取信号量。
sem | 信号量对象的句柄 |
释放信号量
该函数将释放一个信号量,当信号量的值等于零时,并且有线程等待这个信号量时, 释放信号量将唤醒等待在该信号量线程队列中的第一个线程,由它获取信号量;否则 将把信号量的值加一。
sem | 信号量对象的句柄 |