microlib 提供了一个有限的 stdio 子系统,它仅支持未缓冲的 stdinstdoutstderr。 这样,即可使用 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

下面是完整的资料:

在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,但未缓冲的 stdinstdoutstderr 除外。

  • 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.cextra.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 子系统,它仅支持未缓冲的 stdinstdoutstderr。 这样,即可使用 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 函数将返回错误(如果已实现)。 唯一的例外情况是以下三个标准流:stdinstdoutstderr

可配置的区域设置

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

信号

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

浮点支持

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

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

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

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

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

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

microlib 没有可重入变体。 microlib 不提供互斥锁来防止非线程安全的代码。 microlib 的

关于在MDK中使用 printf 函数的更多相关文章

  1. C 中 关于printf 函数中度剖析

    题外话  这篇博文主要围绕printf函数分析的,主要讲解printf 使用C的可变参数机制, printf是否可重入(是否线程安全), printf函数的源码实现. 正文 1.C中可变参数机制 我们 ...

  2. MFC 中的 “printf” 函数

    怀念C语言的我,MFC没法使用的C语言printf函数,于是: int MFCprintf(const char* m_data, ...){ CString str; char printf_buf ...

  3. 在keil中使用printf()函数的要点

    在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下: 1.printf函数是调用pu ...

  4. C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .

    我们在C语言编程中会遇到一些参数个数可变的函数,一般人对它的实现不理解.例如Printf(): Printf()函数是C语言中非常常用的一个典型的变参数函数,它 的原型为: int printf( c ...

  5. trueStudio中使用printf函数

    1.通过printf输出浮点数需要如下设置: 在工程属性下找到C/C++ build->Settings->Tool Settings->C Linker->Miscellan ...

  6. STM32中如何对printf函数重定向

    通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据,接下来我们现STM32工程上的printf()函数,方便用于程序开发中调试信息的打印. 方法一:使用MicroLIB库 ...

  7. STM32 printf()函数和scanf()函数重定向到串口

    STM32 printf()函数和scanf()函数重定向到串口 printf()函数和scanf()函数重定向 在学习STM32的时候,常常需要用串口来测试代码的正确与否,这时候就要要用到print ...

  8. 通过串口利用printf函数输出数据

    一.printf函数格式 printf函数具有强大的输出功能 %表示格式化字符串输出 目前printf支持以下格式的输出,例如: printf("%c",a);输出单个字符. pr ...

  9. 单片机中printf函数的重映射

    单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...

随机推荐

  1. Linux计算机进程地址空间与内核装载ELF

    本文基于Linux™系统对进程创建与加载进行分析,文中实现了Linux库函数fork.exec,剖析内核态执行过程,并进一步展示进程创建过程中进程控制块字段变化信息及ELF文件加载过程. 一.初识Li ...

  2. 严重: The web application [] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it.

    今日在重新部署项目时出现此问题,虽然对项目无影响,但问题就是问题.完整信息如下(使用idea工具): 十二月 05, 2015 11:44:27 上午 org.apache.catalina.star ...

  3. Spring 注解 @Resource和@Autowired(转)

    鸣谢:http://my.oschina.net/u/216467/blog/205951 @Resource和@Autowired两者都是做bean的注入使用. 其实@Resource并不是Spri ...

  4. js数组反转

    var _li = test.getElementsByTagName("li"), arrayObj = [].slice.apply(_li),//_li用apply调用sli ...

  5. uva 10739

    dp 只有三个操作  当str[i] != str[j] 时 dp(i, j) = min(dp(i+1, j), dp(i+1, j-1), dp(i, j-1)) #include <ios ...

  6. spoj 1436

    用并查集看一下是否会围成一个环  若围成环直接输出NO   当然 当 m >= n  时必然会围成环直接输出NO #include <algorithm> #include < ...

  7. js获取fck值的代码方法

    引入js文件 <script type="text/javascript" src="${basePath}/FCKeditor/fckeditor.js" ...

  8. eclipse 安装配置maven

    1.安装maven 插件 从eclipse 3.7(indigo)之后,m2e 插件已host到eclipse.org 站点下: Since Eclipse 3.7 (Indigo), m2e is ...

  9. HeadFirst设计模式之迭代器模式

    一. 1.迭代器模式是对遍历集合元素的抽象 2.The Iterator Pattern provides a way to access the elements of an aggregate o ...

  10. (原创)CityEngine 2014和ArcGIS 10.3冲突问题的解决

      先卸载ArcGIS License Manager 10.3 安装ArcGIS License Manager 10.2.2 用keygen算出ArcGIS 10.3的许可,似乎本许可在ArcGI ...