Имеется самодельный девайс. Он ждёт пока к нему по USART придёт запрос данных и начинает их отдавать как только его получит.
Имеется консольная программа на Си. Она должна опрашивать девайс каждую секунду и писать ответ в файл. Данных много, поэтому USART работает почти на пределе своей пропускной способности, но точно должен будет справляться (данных всегда одно и то же количество). Поэтому нельзя сделать while (1) { write(); read(); sleep(); }, потому что задержка будет достаточно маленькая и ОС может не вернуть управление моей программе вовремя.
Решение: не синхронизировать чтение и запись. Чтобы каждую секунду гарантированно сделался write, а read будет делаться по мере получения данных (можно, например, открыть последовательный порт в блокирующем режиме или использовать select). В итоге буферизация ядра Linux и USB-переходника сделают всё за меня (программе не страшно, если она будет читать данные кусками, у меня есть возможность определить начало новых данных, ведь каждый пакет имеет фиксированный размер).
Но как в чистом Си сделать чтобы некая функция гарантированно вызывалась каждую секунду? Интервал достаточно большой, поэтому даже не на риалтаймовой ОС это должно быть реально.
Желательно чтобы способ был более-менее кросс-платформенный и тянул поменьше зависимостей.