2014-10-08 6 views
0

У меня есть биглая кость и вы хотите прочитать булавку gpio из моей программы. Файл либо содержит 1, либо 0 в любой момент. В моей программе C у меня есть цикл while, который работает вечно с функцией сна, чтобы он не был cpu hog всякий раз, когда этот вывод был низким (0) и когда он высок (1) он запускает код. Я считаю это очень расточительным для ресурсов. Есть ли способ, который я могу видеть, когда этот файл равен 1, а затем запустить код? Мне не нравится опрос, особенно когда биглевая кость будет заряжаться от батареи.Как искать изменения в файле без опроса?

ответ

0

Используйте механизм уведомления, например, используя libev.

Основная идея заключается в том, что обратный вызов вызывается, если доступны данные.

Если это не сработает, возможно, вам придется использовать другие API, чтобы попасть туда, например, inotify.

Пример любезно libev документы:

// a single header file is required 
#include <ev.h> 

#include <stdio.h> // for puts 

// every watcher type has its own typedef'd struct 
// with the name ev_TYPE 
ev_io stdin_watcher; 
ev_timer timeout_watcher; 

// all watcher callbacks have a similar signature 
// this callback is called when data is readable on stdin 
static void 
stdin_cb (EV_P_ ev_io *w, int revents) 
{ 
puts ("stdin ready"); 
// for one-shot events, one must manually stop the watcher 
// with its corresponding stop function. 
ev_io_stop (EV_A_ w); 

// this causes all nested ev_run's to stop iterating 
ev_break (EV_A_ EVBREAK_ALL); 
} 

// another callback, this time for a time-out 
static void 
timeout_cb (EV_P_ ev_timer *w, int revents) 
{ 
puts ("timeout"); 
// this causes the innermost ev_run to stop iterating 
ev_break (EV_A_ EVBREAK_ONE); 
} 

int 
main (void) 
{ 
// use the default event loop unless you have special needs 
struct ev_loop *loop = EV_DEFAULT; 

// initialise an io watcher, then start it 
// this one will watch for stdin to become readable 
ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ); 
ev_io_start (loop, &stdin_watcher); 

// initialise a timer watcher, then start it 
// simple non-repeating 5.5 second timeout 
ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.); 
ev_timer_start (loop, &timeout_watcher); 

// now wait for events to arrive 
ev_run (loop, 0); 

// break was called, so exit 
return 0; 
} 
Смежные вопросы