用Newlib实现write(),_ write()或_write_r()?

时间:2015-08-16 04:50:06

标签: c gcc arm embedded newlib

我正在尝试在ARM GCC工具链环境中重新定位STM32F411RET微控制器的printf()功能,该环境使用Newlib作为标准C库。

当我搜索如何重新定位printf()时,很多人都说我需要实施_write()_write_r()。它似乎都在发挥作用。

但我仍然对它们有疑问:

  1. 当我查看document of Newlib时,它说我可以实现write()来输出文件,但它看起来不起作用。看起来我们可以实现_write()但是文档中从未提及过此功能。 write()发生了什么?下划线会有什么不同吗?

  2. 在哪种情况下_write_r()优于_wirte()?我不理解C中再连接的概念。任何例子?

  3. 感谢您阅读本文。

1 个答案:

答案 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)。因此,每个线程都可以检查并处理自己的错误。

注意:您必须重新编译newlib以选择要使用的syscall模型。请参阅enter image description here