Zephyr RTOS -- Condition Variables

Posted 搬砖-工人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zephyr RTOS -- Condition Variables相关的知识,希望对你有一定的参考价值。

文章目录

本笔记基于 Zephyr 版本 2.6.0-rc2

 

前言

本人正在学习 Zephyr,一个可移植性较强,可以兼容多种开发板及物联网设备的操作系统,如果你感兴趣,可以点此查看我的 学习笔记总述 进行了解!

 

Condition Variables - (条件变量)

条件变量是一种同步原语,它使线程能够等待特定条件发生。

 

1. Concepts - (概念)

可以定义任意数量的条件变量 (仅受可用 RAM 限制)。每个条件变量都由其内存地址引用。

为了等待条件变为真,线程可以使用条件变量。

条件变量基本上是一个线程队列,当某些执行状态(即某些条件)不理想(通过等待条件)时,线程可以把自己放在该队列上。函数 k_condvar_wait() 原子的执行以下步骤:

  1. 释放最后获取的互斥锁。
  2. 将当前线程放入条件变量队列中。

其他某个线程在更改所述状态时可以唤醒一个 (或多个) 等待线程,从而通过使用 k_condvar_signal()k_condvar_broadcast() 在条件上发出信号来允许它们继续执行,然后执行以下操作:

  1. 重新获取之前发布的互斥锁。
  2. k_condvar_wait() 返回。

条件变量必须在使用前进行初始化。

 

2. Implementation - (实现)

2.1 Defining a Condition Variable - (定义条件变量)

条件变量是使用 k_condvar 的类型变量定义的。然后必须通过调用 k_condvar_init() 来初始化它。

下面的代码定义了一个条件变量:

struct k_condvar my_condvar;

k_condvar_init(&my_condvar);

或者,可以在编译时通过调用 K_CONDVAR_DEFINE 来定义和初始化条件变量。

下面的代码和上面的代码段效果一样。

K_CONDVAR_DEFINE(my_condvar);

 

2.2 Waiting on a Condition Variable - (等待条件变量)

线程可以通过调用 k_condvar_wait() 来等待条件。

以下代码等待条件变量:

K_MUTEX_DEFINE(mutex);
K_CONDVAR_DEFINE(condvar)

void main(void)

    k_mutex_lock(&mutex, K_FOREVER);

    /* block this thread until another thread signals cond. While
     * blocked, the mutex is released, then re-acquired before this
     * thread is woken up and the call returns.
     */
    k_condvar_wait(&condvar, &mutex, K_FOREVER);
    ...
    k_mutex_unlock(&mutex);

 

2.3 Signaling a Condition Variable - (发送条件变量)

条件变量通过对一个线程调用 k_condvar_signal() 或对多个线程调用 k_condvar_broadcast() 来发出信号。

下面的代码建立在上面的例子之上。

void worker_thread(void)

    k_mutex_lock(&mutex, K_FOREVER);

    /*
     * Do some work and fullfill the condition
     */
    ...
    ...
    k_condvar_signal(&condvar);
    k_mutex_unlock(&mutex);

 

3. Suggested Uses - (建议用途)

使用带有互斥锁的条件变量来表示从一个线程到另一个线程的状态 (条件) 变化。 条件变量不是条件本身,也不是事件。 该条件包含在周围的编程逻辑中。

互斥体本身并不是为用作通知/同步机制而设计的。 它们旨在仅提供对共享资源的互斥访问。

 

4. Configuration Options - (配置选项)

相关配置选项:

  • None

 

参考链接

https://docs.zephyrproject.org/latest/reference/kernel/synchronization/condvar.html

以上是关于Zephyr RTOS -- Condition Variables的主要内容,如果未能解决你的问题,请参考以下文章

Zephyr RTOS -- Stacks

Zephyr RTOS -- Stacks

Zephyr RTOS -- Stacks

Zephyr RTOS -- Polling API

Zephyr RTOS -- Polling API

Zephyr RTOS -- Message Queues