IIO Linux: Как узнать, когда буфер заполнен?

Я использую драйверы IIO из пользовательского пространства, чтобы прочитать значение АЦП (AD7924). У меня есть все шаги, чтобы заставить работать сработавшее обнаружение (создать триггер, назначить его, включить каналы АЦП, установить размер буфера и включить его). Вот код для этого:

// 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");

Система, настроенная таким образом, будет обрабатывать получение и заполнять весь буфер. Как только он заполнен, приобретение прекращается.

Мой вопрос: как я могу узнать, когда буфер полностью заполнен? Я попытался использовать функцию poll или select для файла iio:device0, расположенного в /dev/, чтобы проверить изменения в дескрипторе файла, но я смог узнать только, когда началось получение (путем проверки на наличие события POLLIN).

2 ответа

Ну, во-первых, такой подход не масштабируется. Что если в вашей системе будет добавлено другое устройство IIO, и ID устройства изменятся? Я бы порекомендовал использовать libiio,

Что касается вашего вопроса, т.е. как я могу узнать, когда буфер полностью заполнен?, Это может зависеть от характеристик размера буфера и используемого вами устройства. Например, преобразователи АЦП могут предоставлять образцы с различной скоростью, чем термометры, не говоря уже о более специализированных устройствах.

Я никогда не использовал его, но есть iio_buffer_get_poll_fd функция в libiio, Проверьте: http://analogdevicesinc.github.io/libiio/group__Buffer.html.

Кому это может помочь, я закончил тем, что использовал рекурсивное неблокирующее чтение файла буфера для чтения показателей во время сбора данных. Таким образом, когда я прочитал ожидаемое количество образцов, программа может безопасно обработать их.

Кроме того, кажется, что отключение буферного типа ожидания завершения сбора после того, как система может выполнить другую команду:

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

Это второе решение является более подходом опроса.

Другие вопросы по тегам