2016-11-14 14 views
1

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

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

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

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

ответ

0

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

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

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

Это второе решение более избирательный подход.