信号量(semaphore)
概述
信号量(semaphore)是一个内核对象,用于实现传统的计数信号量
信号量必须先初始化再使用,计数值必须为非负数
线程和ISR都可以释放(give)信号量,其计数值会增加(除非到达上限)
线程可以获取(take)信号量,其计数值会递减
当信号量不可用时,线程可以等待,直到获取到信号量
多个线程可以等待某个信号量,当信号量可用时,由优先级最高、等待时间最长的线程获取
实现
定义信号量
动态定义
struct k_sem my_sem;
k_sem_init
(&my_sem, 0, 1);
静态定义
K_SEM_DEFINE
(my_sem)
释放信号量
代码语言:javascript复制 void k_sem_give(struct k_sem *sem);
获取信号量
代码语言:javascript复制 int k_sem_take(struct k_sem *sem, s32_t timeout);
样例
代码语言:javascript复制void input_data_interrupt_handler(void *arg)
{
/* notify thread that data is available */
k_sem_give(&my_sem);
...
}
void consumer_thread(void)
{
...
if (k_sem_take(&my_sem, K_MSEC(50)) != 0) {
printk("Input data not available!");
} else {
/* fetch available data */
...
}
...
}
建议的用法
使用信号量控制对多个线程共有的资源的访问。
使用信号量在线程或 ISR 的生产者和消费者之间同步。