keil应用小贴士:microLIB 本是古典 何须时尚 2022-10-01 04:40 359阅读 0赞 在keil (我用的是realview mdk3.11)建立ARM的工程时 其中有一项是选 use MicroLIB 由于对KEIL不是很熟悉,于是就查了查,得到了以下信息: 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.axf main.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 EQU 0x100000 ; equal to the top of the stack \} 3.3.2. 创建堆 可通过定义符号 \_\_heap\_base 和 \_\_heap\_limit 来分别指定堆的开头和结尾。 完成后,您可以按通常方式使用堆函数。 Note \_\_heap\_limit 必须指向堆区中最后一个字节后面的字节。 Example 3.6 说明了如何使用汇编语言来设置堆指针。 Example 3.6. 汇编语言 EXPORT \_\_heap\_base \_\_heap\_base EQU 0x400000 ; equal to the start of the heap EXPORT \_\_heap\_limit \_\_heap\_limit EQU 0x800000 ; equal to the end of the heap 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 EQU 0x800000 ; equal to the end of the heap \} 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 不兼容。 转自:[http://hotpower.21ic.org/user1/3691/archives/2008/45351.html][http_hotpower.21ic.org_user1_3691_archives_2008_45351.html] [http_hotpower.21ic.org_user1_3691_archives_2008_45351.html]: http://hotpower.21ic.org/user1/3691/archives/2008/45351.html
相关 C/C++混合编程小贴士 .c文件被.cpp文件调用时,需要在头文件中添加如下定义: ifdef __cplusplus extern "C" { end £神魔★判官ぃ/ 2022年10月11日 13:32/ 0 赞/ 23 阅读
相关 keil应用小贴士:microLIB 在keil (我用的是realview mdk3.11)建立ARM的工程时 其中有一项是选 use MicroLIB 由于对KEIL不是很熟悉,于是就查了查,得到了以下信 本是古典 何须时尚/ 2022年10月01日 04:40/ 0 赞/ 360 阅读
相关 提高敏捷回顾效果的小贴士 提高敏捷回顾效果的小贴士 作者 Mark Levison译者 张晓庆 【整理】:Ackarlix 《敏捷回顾: 让团队从优秀到卓越》的作者之一[Esther Derb 墨蓝/ 2022年08月24日 06:23/ 0 赞/ 188 阅读
相关 小贴士 text-indent text-indent是用来首行缩进的,我平时呢都是这么用的,一般在段落上才会用,今天群里的大神,说了一种全新的理解,用来隐藏文字,用图片代替文字显示,很简单也很实用,所以记录 骑猪看日落/ 2022年08月03日 00:51/ 0 赞/ 200 阅读
相关 Keil中使用MicroLib,以及malloc The C Standard Library (stdlib.h) contains a number of useful and common tools, includin 待我称王封你为后i/ 2022年05月31日 02:08/ 0 赞/ 441 阅读
相关 Keil中的USE MicroLib说明 出处:[https://www.cnblogs.com/zyqgold/p/6114637.html][https_www.cnblogs.com_zyqgold_p_6114 忘是亡心i/ 2022年05月29日 09:15/ 0 赞/ 218 阅读
相关 关于 Kotlin REPL 的两条小贴士 Kotlin 自带了交互式编程命令行,即 REPL(Read-Eval-Print Loop 的简写,直译为 “读取-求值-输出”循环),尤其适合快速实验一些东西。 本文只讲关 旧城等待,/ 2022年04月25日 07:32/ 0 赞/ 248 阅读
相关 SpringCloud实战小贴士:随机端口 > 太久没有更新,一时不知道该从哪儿开始,索性就从一个小技巧开始吧。 在之前的《Spring Cloud构建微服务架构》系列博文中,我们经常会需要启动多个实例的情况来测试注册 迷南。/ 2022年02月02日 03:49/ 0 赞/ 274 阅读
相关 生活贴士 1.打嗝的时候,舌头下面含白糖!打嗝的时候 捏着鼻子喝水就好了,打嗝的时候用大拇指用力掐中指指腹。就不会了 2.每天用红红的上海药皂洗脚,洗袜子鞋垫神秘的,可以去脚臭。 朱雀/ 2022年01月17日 06:13/ 0 赞/ 412 阅读
还没有评论,来说两句吧...