3

我正在寻找有关如何在操作系统调度程序可能尚未启动、正在运行、暂停或可能已停止的环境中最好地实现线程安全 IO(例如,用于调试串行端口的 printf)的建议,或者坠毁。我正在使用 Newlib 和 FreeRTOS。

目前,我正在使用(看似标准的)FreeRTOS 方法,将 _write 系统调用(Newlib)队列字符放入 FreeRTOS队列,然后从中断服务例程中清空(填充串行端口硬件 FIFO,然后等待FIFO 空中断)。

这样做的缺点是(至少在 FreeRTOS 上)队列只能在调度程序运行时安全使用,并且在禁用中断时无法打印调试输出(因为它们在引导期间直到调度程序启动,或者在致命之后错误条件(正是调试 printf 输出最有用的地方:-)。

最好让_write系统调用查询调度程序和/或中断状态,如果调度程序正在运行,则使用队列,并在禁用中断时使用阻塞/轮询串行IO?有没有更优雅的想法我还没有想到?

谢谢

4

1 回答 1

2

在 _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 设施(例如异常处理程序)的地方使用。

于 2010-05-04T13:48:53.273 回答