05、IIO缓冲区
IIO缓冲区基础知识
IIO缓冲区可以一次性连续采集多个数据通道的信息,用户可以通过/dev/iio:deviceX
设备文件直接读取数据。在触发器程序中,iio_push_to_buffers_with_timestamp
函数负责向缓冲区填充数据,而iio_triggered_buffer_setup()
函数则用于为设备分配触发缓冲区。
一、IIO缓冲区的系统接口(sysfs)
在系统目录/sys/bus/iio/devices/deviceX/buffer/
下,可以找到与缓冲区相关的配置项:
length
- 显示缓冲区能存储的最大数据点数量。例如,若值为1000,表示缓冲区最多可存1000个数据样本。
enable
- 启用或禁用缓冲区采集。写入
1
启动数据采集,写入0
停止采集。
- 启用或禁用缓冲区采集。写入
watermark(内核4.2及以上版本支持)
- 设置读取数据的“门槛值”。当缓冲区中的数据量达到这个数值时,程序才会返回读取结果(阻塞读取模式)。
- 例如:若设置为50,且程序请求读取20个数据点,系统会一直等待直到缓冲区有至少50个数据点才开始返回。
- 这个设置对非阻塞读取无效,但可用于控制延迟(比如结合定时暂停功能,确保读取数据不超过最大延迟时间)。
二、IIO缓冲区配置
需要读取并存入缓冲区的数据通道称为“扫描元素”。这些通道的设置位于/sys/bus/iio/devices/deviceX/scan_elements/
目录,主要配置项如下:
en(启用开关)
- 每个数据通道都有一个
xxx_en
属性(如in_voltage0_en
)。 - 写入
**1**
启用该通道,写入0
禁用。只有启用的通道数据才会被存入缓冲区。
- 每个数据通道都有一个
type(数据格式)
描述该通道数据在缓冲区中的存储方式,格式示例:
le:s16_32
。格式解析:
le
或be
:数据的字节顺序(小端或大端)。s
或u
:数据符号(有符号或无符号)。16
(示例中的s16
):实际有效位数(如12位传感器数据可能占用16位存储空间)。32
(示例中的_32
):占用的存储位数(需与设备手册核对)。>>shift
(可选):数据需右移的位数。例如,若存储位数为16但实际数据只有12位,需右移4位(>>4
)才能得到真实值。repeat
(可选):重复存储的次数(通常默认为1,可忽略)。
示例:若某通道的
type
为be:u12_16
,则:- 数据以大端格式存储;
- 是无符号整数;
- 实际数据占12位,但占用16位空间(需右移4位提取有效值)。