在以Newlib为标准C库的ARM GCC工具链环境中,尝试实现STM32F411RET微控制器的STM32F411RET函数重定向。
当我搜索如何重定向printf()时,很多人说我需要实现_write()或_write_r()。两者似乎都起作用了。
但我仍然对他们有疑问:
write()来输出文件,但是它看起来不工作。看起来我们可以实现_write(),但是这个函数在文档中从来没有提到过。write()发生了什么事?下划线有什么不同吗?_write_r()比_wirte()更好?我不理解C中关于再入的概念。有什么例子吗?谢谢你读这篇文章。
发布于 2015-08-24 06:37:41
对于第一个问题,这是因为Newlib希望通过在名称前加上下划线来实现避免名称冲突 (“名称空间清洁版本”)。另见为什么C编译器将下划线放在外部名称的前面?
有关第二个问题,请参见在C中重入和重入?。如果您的板上运行了一个多线程程序,并且多个线程可以调用newlib函数,那么您需要使用syscalls的可重入版本。如果中断处理程序可以调用newlib函数,则还需要使用可重入的syscalls。但是,在单线程应用程序中使用可重入的syscalls是完全可以的。
例如,如果在多线程应用程序中使用不可重入的syscalls,那么只有一个全局errno标志。如果两个或多个线程中发生错误,则可以覆盖全局errno值。在可重入的系统中,每个线程都有自己的errno标志(在雷恩-结构中--参见这里中的实现)。因此,每个线程都可以检查和处理自己的错误。
注意:您必须重新编译newlib以选择要使用的syscall模型。见主机。
https://stackoverflow.com/questions/32031929
复制相似问题