硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1213|回复: 2
收起左侧

[其它] 自己实现的printf

[复制链接]

7

主题

15

回帖

36

积分

新手上路

积分
36
发表于 2023-1-10 11:52:17 | 显示全部楼层 |阅读模式
.h中的声明:

#include <stdio.h>
#include <stdarg.h>
int my_printf_1(const char *fmt, ...) __attribute__ ((format (printf,1,2)));// 按 printf 函数的格式
int my_printf_x(UART_HandleTypeDef *huart,const char *fmt, ...) __attribute__ ((format (printf, 2,3)));// 按 printf 函数的格式


.c中的实现:
static char printf_buff[256];
int my_printf_1(const char *fmt, ...)
{
        int length;
       
        va_list ap;
        va_start(ap, fmt);//将ap初始化为变参数栈的栈顶指针
        length=vsnprintf((char *)printf_buff,sizeof(printf_buff), fmt, ap);//将指针ap传递给vsprintf做格式化处理
        va_end(ap);
       
        HAL_UART_Transmit(&huart1, (uint8_t *)printf_buff, length, 0xffff);
  return 0;
}

int my_printf_x(UART_HandleTypeDef *huart,const char *fmt, ...)
{
        int length;
       
        va_list ap;
        va_start(ap, fmt);//将ap初始化为变参数栈的栈顶指针
        length=vsnprintf((char *)printf_buff,sizeof(printf_buff), fmt, ap);//将指针ap传递给vsprintf做格式化处理
        va_end(ap);
       
        HAL_UART_Transmit(huart, (uint8_t *)printf_buff, length, 0xffff);
  return 0;
}


说明:
1.头文件中有__attribute__((format(printf, a, b)))这种写法,默认情况下编译器检查不出可变参数的类型或者个数是否正确,这就导致使用变参函数的时候,若稍不注意写错了参数,很难被发现和定位,__attribute__((format(printf, a, b)))的作用就是用来解决这个问题,它用于函数声明,作用是提示编译器检查函数调用的过程中,可变参数部分按照printf的规则进行检查,若参数的个数或者类型不匹配,编译过程中将会发出警告,这就使得前面提到的问题在编译期间就能发现。

2.函数my_printf_1() 固定使用串口1,函数my_printf_x() 则通过传参任意指定串口,大家根据需要 两个函数 任选其一即可;
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107452
QQ
发表于 2023-1-10 15:16:59 | 显示全部楼层
谢谢楼主分享,楼主可以考虑继续精进下,printf的所有部分都自己实现。

ChaN老师写的简易printf实现--xprintf,适合容量较小的芯片使用
https://www.armbbs.cn/forum.php? ... 6974&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107452
QQ
发表于 2023-1-10 15:17:01 | 显示全部楼层
谢谢楼主分享,楼主可以考虑继续精进下,printf的所有部分都自己实现。

ChaN老师写的简易printf实现--xprintf,适合容量较小的芯片使用
https://www.armbbs.cn/forum.php? ... 6974&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-1 12:36 , Processed in 0.272761 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表