11

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

当我搜索如何重新定位printf()时,很多人说我需要实施_write()_write_r()。似乎两者都有效。

但我仍然对他们有疑问:

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

  2. 在哪种情况下_write_r()更可取_wirte()?我不明白 C 中重新进入的概念。有什么例子吗?

感谢您阅读本文。

4

1 回答 1

4

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

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

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

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

于 2015-08-24T06:37:41.913 回答