注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题

manhuami2007的个人空间 http://home.eeworld.com.cn/?73766 [收藏] [复制] [分享] [RSS]

日志

Keil中的Microlib你了解吗?

已有 531 次阅读2017-2-21 20:03 | 嵌入式, C语言, microlib, keil

使用Keil编译代码时,经常会默认勾选上use Microlib,但是Microlib到底是什么呢?使用的时候需要注意什么呢?


Microlib是什么

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


Microlib的区别

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

  1. main()函数不能带参数,并且main()不能返回。

  2. Microlib不支持生成"位置无关的代码(position-independent code)"。因此使用Microlib编写的程序不能生成可用的共享库,即.lib文件。

  3. 在默认的情况下,调用stdio.h中与文件指针(FILE变量类型)交互相关的函数都会返回错误,仅有的例外情况是以下三个标准流:stdin、stdout 和 stderr

    为什么说这三个是例外:这三个实际上是3个宏,原型也是指向FILE类型的变量,因此可以看为特殊的文件指针,它们分别代表标准输入流,标准输出流,标准错误流。

    上面提到的是默认情况,若是想使用支持ANSI C标准的stdio.h库,可以使用语句#pragma import(__use_full_stdio)来更改默认情况。不过也有几个函数是例外:

    i.不支持错误和EOF指示符,因此feof()和ferror()总是返回0;

    ii.所有的流都是未缓冲的,所以setbuf()和setvbuf()会调用失败。

  4. Microlib不会生成信号。比如说signal(SIGINT, sighandler);使用SIGINT信号触发sighandler。程序是不会产生SIGINT信号的。除非使用raise(SIGINT)显式的调用raise()来产生信号。

  5. 不支持与操作系统交互的函数,例如abort()、exit()、atexit()、clock()、time()、system() 和 getenv()。

  6. 浮点支持在以下几个方面不符合 IEEE 754,但在仅涉及规范化数的运算中使用相同的数据格式并符合 IEEE 754:

    a. 涉及 NaN、无穷大或非正规数的运算可能会产生不可预测的结果。

    b. microlib 不能标记 IEEE 异常,并且 microlib 中没有 fp_status() 寄存器。

    c. microlib 不会将零的符号视为有效位,并且 microlib 浮点算法输出中的零可能会包含不可预测的符号位。

    d. 仅支持缺省的舍入模式。

总结

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


欢迎关注微信公众号“光豆儿”,获取更多嵌入式文章


评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-5-27 02:59 , Processed in 0.196381 second(s), 10 queries , Redis On.

Powered by EEWORLD电子工程世界

© 2017 http://bbs.eeworld.com.cn/

返回顶部