前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zephyr同步机制之信号量(semaphore)

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

原创
作者头像
无限之生
修改2020-07-01 17:45:57
1.1K0
修改2020-07-01 17:45:57
举报
文章被收录于专栏:技术日记技术日记

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 信号量(semaphore)
    • 概述
      • 实现
        • 定义信号量
        • 释放信号量
        • 获取信号量
      • 样例
        • 建议的用法
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档