关于在MDK中使用 printf 函数
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:
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 的
关于在MDK中使用 printf 函数的更多相关文章
- C 中 关于printf 函数中度剖析
题外话 这篇博文主要围绕printf函数分析的,主要讲解printf 使用C的可变参数机制, printf是否可重入(是否线程安全), printf函数的源码实现. 正文 1.C中可变参数机制 我们 ...
- MFC 中的 “printf” 函数
怀念C语言的我,MFC没法使用的C语言printf函数,于是: int MFCprintf(const char* m_data, ...){ CString str; char printf_buf ...
- 在keil中使用printf()函数的要点
在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下: 1.printf函数是调用pu ...
- C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .
我们在C语言编程中会遇到一些参数个数可变的函数,一般人对它的实现不理解.例如Printf(): Printf()函数是C语言中非常常用的一个典型的变参数函数,它 的原型为: int printf( c ...
- trueStudio中使用printf函数
1.通过printf输出浮点数需要如下设置: 在工程属性下找到C/C++ build->Settings->Tool Settings->C Linker->Miscellan ...
- STM32中如何对printf函数重定向
通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据,接下来我们现STM32工程上的printf()函数,方便用于程序开发中调试信息的打印. 方法一:使用MicroLIB库 ...
- STM32 printf()函数和scanf()函数重定向到串口
STM32 printf()函数和scanf()函数重定向到串口 printf()函数和scanf()函数重定向 在学习STM32的时候,常常需要用串口来测试代码的正确与否,这时候就要要用到print ...
- 通过串口利用printf函数输出数据
一.printf函数格式 printf函数具有强大的输出功能 %表示格式化字符串输出 目前printf支持以下格式的输出,例如: printf("%c",a);输出单个字符. pr ...
- 单片机中printf函数的重映射
单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...
随机推荐
- WDS无线桥接
因为放假回家,长时间不在家,家里也没什么人,所以也就没有网可以用.为了两个月办宽带又不值得,太过浪费了.于是就只能蹭网用了.当然,要和邻居打个招呼或者你能搞定密码的情况下不打招呼(嘿嘿...).但是有 ...
- Linux find example
find | xargs echo >> x1 find -exec echo {} \; >> x2 1.查找/var目录下属主为root并且属组为mail的所有文件:fin ...
- suse pshell连接不上
/etc/ssh/sshd_config #PasswordAuthentication no改成yessuse默认为密钥认证
- APP 上传之后出现"invalid binary" 问题解决汇总
背景 5.1 号开始 App 审核开始强制支持 iPhone5,并禁止使用 UDID. 问题 上传 app 后一直处于 Invalid Binary 状态,并且收到一封邮件说 Non-public A ...
- hibernate annotation注解 columnDefinition用法
column注解中的columnDefinition属性用于覆盖数据库DDL中的语句:(MySql) @Column(columnDefinition = "int(11) DEFAULT ...
- http://nxlhero.blog.51cto.com/962631/1666250?plg_nld=1&plg_uin=1&plg_auth=1&plg_nld=1&plg_usr=1&plg_vkey=1&plg_dev=1
http://nxlhero.blog.51cto.com/962631/1666250?plg_nld=1&plg_uin=1&plg_auth=1&plg_nld=1&am ...
- Qt串口通信接收数据不完整的解决方法(传输图片)
在使用串口接收数据时,当数据量大的时候会出现数据接收不完整的情况.因为串口数据获取函数readAll()由readyRead()信号触发,但readyRead()信号在串口读到起始标志时立即发送,并不 ...
- Qt: qobject_cast<QPushButton*>(sender()) 简化信号与槽的编写
当你觉得写代码是一件重复性极高的工作时,这时你就应该考虑换个方式来实现了. 提高代码效率,减少代码量. 代码片: void Widget::onClicked() { QPushButton* but ...
- 关于 hot code replace fail 问题 .
频频出现Hot code replace failed问题.网上查不到解决方法,想来想去,是否是jvm的问题?我的jre使用自己下载的jdk1.6.07,而MyEclipse的jvm自带的是1.5.0 ...
- 关于ckeditor添加的class都会被清除掉的问题
在源码中输入ul,并且带有class,然后点击源码,到可视化界面 结果显示为aaa,再点看源码,查看HTML源代码 解决方法: 添加配置 config.allowedContent = true 这个 ...