printf 函数介绍
printf 函数是 C 语言中的一个标准库函数,用于输出格式化的数据到标准输出设备(通常是屏幕)。它是stdio.h头文件的一部分。printf函数可以输出各种数据类型,包括整数、浮点数、字符和字符串等。
printf函数的原型如下:
int printf(const char *format, ...);
format:这是一个字符串,包含了要输出的文本和格式说明符。格式说明符以%开头,后面跟着一个或多个字符,用来指定如何格式化后续的参数。
...:这表示函数接收可变数量的参数,这些参数将会替换掉format字符串中的格式说明符。
printf 函数返回输出的字符数量,如果发生错误则返回一个负值。
printf 函数的具体用法参考《printf 日常使用指南》
但是在嵌入式平台,由于没有固定的显示设备,printf 函数输出的内容显示在哪里,需要程序员自己确定并实现,实现的方法是重定向 fputc 函数。
重定向 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 函数对比可以知道,printf 函数是一个庞大的函数,其功能也更强大。
|