本帖最后由 zhangt0713 于 2021-7-3 23:49 编辑
Keil MDK,时我们用的比较的一款IDE,分享下keil下Microlib和ARM标准C库的一些区别 我们在使用Keil MDK编程,用到printf打印输出,通常都会使能Keil工具自带的微库 曾经使用过sprinf,这个函数进行格式化字符串时,出现过一些问题 具体情况如下: 使用sprintf 格式化十进制,十六进制为字符串等,可以正常工作 sprintf((char*)Data_Str,"temperature:%d,Humidity:%d",35,65);
格式化浮点数时,出现问题,卡在sprinf那里了,最后勾选了Microlib解决此问题。 sprintf((char*)Data_Str,"temperature:%0.1f,Humidity:%0.1f",35.6,65.7); 具体的不通过勾选Microlib怎么去解决没有去深究过
1.什么是MicroLib MicroLib是针对以C语言编写的基于ARM嵌入式应用程序的高度优化的库。 与ARM Compiler工具链附带的标准C库相比,MicroLib具有明显的代码大小优势
上图是一个性能基准测试代码,通过上图可以发现,微库在不同内核下代码量明显少很多。
C语言标准库,我们经常都会调用,比如:<stdio.h>、 <stdlib.h>、 <string.h>、 <math.h>、 <error.h>、 <assert.h>等库文件。在这些文件下还有很多各类库函数,比如:printf()、 malloc()、 memcpy()、 strncpy()等。
2.微库和ARM标准C库区别 因为针对Arm的嵌入式系统,通常存储(代码)资源相对较小,为了使其能用上标准函数,工程师就针对Arm嵌入式系统,对标准 C库进行了优化,以减小代码量。
优化标准库,肯定会带来一些差异,下面分享几点主要的差异: (1)MicroLib经过优化,比使用ARM标准库使用更少的代码和数据内存。 (2)缺少一些不常用标准库函数,比如:文件 I/O 的库函数。 (3)由于MicroLib已经过优化以最小化代码大小,一些函数的执行速度将比ARM编译工具中可用的标准C库例程慢。 (4)可用于RTOS这类系统中,但不支持在像Windosw这类系统中。
注意: (1)MicroLIB和C标准库互斥,两者不能同时使用,只能2选1; (2) 使用MicroLIB后就可以直接使用printf()往串口终端打印信息了,默认使用串口1; (3) MicroLIB提供了一个有限的 stdio子系统,它仅支持未缓冲的 stdin、stdout和stderr, 要使用高级 I/O 函数,必须自己对fputc()、fgetc()和__backspace()基本函数进行修改; (4)MicroLIB中不支持的转换为 %lc、%ls和 %a; (5) MicroLIB不支持与操作系统交互的所有函数,例如:abort()、exit()、atexit()、clock()、time()、system()和getenv();
|