什么是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只提供双区内存模型,即单独的堆栈和堆区。

相关推荐
咖喱年糕16 天前
KEIL5 编译错误解决:MDK 5.37 及以上版本添加 AC5(ARM Compiler 5)编译器
arm开发·单片机·keil·嵌入式软件·ac5
木子单片机1 个月前
基于51单片机的步进电机调速系统设计
单片机·嵌入式硬件·51单片机·keil
木子单片机1 个月前
基于51单片机汽车智能灯光控制系统
stm32·单片机·嵌入式硬件·汽车·51单片机·keil
木子单片机2 个月前
基于51单片机出租车计费设计
stm32·单片机·嵌入式硬件·51单片机·keil
木子单片机2 个月前
基于51单片机的数字钟设计 数码管显示
stm32·单片机·嵌入式硬件·51单片机·keil
木子单片机2 个月前
基于51单片机温度上下限报警设计 数码管显示
stm32·单片机·嵌入式硬件·51单片机·keil
我在人间贩卖青春2 个月前
Keil代码格式化工具AStyle
keil·astyle
泛凡(Linyongui)2 个月前
PY32F002B实践之四--宠物腹背理疗仪项目踩坑及项目总结复盘
c语言·keil·32位单片机·腹背理疗仪项目实践·普苒py32
泛凡(Linyongui)3 个月前
PY32F002B实践之二--宠物腹背理疗仪项目介绍及头文件解析
c语言·keil·py32·32位单片机·腹背理疗仪项目实践