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

Bum*_*Kim 6 c embedded gcc arm newlib

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

当我寻找如何重新定位时printf(),很多人说我需要实施_write()或_write_r()。而且似乎都可行。

但是我仍然对它们有疑问:

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

  2. 在哪种情况下_write_r()比_wirte()?我不了解C语言中的可重入性概念。有什么例子吗?

感谢您阅读本文。

小智 3

对于第一个问题,这是因为 Newlib 希望通过在名称前添加下划线来避免名称冲突(“名称空间干净版本”)。另请参见为什么 C 编译器在外部名称前添加下划线?

第二个问题,参见C中的可重入和可重入?。如果您的主板上运行着多线程程序,并且多个线程可以调用 newlib 函数,那么您需要使用系统调用的可重入版本。如果中断处理程序可以调用 newlib 函数,您还需要使用可重入系统调用。但是,在单线程应用程序中使用可重入系统调用是完全可以的。

例如,如果您在多线程应用程序中使用不可重入的系统调用,则只有一个全局 errno 标志。如果两个或多个线程中发生错误,则可以覆盖全局 errno 值。在可重入系统调用中,每个线程都有自己的 errno 标志(在_reent 结构中- 请参阅此处了解实现)。因此,每个线程都可以检查并处理自己的错误。

注意:您必须重新编译 newlib 才能选择要使用的系统调用模型。请参阅http://www.embecosm.com/appnotes/ean9/ean9-howto-newlib-1.0.html#sec_configure_host。