我们有一个 STM32
C/C++ 项目,我们重新定义了弱的 fputc(int, FILE *)
函数以重定向 printf
输出到一些 UART
channel 。
到目前为止,我们在 IAR 下使用 IAR compiler 构建项目.通过 UART
进行的日志记录工作正常。
我们现在已切换到 arm-none-eabi 工具链
,并正在使用 g++
构建项目。但看起来 fputc
函数的重新定义不再链接,因此 UART
日志记录不起作用。
如何通过 printf
强制使用重新定义的函数?
最佳答案
arm-none-eabi-
工具链正在使用 newlib,它允许您重新定义 _write(int fd, const void *buf, size_t count)
而不是所有 stdio输出函数将使用该接口(interface)。 fd==1
对应于 stdout
,fd==2
对应于 stderr
。您必须提供更多 stub 函数,例如
void _exit(int) {
while(1)
;
}
等它们中的大多数都是微不足道的,但是 printf()
也需要一个有效的 _sbrk()
,因为它在内部使用了 malloc()
。
关于c - 使用 arm-none-eabi 工具链时重新定义 fputc 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51515052/