fflu sh системы именованных каналов (fifo) более 1 секунды в коде C на Raspberry Pi - PullRequest
1 голос
/ 17 января 2020

Я использую Raspberry Pi (либо 3b +, либо даже 4 ГБ модель 4 с Stretch Lite или Buster Lite), чтобы прочитать AD C и сообщить значения в именованный канал (fifo). Когда я открываю трубу, я использую параметр O_NONBLOCK. Код написан в C. Скорость передачи данных не особенно высока, так как значения записываются только один раз в секунду. Я прочитал значения, используя cat в терминале.

Я установил таймер в своем коде, и обычно fprintf, за которым следует fflu sh, требует меньше 1 миллисекунды. Однако, довольно часто (один раз каждые 10-15 минут), это может занять иногда более 1 секунды для завершения!

Код является частью гораздо более крупного проекта, но это строки, которые я использую вокруг этого fifo реализация:

int chOutputData(int ch, struct output_s *output)
{
  int nchar;

  if(output->complete_flag) {
    nchar = fprintf(fdch[ch], "m %d %d %d\n",
                    output->val1,
                    output->val2,
                    output->val3,
                    );
    fflush(fdch[ch]);
    return(nchar);
  } else {
    chOutputError(ch, "Output data is not complete.\n");
    exit(1);
  }
}

val1, val2, val3 - просто простые числа, ничего особенного.

Не правильно ли я использую fprintf с fflu sh? Нужно ли устанавливать какой-то буфер? Это связано с медленными SD-картами на Raspberry Pi? Даже если бы это заняло до 5-10 мсек, я бы не стал жаловаться, но у меня есть сторожевой таймер, который срабатывает примерно на 100 мсек, поэтому, когда это занимает более 1 секунды, у меня возникают проблемы.

Я открыт для других идей как выплюнуть эту строку. Интересно, может ли MQTT быть средством публикации sh этих данных?

Спасибо!

...