zephyr同步机制之信号量(semaphore)

2020-07-01 17:45:57 浏览数 (1)

信号量(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 的生产者和消费者之间同步。

0 人点赞