Очереди FreeRTOS для ввода-вывода до запуска планировщика (или после его остановки) - PullRequest
3 голосов
/ 04 мая 2010

Я ищу совет о том, как наилучшим образом реализовать поточно-ориентированный ввод-вывод (например, для printf, идущего на отладочный последовательный порт) в среде, в которой планировщик операционной системы может еще не запуститься, работать, приостановиться или может остановились или разбились. Я использую Newlib и FreeRTOS.

В настоящее время я использую (казалось бы, стандартный) подход FreeRTOS, заключающийся в том, чтобы символы очереди системного вызова _write (Newlib) помещались в очередь FreeRTOS , которая затем освобождалась от подпрограммы обработки прерываний ( заполнение последовательного порта аппаратного FIFO, затем ожидание пустого прерывания FIFO).

Это имеет тот недостаток, что (по крайней мере, во FreeRTOS) очередь может безопасно использоваться только при работающем планировщике, а выходные данные отладки не могут быть напечатаны, когда прерывания отключены (как во время загрузки до запуска планировщика, или после фатальной ошибки (именно там, где отладочный вывод printf будет наиболее полезным :-).

Желательно ли, чтобы системный вызов _write запрашивал планировщик и / или состояние прерывания, и использовал очереди, если планировщик работает, и использует последовательный ввод / вывод блокировки / опроса, когда прерывания отключены? Есть ли более изящная идея, о которой я еще не подумал?

Спасибо

1 Ответ

2 голосов
/ 04 мая 2010

Возможно, немного более элегантно было бы использовать косвенное обращение в системном вызове _write. Вместо проверки состояния используйте указатель функции для достижения желаемой функциональности в зависимости от того, работает ли планировщик, включены ли прерывания и т. Д. Затем установите соответствующую функцию обратного вызова при изменении состояния программы.

int (*writeCallback)(int, const void *, unsigned int);

int
_write(int fd, const void *buffer, unsigned int count)
{
    return writeCallback(fd, buffer, count);
}

...

writeCallback = polling_write;

...

writeCallback = rtos_write;

...

В качестве альтернативы вы определяете другую функцию отладки, которая обходит стандартную систему потоков библиотеки (например, printf) для использования в местах, которые, как вам известно, не будут иметь средств прерывания / RTOS (например, обработчики исключений).

...