keli4 指针运算_如何在KEIL中使用MicroLIB | 学步园
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 不兼容。
keli4 指针运算_如何在KEIL中使用MicroLIB | 学步园相关推荐
- 如何在KEIL中使用MicroLIB
MicroLIB 在keil 建立ARM的工程时其中有一项是选 use MicroLIB microlib 是缺省 C 库的备选库. 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用. 这些 ...
- figma设计_如何在Figma中构建设计入门套件(第1部分)
figma设计 Figma教程 (Figma Tutorial) Do you like staring at a blank canvas every time you start a new pr ...
- 在excel日期比对大小_如何在Excel中防止分组日期
在excel日期比对大小 As a teenager, group dates can be fun. If you have strict parents, that might be the on ...
- 表格在整个html居中显示,html 表格字符居中显示_如何在HTML中居中显示表格?
html 表格字符居中显示_如何在HTML中居中显示表格? html 表格字符居中显示_如何在HTML中居中显示表格? html 表格字符居中显示 HTML table provides the ab ...
- java如何给一个链表定义和传值_如何在CUDA中为Transformer编写一个PyTorch自定义层...
如今,深度学习模型处于持续的演进中,它们正变得庞大而复杂.研究者们通常通过组合现有的 TensorFlow 或 PyTorch 操作符来发现新的架构.然而,有时候,我们可能需要通过自定义的操作符来实现 ...
- java 查找链表中间元素_如何在Java中一次性查找Java中链表的中间元素
如何在一次传递中找到LinkedList的中间元素?这是一个 Java 和非Java程序员面试时经常被问到的编程问题.这个问题类似于检查回文或计算阶乘,有时也会要求编写代码.为了回答这个问题,候选人必 ...
- word中 有注释标签吗_如何在Word中注释图像
word中 有注释标签吗 If you're writing a document that includes images, you may want to add annotations to t ...
- java 正则表达式 开头_如何在Java中修复表达式的非法开头
java 正则表达式 开头 您是否遇到过这个令人难以置信的错误,想知道如何解决它? 让我们仔细阅读一下,研究如何解决表达式Java非法开头错误. 这是一个动态错误,这意味着编译器会发现某些不符合Jav ...
- python 线性回归模型_如何在Python中建立和训练线性和逻辑回归ML模型
python 线性回归模型 Linear regression and logistic regression are two of the most popular machine learning ...
- hive 元数据 自定义_如何在Hive中创建自定义函数UDF及如何直接通过Impala的同步元数据重用UDF的jar文件-阿里云开发者社区...
如何在Hive中创建自定义函数UDF及使用 如何在Impala中使用Hive的自定义函数 UDF函数开发 使用Intellij工具开发Hive的UDF函数,进行编译: 1.使用Intellij工具通过 ...
最新文章
- python线程信号量semaphore
- Ubuntu 循环显示登录界面
- OpenJudge 2739 计算对数
- 电商搜索能力解读-实体识别(NER)
- java中的与或非_与或非 · java development · 看云
- JavaScript-操作DOM对象-获得dom节点
- IDEA入门(一):简介、安装
- RedHat 设置IP、网关、DNS
- 使用梯度下降与牛顿法求解最小平方和问题
- 小程序界面设计难?有了这个高颜值UI,我带你一步步解决所有难题
- 配音软件文字转语音有哪些?
- 通俗讲解:傅立叶分析和小波分析之间的关系
- JVM学习笔记(12) 垃圾回收-垃圾回收相关算法
- Norgen AAV提取剂盒说明书(含特色)
- 练习4-7 求e的近似值
- 概念模型计算机实验总结,计算机组成原理——cpu的简单模型实验报告
- 【Python】python 字符串转数字
- Linux下Rootkit介绍
- java抑制警告注解
- 【通俗向】方差分析--几种常见的方差分析
热门文章
- Floyd算法(matlab实现)
- Caused by: java.lang.SecurityException: com.example.geofences from uid 10049 not allowed to perform
- everyting真是一款很好的搜索软件, 免费软件
- 讨教大学|FMEA成功实施的关键是什么?
- Xshel和Xftp免费版
- oracle之sqlloader
- CarMaker与NS3联合仿真平台--安装
- 网上预约订餐系统(联网可用)
- TP框架的目录结构总结
- android tv 蓝牙服务_5款面向Android TV的优秀文件管理器