Быстрое считывание аналоговых входов в beaglebone black
Мне нужно читать все 7 аналоговых выводов в BBB каждые 5 миллисекунд. Я делаю это с помощью следующего кода C:
void main(){
char value_str[7];
long int value_int = 0;
FILE* f0 = fopen("/sys/bus/iio/devices/iio:device0/in_voltage0_raw", "r");
while(1){
fread(&value_str, 6, 6, f0);
value_int = strtol(value_str,NULL,0);
printf("0 %li\n", value_int);
fflush(stdout);
usleep(5000);
rewind(f0);
}
Тем не менее, использование процессора действительно очень высоко (20%). Есть ли способ прочитать аналоговые входы по-другому, чтобы он не потреблял столько ресурсов процессора? Кто-то предложил "DMA", но я полностью потерян в этом отношении...
Любая помощь будет оценена.
2 ответа
Эта ветка на форуме BBB была очень полезна, и в итоге я использовал libpruio. Он использует PRU для считывания встроенных выводов Beagle и аналого-цифровых преобразователей. Код, который я в итоге использовал:
#include <stdio.h>
#include <unistd.h>
#include "pruio_c_wrapper.h"
#include "pruio_pins.h"
int main(int argc, const char *argv[]) {
PruIo *io = pruio_new(0, 0x98, 0, 1);
if (io->Errr) {
printf("Initialisation failed (%s)\n", io->Errr);
return 1;
}
if(pruio_config(io, 0, 0x1FE, 0, 4, 0)){
printf("Config failed (%s)\n", io->Errr);
return 1;
}
while(1){
printf"\r%12o %12o %12o %12o %4X %4X %4X %4X %4X %4X %4X %4X\n"
, io->Gpio[0].Stat, io->Gpio[1].Stat, io->Gpio[2].Stat, io->Gpio[3].Stat
, io->Value[1], io->Value[2], io->Value[3], io->Value[4], io->Value[5]
, io->Value[6], io->Value[7], io->Value[8]);
usleep(1000);
}
pruio_destroy(io);
return 0;
}
Я предлагаю вам использовать PRU. Это очень быстро! Это должно помочь вам начать-> http://www.element14.com/community/community/knode/single-board_computers/next-gen_beaglebone/blog/2013/08/04/bbb--high-speed-data-acquisition-and-web-based-ui