Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C FreeRTOS在调度程序启动之前(或停止之后)为IO排队_C_Embedded_Io_Freertos_Newlib - Fatal编程技术网

C FreeRTOS在调度程序启动之前(或停止之后)为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上)队列只能在调度程序运行时安全使用,并且当中断被禁

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

目前,我正在采用(似乎是标准的)FreeRTOS方法,将_writesystem call(Newlib)队列字符放入FreeRTOS,然后从中断服务例程中清空(填充串行端口硬件FIFO,然后等待FIFO空中断)

这样做的缺点是(至少在FreeRTOS上)队列只能在调度程序运行时安全使用,并且当中断被禁用时(在调度程序启动之前的引导过程中,或者在出现致命错误情况后,调试输出无法打印(正是在调试printf输出最有用的地方:-))

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


谢谢

在_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调用显式轮询调度程序状态并首先更新函数指针。(在新硬件上的早期调试证明我的妄想是正确的:-)