一种适用于小容量MCU的轻量级sprintf函数_有符号数

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);


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

一种适用于小容量MCU的轻量级sprintf函数_字符串_02


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

一种适用于小容量MCU的轻量级sprintf函数_字符串_03

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

一种适用于小容量MCU的轻量级sprintf函数_有符号数_04


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

一种适用于小容量MCU的轻量级sprintf函数_有符号数_05

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

一种适用于小容量MCU的轻量级sprintf函数_有符号数_06



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

一种适用于小容量MCU的轻量级sprintf函数_字符串_07

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


​​


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