我正在尝试在ARM GCC工具链环境下为STM32F411RET微控制器重新定位printf()
函数,该环境使用Newlib作为标准C库。
当我搜索如何重新定位printf()
时,许多人说我需要实现_write()
或_write_r()
。似乎两者都能工作。
但是我仍然有一些问题:
当我查看Newlib文档时,它说我可以实现
write()
以输出文件,但这似乎不起作用。看起来我们可以实现_write()
,但是文档中从未提到过这个函数。write()
发生了什么?下划线有什么不同吗?在什么情况下,
_write_r()
优于_wirte()
?我不理解C语言中的可重入性概念。有什么例子吗?
感谢阅读。
write()
函数和open()
函数是标准的POSIX类型函数,可在此之间进行配合使用。特殊文件号码0、1、2对应stdin、stdout、stderr(通常如此)。对于newlib中的这些特殊文件,您需要编写实现,并且如果文件号码>2,则必须以某种方式进行索引。也就是说,open()
函数将指定要写入的目标文件并返回一个文件号码>2。用户代码不应依赖这些值。但是,实现者需要定义一些内容。 - artless noiseprintf
优化为puts
,并在此过程中破坏一切。在这种情况下,您可以实现puts
或将printf重命名为其他名称。 - Brian McFarland