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
。
下面是完整的资料:
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 只提供双区内存模型,即单独的堆栈和堆区。
-
可以合理地将 microlib 与
--fpmode=std
或--fpmode=fast
配合使用。
microlib 中的函数负责:
-
创建一个可在其中执行 C 程序的环境。 这包括:
-
创建一个堆栈
-
创建一个堆(如果需要)
-
初始化程序所用的库的部分组成内容。
-
-
调用
main()
以开始执行程序。
??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:
可通过将符号 __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 }
可通过定义符号 __heap_base
和 __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 }
应在程序开头使用 main()
。 不要将 main() 声明为使用参数。
microlib 不支持以下内容:
-
操作系统中的命令行参数
-
调用
exit()
的程序
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
。
本节提供了 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 的