C FreeRTOS在调度程序启动之前(或停止之后)为IO排队
我正在寻找关于如何在操作系统调度程序可能尚未启动、正在运行、挂起或已停止或崩溃的环境中最好地实现线程安全IO(例如,printf转到调试串行端口)的建议。我正在使用Newlib和FreeRTOS 目前,我正在采用(似乎是标准的)FreeRTOS方法,将_writesystem call(Newlib)队列字符放入FreeRTOS,然后从中断服务例程中清空(填充串行端口硬件FIFO,然后等待FIFO空中断) 这样做的缺点是(至少在FreeRTOS上)队列只能在调度程序运行时安全使用,并且当中断被禁用时(在调度程序启动之前的引导过程中,或者在出现致命错误情况后,调试输出无法打印(正是在调试printf输出最有用的地方:-)) 最好让写系统调用查询调度程序和/或中断状态,并在调度程序正在运行时使用队列,在中断被禁用时使用阻塞/轮询串行IO?有没有一个我还没有想到的更优雅的主意C FreeRTOS在调度程序启动之前(或停止之后)为IO排队,c,embedded,io,freertos,newlib,C,Embedded,Io,Freertos,Newlib,我正在寻找关于如何在操作系统调度程序可能尚未启动、正在运行、挂起或已停止或崩溃的环境中最好地实现线程安全IO(例如,printf转到调试串行端口)的建议。我正在使用Newlib和FreeRTOS 目前,我正在采用(似乎是标准的)FreeRTOS方法,将_writesystem call(Newlib)队列字符放入FreeRTOS,然后从中断服务例程中清空(填充串行端口硬件FIFO,然后等待FIFO空中断) 这样做的缺点是(至少在FreeRTOS上)队列只能在调度程序运行时安全使用,并且当中断被禁
谢谢在_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设施的地方使用(例如异常处理程序).在发生致命错误后,依赖函数指针的完整性真的是一个好主意吗?在我看来,如果回调函数指针被导致致命错误的任何因素破坏,可能printf()->\u write()->UART链也被破坏了,所以不管怎样都没有意义…我最终做了一些像法官梅加登建议的事情,除了_write调用显式轮询调度程序状态并首先更新函数指针。(在新硬件上的早期调试证明我的妄想是正确的:-)