我正在尝试在ARM GCC工具链环境中重新定位STM32F411RET微控制器的printf()
功能,该环境使用Newlib作为标准C库。
当我搜索如何重新定位printf()
时,很多人都说我需要实施_write()
或_write_r()
。它似乎都在发挥作用。
但我仍然对它们有疑问:
当我查看document of Newlib时,它说我可以实现write()
来输出文件,但它看起来不起作用。看起来我们可以实现_write()
但是文档中从未提及过此功能。 write()
发生了什么?下划线会有什么不同吗?
在哪种情况下_write_r()
优于_wirte()
?我不理解C中再连接的概念。任何例子?
感谢您阅读本文。
答案 0 :(得分:4)
对于第一个问题,这是因为Newlib希望通过在名称前加下划线来Why do C compilers prepend underscores to external names?(“命名空间清理版本”)。另请参阅Reentrancy and Reentrant in C?
关于第二个问题,请参阅_reent-struct。如果您的主板上运行了多线程程序,并且多个线程可以调用newlib函数,那么您需要使用系统调用的可重入版本。如果中断处理程序可以调用newlib函数,则还需要使用可重入的系统调用。但是,在单线程应用程序中使用可重入的系统调用是完全可以的。
例如,如果在多线程应用程序中使用不可重入的系统调用,则只有一个全局的errno-flag。如果两个或多个线程中发生错误,则可以覆盖全局errno值。在可重入的系统调用中,每个线程都有自己的errno-flag(在here中 - 参见实现的http://www.embecosm.com/appnotes/ean9/ean9-howto-newlib-1.0.html#sec_configure_host)。因此,每个线程都可以检查并处理自己的错误。