Лучший способ написать функцию, которая принимает время ожидания - PullRequest
1 голос
/ 16 февраля 2011

Итак, у меня есть встроенное устройство Linux, которое подключено к контроллеру двигателя через последовательный порт.Я пишу интерфейсную библиотеку, которая делает много хороших общих функций, которые будут вызывать другие программы.Одной из них является функция для запуска программы, которая в настоящее время находится на флэш-диске контроллера:

int run_motor_program(int serial_fd, char *label, timeout);

Общий псевдокод для этой функции:

call write(serial_fd, "start program at `label`")
perform a couple read()'s / write()'s to check whether program has started on the motor controller
do
   /* some stuff */
while(program is running AND timeout hasn't exceeded)
If the timeout exceeded, kill motor and return timeout error

Время ожидания в приведенном вышеОпределение функции используется в случае, если что-то идет не так во время работы программы на контроллере мотора.Если контроллер двигателя застрял в более длинной петле, чем ожидалось, мне нужна возможность остановить программу.

Единственные известные мне способы отслеживания времени ожидания:

1) Вызов gettimeofday() до и во время цикла, чтобы увидеть, истекло ли истекшее время> значение тайм-аута, переданное в

2) Вызов clock_gettime () и в основном то же самое, что и 1.

3) Использование timer_create ()перед циклом и timer_getoverrun () в цикле, чтобы проверить, истекло ли время (это, кажется, самое элегантное решение, но я не могу заставить работать timer_getoverrun () с SIGEV_NONE [я не хочу использоватьсигналы]).

Какой из них (или если у кого-то есть какие-либо другие предложения) является наилучшим способом учета времени ожидания в функции?Мне действительно нужно только разрешение с точностью до миллисекунды.

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

Я склонен делать вариант 1 сам. Если субсекундная детализация не требуется, тогда я буду использовать time. Обычно работа проверяется на IO, поэтому я также использую select с настроенным таймаутом.

0 голосов
/ 16 февраля 2011

Вы можете рассмотреть возможность использования одного из механизмов сигнала тревоги. Простейшим и самым старым является alarm(), который планирует сигнал SIGALRM через указанное количество секунд. Если у вас есть обработчик сигнала для SIGALRM, ваш процесс не умрет, но позволит вам восстановиться после ошибки.

Основное ограничение alarm() заключается в том, что он действует в целых секундах. Существует множество подсекундных или дробных вторых альтернатив. Вы должны посмотреть на setitimer(). Вы можете использовать nanosleep(), но вам, вероятно, также потребуется использовать потоки, поскольку nanosleep() блокирует вызывающий поток. Это продвигает это вверх по шкале сложности. Есть вызовы типа pthread_cond_timedwait(), которые также можно использовать в многопоточных программах.

Ваш прототип int run_motor_program(int serial_fd, char *label, timeout); не скомпилируется; вам нужно определить тип аргумента тайм-аута. Вам также необходимо решить, что означает ваш аргумент - это интервал или продолжительность (количество секунд, в течение которых двигатель запускается до истечения времени ожидания), или же это время окончания (время Unix, после которого должна выполняться программа). остановлен). Существуют различные вспомогательные структуры, с которыми вам придется договариваться. Вероятно, ваш выбор будет зависеть от того, какой системный вызов вы используете для реализации тайм-аута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...