什么是KEIL的微库(microlib)?

就是下面这个选项:

Microlib是什么

Microlib也是一个C语言的库。它是为了小内存的嵌入式系统设计的,用于代替标准C语言库,但是Microlib对标准C语言库进行了裁剪和优化,因此并不完全兼容标准C语言库。Microlib相比于标准库,代码量能少多少呢?下图为Microlib与标准C语言库所占空间的对比。可以看出代码大小减少了约2/3。

Microlib的区别

当然容量的减小是以牺牲性能为代价的。为了减少容量,MicroLib去掉了一些函数功能,并对一些函数做了空间上的优化。那么Microlib都有哪些不一样呢?

    1. main()函数不能带参数,并且main()不能返回
    1. Microlib不支持生成"位置无关的代码(position-independent code)"。因此使用Microlib编写的程序不能生成可用的共享库,即.lib文件
    1. 在默认的情况下,调用stdio.h中与文件指针(FILE变量类型)交互相关的函数都会返回错误,仅有的例外情况是以下三个标准流:stdin、stdout 和 stderr。
      为什么说这三个是例外:这三个实际上是3个宏,原型也是指向FILE类型的变量,因此可以看为特殊的文件指针,它们分别代表标准输入流,标准输出流,标准错误流。
      上面提到的是默认情况,若是想使用支持ANSI C标准的stdio.h库,可以使用语句 #pragma import(__use_full_stdio) 来更改默认情况。不过也有几个函数是例外:
      • 1.不支持错误和EOF指示符,因此feof()和ferror()总是返回0;
      • 2.所有的流都是未缓冲的,所以setbuf()和setvbuf()会调用失败。
    1. Microlib不会生成信号。比如说signal(SIGINT, sighandler);使用SIGINT信号触发sighandler。程序是不会产生SIGINT信号的。除非使用raise(SIGINT)显式的调用raise()来产生信号。
    1. 不支持与操作系统交互的函数,例如abort()、exit()、atexit()、clock()、time()、system() 和 getenv()。
    1. 浮点支持在以下几个方面不符合 IEEE 754,但在仅涉及规范化数的运算中使用相同的数据格式并符合 IEEE 754:
      *
      1. 涉及 NaN、无穷大或非正规数的运算可能会产生不可预测的结果。
        1. microlib 不能标记 IEEE 异常,并且 microlib 中没有 fp_status() 寄存器。
        1. microlib 不会将零的符号视为有效位,并且 microlib 浮点算法输出中的零可能会包含不可预测的符号位。
        1. 仅支持缺省的舍入模式。

总结

从上面的缺失功能可以看出,在一般的控制应用中使用Mircrolib就足够了。

MicroLib是针对以C语言编写的基于ARM嵌入式应用程序的高度优化的库

与ARM Compiler工具链附带的标准C库相比,MicroLib具有明显的代码大小优势。

微库与标准C库区别

因为针对Arm的嵌入式系统,通常存储(代码)资源相对较小,为了使其能用上标准函数,工程师就针对Arm嵌入式系统,对标准C库进行了优化,以减小代码量。

优化标准库,肯定会带来一些差异,下面分享几点主要的差异:

1.代码(数据)量更小 (对比上图)

2.缺少一些不常用标准库函数,比如:文件 I/O 的库函数。

3.微库最大程度优化代码量,可能会导致有些库代码运行速度更慢。

4.可用于RTOS这类系统中,但不支持在像Windosw这类系统中。

MicroLib是缺省c库的备选库,它可装入少量内存中,与嵌入式应用程序配合使用,且这些应用程序不在操作系统中运行。

MicroLib进行了高度优化以使代码变得很小,功能比缺省c库少,不具备某些ISO c特性,部分库函数的运行速度也比较慢,如内存拷贝函数memcpy()。

MicroLib与缺省c库之间的主要差异在网上有许多文章都有写到,这里摘抄记录:

  • MicroLib 不符合 ISO C 库标准。不支持某些 ISO 特性,并且其他特性具有的功能也较少。

  • MicroLib 不符合 IEEE 754 二进制浮点算法标准。

  • MicroLib 进行了高度优化以使代码变得很小。

  • 无法对区域设置进行配置。缺省 C 区域设置是唯一可用的区域设置。

  • 不能将 main() 声明为使用参数,并且不能返回内容。

  • 不支持 stdio,但未缓冲的 stdin、stdout 和 stderr 除外。

  • MicroLib对 C99 函数提供有限的支持。

  • MicroLib不支持操作系统函数。

  • MicroLib不支持与位置无关的代码。

  • MicroLib不提供互斥锁来防止非线程安全的代码。

  • MicroLib不支持宽字符或多字节字符串。

  • 与stdlib不同,MicroLib不支持可选择的单或双区内存模型。MicroLib只提供双区内存模型,即单独的堆栈和堆区。

相关推荐
yutian06062 天前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
whik119410 天前
Keil-MDK开发环境编译后axf自动转换bin格式文件
stm32·arm·keil·axi·bin·mdk
ShiinaKaze16 天前
【Keil】Keil MDK 已经不再提供 ARM Compiler v5
keil·arm compiler·mdk
沅_Yuan22 天前
蓝桥杯嵌入式入门指南-RTC【8】
蓝桥杯·嵌入式·keil·rtc·cubmx
沅_Yuan24 天前
蓝桥杯嵌入式入门指南-UART【7】
蓝桥杯·嵌入式·uart·keil·cubmx
mirevass1 个月前
【嵌入式软件-STM32】OLED显示屏+调试方法
stm32·单片机·嵌入式硬件·学习·keil
记帖1 个月前
STM32H503开发(2)----STM32CubeProgrammer烧录
stm32cubemx·开发板·keil·usb·烧录·stm32h503cb·stm32cubeprog
星羽空间3 个月前
win11下 keil报错Cannot load driver ‘D:\Keil_v5\ARM\Segger\JL2CM3.dll‘
arm开发·keil
汽车电子助手3 个月前
【STM32开发环境搭建】-4-在STM32CubeMX中新增Keil(MDK-ARM) 5的工程目录(包含指定路径的C和H文件)
c语言·arm开发·stm32·stm32cubemx·keil
KaminLuo3 个月前
keil 下载安装 保姆级教程
stm32·单片机·嵌入式硬件·keil