本文的开发环境为 Keil + Cortex-M3 内核处理器。
重定向 fputc 函数方法
如果想使用库函数 printf
,必须要将 fputc
重定向到自己的串口上。
术语
重定向
可以理解为用户重写fputc
函数,在重写的函数体内调用自己硬件的串口发送函数。
在 Keil 环境中,重定向 fputc
函数有两种方法:
- 使用微库
这种方式最简单,直接重写fputc
函数即可:
int fputc(int ch, FILE *f)
{
uart_putc(ch); // 硬件串口发送函数
return ch;
}
说明:使用微库,也就是勾选
Use MicroLib
选项,如下图所示:
- 不使用微库
这种方式要稍微复杂些。
首先要告诉编译器不使用半主机,然后再来重写fputc
函数,此外还要增加附带函数和变量:
/*不使用 MicroLIB,重定向 fputc 函数*/
__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");
注意:同一个工程中,只需在一个文件中添加即可,不用重复添加。
printf 函数的代码尺寸测试
ARM 标准库提供两种打印函数:
printf
:全功能版本_printf
:与printf
函数相比,不支持浮点数格式化
测试代码尺寸如下表所示:
Code | RO | RW | ZI | 备注 | |
---|---|---|---|---|---|
基础版本 | 1724 | 356 | 4 | 1644 | |
_printf 版本 | 4084 | 696 | 4 | 1727 | 增加 2700 字节 |
printf 版本 | 8296 | 908 | 4 | 1727 | 增加 7124 字节 |
通过对比可以知道,printf
是一个庞大的函数,其功能也很强大,具体参考这篇文章。
读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)