2014-05-24 67 views
1

我需要每5毫秒讀取BBB中的所有7個模擬引腳。我這樣做與以下C代碼:在beaglebone黑色中快速讀取模擬輸入

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); 
    } 

Hoever,CPU使用率真的很高(20%)。有什麼方法可以不同地讀取模擬輸入,以便它不使用太多的CPU?有人建議「DMA」,但我完全失去了這方面的...

任何幫助將不勝感激。

回答

4

在BBB論壇This thread非常有用,我結束了使用libpruio。它使用PRU讀取內置io引腳和模數轉換器的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; 
}