IIO Linux:如何知道缓冲区何时已满?

时间:2016-11-14 13:35:26

标签: linux sysfs iio

我正在使用来自用户空间的IIO驱动程序来读取ADC的值(AD7924)。 我已经完成了触发采集工作的所有步骤(创建触发器,分配它,启用ADC通道,设置缓冲区的维度,并启用它)。以下是此代码:

// Create IIO trigger
system("echo 0 > /sys/devices/iio_sysfs_trigger/add_trigger");

// Assign IIO trigger "sysfstrig0" to IIO AD7923 driver
system("echo sysfstrig0 > /sys/bus/iio/devices/iio:device0/trigger/current_trigger");

// Enable scan of the first 3 channels for AD7924
system("echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage0_en");
system("echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage1_en");
system("echo 1 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage2_en");
system("echo 0 > /sys/bus/iio/devices/iio:device0/scan_elements/in_voltage3_en");

// Dim IIO buffer and enable it
sprintf(CommandeADC, "echo %d > /sys/bus/iio/devices/iio:device0/buffer/length", NB_ECH);
system(CommandeADC);
system("echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable");
//Launch acquisition...
system("echo 1 > /sys/bus/iio/devices/trigger0/trigger_now");

这样配置的系统将处理采集,并填充完整的缓冲区。一旦收满,收购就会停止。

我的问题是:我怎么知道缓冲区何时完全填满?我尝试在位于 / dev / iio:device0 文件中使用poll或select函数来检查文件描述符中的更改,但我只能知道何时获取开始(通过检查POLLIN事件)。

2 个答案:

答案 0 :(得分:0)

对于它可能有帮助的人,我最终使用缓冲文件的递归非阻塞读取来读取正在进行采集的测量。这样,当我读取预期的样本数量时,程序可以安全地处理它们。

此外,似乎禁用缓冲类等待采集完成,系统可以继续执行另一个命令:

     system("echo 0 > /sys/bus/iio/devices/iio:device0/buffer/enable");

第二种解决方案更像是一种轮询方式。

答案 1 :(得分:0)

首先,这种方法无法扩展。如果将另一个IIO设备添加到您的系统并且设备ID更改了怎么办?我建议使用libiio

关于您的问题,即我怎么知道缓冲区何时已满?。这可能取决于缓冲区大小和所用设备的特性。例如,ADC转换器可能以与温度计不同的速率提供样本,更不用说更专门的设备了。

我从未使用过它,但是iio_buffer_get_poll_fd中有libiio函数。检出:http://analogdevicesinc.github.io/libiio/group__Buffer.html