文章目录
本笔记基于 Zephyr 版本 2.6.0-rc2
前言
本人正在学习 Zephyr,一个可移植性较强,可以兼容多种开发板及物联网设备的操作系统,如果你感兴趣,可以点此查看我的 学习笔记总述 进行了解!
Polling API - (轮询 API)
轮询 API 用于并发地等待多个条件中的任何一个被满足。
1. Concepts - (概念)
轮询 API 的主要函数是 k_poll()
,它在概念上与 POSIX poll()
函数非常相似,不同之处在于它是对内核对象操作,而不是文件描述符进行操作。
轮询 API 允许单个线程并发地等待一个或多个条件被满足,而不需要单独地主动查看每个条件。
这里有一组有限的条件:
- 信号量可用
- 内核 FIFO 包含准备检索的数据
- 一个轮询信号被发出
想要等待多个条件的线程必须定义一个 轮询事件(poll events) 数组, 每个条件一个。
必须先初始化数组中的所有事件,然后才能轮询数组。
每个事件必须指定必须满足哪种 类型(type) 的条件,以便将其状态更改为表示已满足所请求的条件。
每个事件必须指定它希望满足条件的 内核对象(kernel object)。
每个事件必须指定在满足条件时使用哪种操作 模式(mode)。
每个事件可以选择指定一个 标记(tag) 来将多个事件组合在一起,这是由用户决定的。
除了内核对象之外,还有一个 轮询信号(poll signal) 伪对象类型可以直接发出信号。
k_poll()
函数一旦满足它所等待的条件之一就返回。如果在调用 k_poll()
之前完成,或者由于内核的优先多线程特性,在 k_poll()
返回时可能会有多个完成。调用者必须查看数组中所有轮询事件的状态,以确定完成了哪些事件以及采取哪些操作。
目前,只有一种操作模式可用:不获取对象。例如,这意味着当 k_poll()
返回并且 poll 事件表明信号量可用时, k_poll()
的调用者必须调用