diff --git a/examples/gpio-interrupt.c b/examples/gpio-interrupt.c index f3809e4..216f8fb 100644 --- a/examples/gpio-interrupt.c +++ b/examples/gpio-interrupt.c @@ -6,6 +6,9 @@ make really-all Требования: Используется модифицированный WiringPi с функцией digitalReadPins() + Режимы: + fill - заполняет паузы последним байтом (высокий CPU, непрерывный поток) + sleep - спит при отсутствии данных (низкий CPU, только реальные данные) */ #include @@ -38,7 +41,6 @@ unsigned int pins[] = { 21, 7, 6, 5, 25, 24, 23, 22 }; // 8-битная шин const size_t out_buffer_len = 32U; // Размер логируемого пакета const size_t fifo_buffer_len = 4096U; // Размер ПППУ в байтах -// ================= FIFO ================= struct fifo { char *buffer; @@ -96,7 +98,6 @@ bool fifo_try_write(struct fifo *ff, char* buffer, size_t len) { return true; } -// ======================================= static struct fifo isr_ff; @@ -118,8 +119,9 @@ void isr_handle(void) { fifo_try_write(&isr_ff, &byte_read, 1); } + int main(int argc, char *argv[]) { - // Инициализация FIFO + // Обработка аргументов if (!fifo_init(&isr_ff, fifo_buffer_len)) { perror("fifo_init()"); exit(EXIT_FAILURE); @@ -130,7 +132,6 @@ int main(int argc, char *argv[]) { perror("wiringPiSetup()"); exit(EXIT_FAILURE); } - pinMode(wr_pin, INPUT); pullUpDnControl(wr_pin, PUD_UP); @@ -147,17 +148,18 @@ int main(int argc, char *argv[]) { exit(EXIT_FAILURE); } - // Основной цикл - char byte; + char byte_prev = 0; while (true) { - if (fifo_try_read(&isr_ff, &byte, 1)) { + char byte = 0; + if (fifo_try_read(&isr_ff, &byte, sizeof byte)) { fwrite(&byte, 1, 1, stdout); - fflush(stdout); - } else { - usleep(1000); // 1 мс пауза при отсутствии данных + byte_prev = byte; } + else { + fwrite(&byte_prev, 1, 1, stdout); + } + fflush(stdout); } - fifo_uninit(&isr_ff); return EXIT_SUCCESS; } \ No newline at end of file