MicroLIB

在keil 建立ARM的工程时其中有一项是选 use MicroLIB

microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行。

microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,例如,memcpy()。

与缺省 C 库之间的差异

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

可以合理地将 microlib 与 --fpmode=std 或--fpmode=fast 配合使用。

microlib 中的函数负责:

创建一个可在其中执行 C 程序的环境。 这包括:

创建一个堆栈

创建一个堆(如果需要)

初始化程序所用的库的部分组成内容。

调用 main() 以开始执行程序。

要使用 microlib 构建程序,必须使用命令行选项??library_type=microlib。 根据需要,编译器、汇编程序或链接器可使用此选项处理不同的文件。 将此选项与链接器配合使用时,将覆盖所有其他选项。

Example 3.1 说明了编译器使用此选项的情形,它仅为main.c 文件选择了microlib。

Example 3.1. 编译器选项
armcc ??library_type=microlib ?c main.c

armcc ?c extra.c

armlink ?o image.axf main.o extra.o

Example 3.2 说明了汇编程序使用此选项的情形,它仅为more.s 文件选择了microlib。

Example 3.2. 汇编程序选项
armcc ?c main.c

armcc ?c extra.c

armasm ??library_type=microlib more.s

armlink ?o image.axf main.o extra.o more.o

Example 3.3 说明了链接器使用此选项的情形,它为main.c 和extra.c 文件均选择了 microlib。

Example 3.3. 链接器选项
armcc ?c main.c
armcc ?c extra.c
armlink ??library_type=microlib ?o image.axfmain.o extra.o

使用MicroLIB:

3.3.1.创建堆栈

可通过将符号 __initial_sp 定义为与堆栈顶部相等来指定初始堆栈指针。 初始堆栈指针的对齐边界必须为 8 字节的倍数。

Example 3.4 说明了如何使用汇编语言来设置初始堆栈指针。
Example 3.4. 汇编语言
EXPORT __initial_sp
__initial_sp EQU 0x100000        ; equal to the top of the stack

Example 3.5 说明了如何使用C 中的嵌入式汇编程序来设置初始堆栈指针。


Example 3.5. C 中的嵌入式汇编程序
__asm void dummy_function(void){
 EXPORT __initial_sp

__initial_sp EQU0x100000 ; equal to the top ofthe stack

}

3.3.2.创建堆

可通过定义符号 __heap_base 和 __heap_limit 来分别指定堆的开头和结尾。 完成后,您可以按通常方式使用堆函数。

Note

__heap_limit 必须指向堆区中最后一个字节后面的字节。

Example 3.6 说明了如何使用汇编语言来设置堆指针。

Example 3.6. 汇编语言EXPORT __heap_base

__heap_base EQU0x400000 ; equal to the startof the heap

 EXPORT __heap_limit

__heap_limit EQU0x800000 ; equal to the end of theheap

Example 3.7 说明了如何使用C 中的嵌入式汇编程序来设置堆指针。


Example 3.7. C 中的嵌入式汇编程序
__asm void dummy_function(void){
 EXPORT __heap_base

__heap_base EQU 0x400000 ; equal to the start of the heap

 EXPORT __heap_limit

__heap_limit EQU0x800000 ; equal to the end of theheap

}

3.3.3.进入和退出程序

应在程序开头使用 main()。 不要将 main() 声明为使用参数。

Note

程序不能从 main() 返回内容。

microlib 不支持以下内容:

操作系统中的命令行参数

调用 exit() 的程序

3.4. 调整 microlib 输入/输出函数

microlib 提供了一个有限的 stdio 子系统,它仅支持未缓冲的 stdin、stdout和stderr。 这样,即可使用printf() 来显示应用程序中的诊断消息。

要使用高级 I/O 函数,您必须提供自己实现的以下基本函数,以便与您自己的 I/O 设备配合使用。

fputc()

为所有输出函数实现此基本函数。 例如,fprintf()、printf()、fwrite()、fputs()、puts()、putc()和putchar()。

fgetc()

为所有输入函数实现此基本函数。 例如,fscanf()、scanf()、fread()、read()、fgets()、gets()、getc() 和 getchar()。

__backspace()

如果输入函数使用 scanf() 或 fscanf(),则实现此基本函数。

Notemicrolib 中不支持的转换为 %lc、%ls 和 %a。

3.5. microlib 中缺少的 ISO C 特性

本节提供了 microlib 不支持的主要 ISO C90 特性的列表。

宽字符和多字节支持

microlib 不支持所有处理宽字符或多字节字符串的函数。 如果使用这些函数,则会产生链接器错误。 例如,mbtowc()、wctomb()、mbstowcs() 和wcstombs()。 microlib 不支持在标准附录 1 中定义的所有函数。

操作系统交互

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

文件 I/O

与文件指针交互的所有 stdio 函数将返回错误(如果已实现)。 唯一的例外情况是以下三个标准流:stdin、stdout和stderr。

可配置的区域设置

缺省 C 区域设置是唯一可用的区域设置。

信号

虽然提供了 signal() 和 raise() 函数,但microlib 不会生成信号。唯一的例外情况是程序显式地调用raise()。

浮点支持

浮点支持不符合 IEEE 754 标准。

产生不可预测的输出的运算是指:

涉及 NaN、无穷大或非正规数

依照正确的 IEEE 754 规则,并非通过不精确结果产生 IEEE 异常。 但是,microlib不会产生IEEE 异常,而是返回不可预测的结果。

另外,microlib 不会将零的符号视为有效位,并且会产生不可预测的输出。

与位置无关且线程安全的代码

microlib 没有可重入变体。 microlib 不提供互斥锁来防止非线程安全的代码。 microlib 的使用与 FPIC 或 RWPI 编译模式不兼容,但可以将 ROPI 代码与 microlib 进行链接,生成的二进制文件总体上与 ROPI 不兼容。

如何在KEIL中使用MicroLIB相关推荐

  1. KEIL中USB Microlib作用

    1.选上"Use MicroLIB"这是KEIL自带的一个简易的库,例如你用printf函数的时候,就会从串口1 输出字符串,直接默认定向到串口1 2.microlib 是缺省 C ...

  2. c语言程序如何在keil中运行,keil c51中C程序的启动过程

    汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接.下面看看它和main()函数是 ...

  3. 如何在 IAR和 KEIL中计算 CRC值

    关注.星标公众号,不错过精彩内容 转自:STM32单片机 前言 市面上越来越多的产品对其使用提出了安全要求,如何避免使用过程中对操作者带来危险,或者降低这种危险发生的概率,这都是产品安全性需要考虑的. ...

  4. 技术分享 | 如何在 IAR和 KEIL中计算 CRC值

    前言 市面上越来越多的产品对其使用提出了安全要求,如何避免使用过程中对操作者带来危险,或者降低这种危险发生的概率,这都是产品安全性需要考虑的.鉴于此,相关产品需要通过相关行业的安全认证才能生产上市.针 ...

  5. 如何在Keil(4或5)中添加WCH和STC单片机器件库

    我们在学习51编程过程中,经常用到的都是国产的STC或者WCH系列的51单片机,但是在Keil中却没有这些单片机的器件库,STC常见的单片机还好,可以用AT的型号代替,但是WCH和STC部分的单片器却 ...

  6. 如何在keil下实现单工程多目标的设置(选择性自动编译)

    最近在研究Cortex-M系列CPU,整了一个工程来进行不同MCU之间的移植测试,其中涉及到Cortex-M0.Cortex-M3.Cortex-M4等多款MCU.于是产生了一个想法,如何在Keil里 ...

  7. KEIL 不使用microlib 报错__stdin __stdout重复定义

    keil不使用microlib,在文件中添加如下函数,重定向printf void _sys_exit(int x) { x = x; } FILE __stdout; FILE __stdin; i ...

  8. 如何在SharePoint2010中添加Deep Zoom Image

    如何在SharePoint2010中添加Deep Zoom Image 应用范围 SharePoint 2010 Foundation:SharePoint 2010 Standard:SharePo ...

  9. php如何对数组进行分组,如何在PHP中对数组进行分组排序

    如何在PHP中对数组进行分组排序 发布时间:2021-01-04 16:28:51 来源:亿速云 阅读:98 作者:Leah 这篇文章将为大家详细讲解有关如何在PHP中对数组进行分组排序,文章内容质量 ...

最新文章

  1. AngularJS 1.x 国际化——Angular-translate例子
  2. JAVA正则忽略大小写
  3. 动态连接库的两种方式
  4. 压缩包安装mySQL 与 Qt中使用mySQL
  5. Redis实现延迟队列
  6. 植物病理学分类的高效网络体系结构的半监督噪声学生预训练
  7. python表白代码-表白python代码
  8. 成形滤波器和匹配滤波器
  9. 物流企业matlab效率,基于DEA原理的物流企业综合效率评价
  10. python进行回归方程显著性检验
  11. vue 在线答题功能
  12. 【Git】git init
  13. win10商店无法打开,错误0x80131500、0x80072EFD
  14. html请求资源不可用,HTTP状态404 – 请求的资源(/)不可用
  15. 【读书笔记】《中央帝国的财政密码》
  16. python数据分析002—python基础语法
  17. c语言多组变量输入数据,C/C++中输入多组数据的方法
  18. 快手,字节跳动,百度,美团Offer之旅(Android面经分享)
  19. PHP应用-一揽子解决方案
  20. android 高德地图标记,android学习之高德地图添加标记

热门文章

  1. java web网上书店_java web简易网上书店项目系列,使用MVC模式(servlet+jstl+dbutils),开篇...
  2. Linux系统下载FTP服务器文件
  3. 一键部署安装的LAMP单独升级PHP
  4. IIS 下载 .dll .exe .config的配置方法
  5. [20160806]ROWDEPENDENCIES.txt
  6. 每天一张思维导图《国富论》
  7. 潘爱民老师“Windows内核技术介绍”演讲视频下载
  8. AWC / Advanced SystemCare Pro(专业版)V3.7.0+有效注册码
  9. PIM SM + IGMP Snooping 适用性测试(二) ttl 问题
  10. 【活动】免费来拿计算机图书啦——“让计算机图书更有价值”活动