Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IIO Linux:如何知道缓冲区何时已满?_Linux_Sysfs_Iio - Fatal编程技术网

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

IIO Linux:如何知道缓冲区何时已满?,linux,sysfs,iio,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

我使用用户空间中的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事件)。

它可以帮助谁,在采集过程中,我最终使用对缓冲文件的递归非阻塞读取来读取度量值。这样,当我读取了预期数量的样本时,程序可以安全地处理它们

此外,在系统可以继续执行另一个命令之前,禁用缓冲区似乎是等待采集完成的一种方式:

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

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

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

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

我从未使用过它,但是
libiio
中有
iio\u buffer\u get\u poll\u fd
函数。签出: