打印
[N32G43x]

Keil 重定向 fputc 函数 以及 printf 函数的代码

[复制链接]
505|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
adolphcocker|  楼主 | 2024-7-23 02:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 函数是一个庞大的函数,其功能也更强大。


使用特权

评论回复
沙发
实际测量不符| | 2024-7-25 15:55 | 只看该作者
printf 函数是 C 语言标准库中的一个函数,用于将格式化的数据输出到标准输出设备(通常是屏幕)。它是 stdio.h 头文件的一部分,能够输出各种数据类型,包括整数、浮点数、字符和字符串等。

使用特权

评论回复
板凳
实际测量不符| | 2024-7-25 15:56 | 只看该作者
int printf(const char *format, ...);
format:这是一个字符串,包含了要输出的文本和格式说明符。格式说明符以 % 开头,后面跟着一个或多个字符,用来指定如何格式化后续的参数。
...:这表示函数接收可变数量的参数,这些参数将会替换掉 format 字符串中的格式说明符。
printf 函数返回输出的字符数量,如果发生错误则返回一个负值。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

1337

帖子

0

粉丝