嵌入式平台上的 printf 函数
在嵌入式系统中,由于没有固定的显示设备,printf 函数的输出需要重定向到一个特定的输出设备,例如串口。实现的方法是重定向 fputc 函数。
重定向 fputc 函数
要使用 printf 函数并通过串口输出,需要将 fputc 函数重定向到串口发送函数。
使用微库(MicroLib)
最简单的方式是直接重写 fputc 函数:
c
int fputc(int ch, FILE *f) {
uart_putc(ch); // 硬件串口发送函数
return ch;
}
在 Keil 环境中,勾选 "Use MicroLib" 选项即可。
不使用微库
这种方式稍复杂一些,需要告知编译器不使用半主机,并重写 fputc 函数,同时增加一些附带的函数和变量。
c
__asm(".global __use_no_semihosting");
FILE __stdout;
FILE __stdin;
void _sys_exit(int x) {
x = x;
}
int fputc(int ch, FILE *f) {
uart_putc(ch); // 硬件串口发送函数
return ch;
}
如何不使用半主机
对于汇编文件,在文件中添加:IMPORT __use_no_semihosting
对于 C 文件,使用 Arm Compiler 5,在文件中添加:#pragma import(__use_no_semihosting)
对于 C 文件,使用 Arm Compiler 6,在文件中添加:__asm(".global __use_no_semihosting");
注意:同一个工程中,只需在一个文件中添加即可,不用重复添加。
|