我正在寻找有关如何在操作系统调度程序可能尚未启动,运行,暂停或可能的环境中最佳地实现线程安全IO(例如,用于打印到调试串行端口的打印)的建议已经停止或坠毁。我正在使用Newlib和FreeRTOS。
目前,我正在做(看似标准的)FreeRTOS方法,将_write系统调用(Newlib)队列字符放入FreeRTOS queue,然后从中断服务程序清空(填写串口硬件FIFO然后等待FIFO空中断)。
这样做的缺点是(至少在FreeRTOS上)队列只能在调度程序运行时安全使用,并且在禁用中断时无法打印调试输出(因为它们在启动期间直到调度程序启动,或者在致命的错误情况之后(确切地说,调试printf输出最有用的地方:-)。
最好让_write系统调用查询调度程序和/或中断状态,如果调度程序正在运行则使用队列,并在禁用中断时使用阻塞/轮询串行IO?还有一个我还没有想到的更优雅的想法吗?
由于
答案 0 :(得分: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功能的地方使用(例如异常处理程序)。