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