实现printf功能代码效果

1、使用 vsnprintf 模拟 printf 功能

非宏定义情境下,可以用作开启通讯口调试功能

实际上是通过 vsnprintf 将接收到的 format格式化后解析到缓存区,这里存在缓存区大小限制,以及代码大小区别

#include <stdarg.h>
#include "stdio.h"
void HW_USART1_printf(const char *format, ...)
{
    va_list args;
    va_start(args, format);
    int num = vsnprintf((char *)USART1_Buff, USART1_Buff_Max, (char *)format, args);
    va_end(args);	
	USART1_DMASend(USART1_Buff, num);
}

 如下图示:使用上面函数后,代码量增加了7k

2、使用 stdio.h 以及 Use MicroLIB

//需要选择use MicroLIB,支持scanf 
int fputc(int ch, FILE *f)
{
	USART_SendData(USART1, (uint8_t) ch);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}	
    return ch;
}

int fgetc(FILE *f)
{
	while (!(USART1->SR & USART_FLAG_RXNE)){};
    return ((int)(USART1->DR & 0x1FF));
}

 如下图示:使用上面函数后,代码量增加了3k

3、使用 stdio.h ,不使用Use MicroLIB

//不需要选择use MicroLIB,不支持scanf   
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 
     
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 

//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0){};//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
	return ch;
}

 如下图示:使用上面函数后,代码量增加了1k

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫中眸zc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值