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()
原子的执行以下步骤:
- 释放最后获取的互斥锁。
- 将当前线程放入条件变量队列中。
其他某个线程在更改所述状态时可以唤醒一个 (或多个) 等待线程,从而通过使用 k_condvar_signal()
或k_condvar_broadcast()
在条件上发出信号来允许它们继续执行,然后执行以下操作:
- 重新获取之前发布的互斥锁。
- 从
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的主要内容,如果未能解决你的问题,请参考以下文章