一种适用于小容量MCU的轻量级sprintf函数

5f4f1aac58d8d0ae2be5148105df1e91.png

sprintf是一个非常好用的格式打印函数,可以将各种类型的数值或者字符打印到字符串中,方便数据传输。但是对于嵌入式系统来说,特别是小容量的MCU,该函数编译后占用空间较大,使用受限。今天来介绍一个适用于小容量MCU的sprintf函数:mini-printf。

使用该函数只需将两个文件添加到工程中,并包含头文件#include "mini-printf.h"

文件链接:https://pan.baidu.com/s/1iII1CT4eSRF_Vp-NVCO5gw

提取码:d3u0

使用方式如下:

char buff[100];
mini_snprintf(buff, sizeof buff, "testing %d %d %07d\r\n", 1, 2, 3);

与sprintf类似,只是多了一个参数(第二个参数),其它方面完全一样。

接着来测试一下它的性能。程序如下,打印各种类型的数据到字符串,并输出到串口。

mini_snprintf(buff, sizeof buff, "testing %d %d %07d\r\n", 1, 2, 3);
  HAL_UART_Transmit(&huart1,(uint8_t*)buff,strlen(buff),1000);
  mini_snprintf(buff, sizeof buff, "faster %s %ccheaper%c\r\n", "and", 34, 34);
  HAL_UART_Transmit(&huart1,(uint8_t*)buff,strlen(buff),1000);
  mini_snprintf(buff, sizeof buff, "%x %% %X\r\n", 0xdeadf00d, 0xdeadf00d);
  HAL_UART_Transmit(&huart1,(uint8_t*)buff,strlen(buff),1000);
  mini_snprintf(buff, sizeof buff, "%09d%09d%09d%09d%09d\r\n", 1, 2, 3, 4, 5);
  HAL_UART_Transmit(&huart1,(uint8_t*)buff,strlen(buff),1000);
  mini_snprintf(buff, sizeof buff, "%d %u %d %u\r\n", 50, 50, -50, -50);
  HAL_UART_Transmit(&huart1,(uint8_t*)buff,strlen(buff),1000);

可以看到,十进制、十六进制、字符型、有符号数据、无符号数据均可正常输出。

c83e22e12013d66a7fba916d3adeef74.png

下面来看下编译后占用flash情况,原工程编译后占用flash大小为3630字节:

fc98b98255791f9cae059b85d7f5a638.png

添加sprintf函数编译后占用5556字节:

9fdc587d2785e705edd472009d59553d.png

添加mini_snprintf函数编译同样程序,占用4696字节,比sprintf少了将近1KB:

07d11ea15d0cbc8651daf522d59cd896.png

接下来测试一下运行速度,使能了一个定时器,运行前清零,运行后读取定时器的值。并打印出来,对比两者耗时。

541c3615ef787946b9e2c324a7912ceb.png

使用sprintf函数运行耗时约13.4ms,使用mini_snprintf函数运行耗时11.7ms。(测试用的STM32F103,72M主频)

4e3f414ffc132da97421944a8f61f9b1.png

    可以看到,mini-snprintf函数在时间和空间上均有优化,虽然不多,但是对于小容量的单片机,还是非常有优势的。

推荐阅读:

STM32CubeMX系列教程

STM32HAL库移植FreeModbus协议(含源码)

Modbus常用功能码协议详解

STM32使用CMSIS DSP库

   欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值