【发布时间】:2017-08-06 18:13:58
【问题描述】:
我有一块 STM32VL 探索板,它使用 STM32F100RB 微控制器。我正在使用 Keil uVision 5.24.2.0。我正在使用编译器选项'ARM 编译器'使用默认编译器版本 5''。
我正在尝试弄清楚如何使用/重定向它上面的printf() 函数。
我了解 UART 初始化过程,但我真的很难理解如何重定向 printf()。我已经阅读了多个我需要的资料。
考虑以下http://www.keil.com/forum/60531/ 的示例:
#include <stdio.h>
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
/* FILE is typedef’d in stdio.h. */
FILE __stdout;
int fputc(int ch, FILE *f)
{
/* Your implementation of fputc(). */
return ch;
}
int ferror(FILE *f)
{
/* Your implementation of ferror(). */
return 0;
}
void test(void)
{
printf("Hello world\n");
}
-
__FILE到底是做什么的?我没有看到它被使用过。 - 为什么
__stdout前面有两个'_'? - 为什么将
FILEtypedef 的数据类型分配给__stdout? - 是否需要将代码添加到
/* Your implementation of fputc(). */?
【问题讨论】:
-
重定向到什么?
-
抱歉 - 删除了我的答案,因为我不使用 Keil 和 Keil 库。
-
@duskwuff 有关系吗?
-
@PeterJ 是的!例如,如果 OP 想要将
printf()重定向到半主机 I/O,那么有一个特定的过程可以完成这与将其定向到 USART 或其他什么不同的过程。 -
更容易避免使用 printf,其次是找到一个专为这种工作设计的 printf,它没有那么重的系统后端。