首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Newlib实现写()、_write()或_write_r()?

用Newlib实现写()、_write()或_write_r()?
EN

Stack Overflow用户
提问于 2015-08-16 04:50:06
回答 1查看 9K关注 0票数 10

在以Newlib为标准C库的ARM GCC工具链环境中,尝试实现STM32F411RET微控制器的STM32F411RET函数重定向。

当我搜索如何重定向printf()时,很多人说我需要实现_write()_write_r()。两者似乎都起作用了。

但我仍然对他们有疑问:

  1. 当我查看新利卜文献时,它说我可以实现write()来输出文件,但是它看起来不工作。看起来我们可以实现_write(),但是这个函数在文档中从来没有提到过。write()发生了什么事?下划线有什么不同吗?
  2. 在哪种情况下,_write_r()_wirte()更好?我不理解C中关于再入的概念。有什么例子吗?

谢谢你读这篇文章。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-24 06:37:41

对于第一个问题,这是因为Newlib希望通过在名称前加上下划线来实现避免名称冲突 (“名称空间清洁版本”)。另见为什么C编译器将下划线放在外部名称的前面?

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

例如,如果在多线程应用程序中使用不可重入的syscalls,那么只有一个全局errno标志。如果两个或多个线程中发生错误,则可以覆盖全局errno值。在可重入的系统中,每个线程都有自己的errno标志(在雷恩-结构中--参见这里中的实现)。因此,每个线程都可以检查和处理自己的错误。

注意:您必须重新编译newlib以选择要使用的syscall模型。见主机

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32031929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档