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");
Это второе решение является более подходом опроса.