Я использую 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 этих данных?
Спасибо!