法1:使用MicroLIB库
1.1 KEIL-MDK中的Use MicroLIB选项
在MDK开发环境中,MicroLib是缺省c库的备选库,它可装入少量内存中,与嵌入式应用程序配合使用,且这些应用程序不在操作系统中运行。
MicroLib进行了高度优化以使代码变得很小,功能比缺省c库少,不具备某些ISO c特性,部分库函数的运行速度也比较慢,如内存拷贝函数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只提供双区内存模型,即单独的堆栈和堆区。
1.2 重定向fputc函数
在MicroLib的stdio.h中,fputc()函数的原型为:此函数原本是将字符ch打印到文件指针stream所指向的文件流去的,现在我们不需要打印到文件流,而是打印到串口1。基于前面的代码:注意,需要包含头文件stdio.h,否则FILE类型未定义。勾选了Use MicroLib选项,重定向fputc()函数后,我们就可以在工程代码中使用printf()函数了:printf()函数的使用方法跟之前一样,运行结果:法2:不使用MicroLIB库
2.1 半主机模式
半主机模式是ARM的一种机制,实现将来ARM应用程序代码的输入/输出请求传送至运行着调试器的主机。例如设置使用半主机模式下的ARM应用程序,可以使用printf()和scanf()来使用主机的显示器和键盘,而不需要在ARM系统上搭配显示器和键盘。半主机通过一组定义好的软件指令(如SVC)来实现的,这些指令在程序控制下产生异常,ARM应用程序调用半主机对应的异常处理函数,然后调试代理处理该异常。一般的ARM应用程序中并不需要半主机操作,在这里为确保ARM应用程序中没有链接MicroLib的半主机相关函数,我们要取消ARM的半主机工作模式。2.2 实现代码
在工程中加上如下代码:这样操作后,在不使用MicroLib的前提下,仍能使用printf()函数将调试信息打印到USART1上了。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
操作系统
+关注
关注
37文章
6808浏览量
123286 -
STM32
+关注
关注
2270文章
10896浏览量
355757 -
函数
+关注
关注
3文章
4327浏览量
62574
原文标题:STM32的printf函数重定向方法
文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
stdio.h实现了printf函数?
我们平时包含的 stdio.h 头文件,里面是不是实现了 printf 函数? 为什么会有这个疑问?因为每次使用 printf,就得包含 stdio.h ,这就导致很多同学误以为,stdio.h
嵌入式 学习-飞凌嵌入式ElfBoard ELF 1板卡-shell脚本编写之输入输出重定向
终端)更改为从指定文件中获取。输出重定向使用方法:1.命令 > 文件名(将命令执行的结果输出到文件中,输出的结果会覆盖掉文件原来的内容)。2.命令 >
发表于 09-24 10:06
飞凌嵌入式ElfBoard ELF 1板卡-shell脚本编写之输入输出重定向
重定向使用方法:1.命令 > 文件名(将命令执行的结果输出到文件中,输出的结果会覆盖掉文件原来的内容)。2.命令 >> 文件名(将命令
发表于 09-23 10:23
重定向了fputc及putchar函数,但printf没有输出,为什么?
重定向了fputc及putchar函数,但printf没有输出
删除了drivers/drv_uart.c drv_uart.h
删除了文件rt-thread\\components
发表于 07-18 07:44
esp32c3能不能将串口打印函数重定向到自己软件模拟的uart上?
模拟uart,用于打印日志;请问这种做法可以实现吗?可以将打印函数重定向到该模拟uart吗?如果可以,麻烦指导一下重定向需要修改哪几个函数?
ps:打印的
发表于 06-20 06:32
请问如何将printf使用的stdout重定向到asclin?
/v4.9.3.0-infineon-1.0/docs/userguide.pdf 第 406 页中关于 printf 的唯一说明是 stdout 重定向到模拟 io 调试器。
当然,您可以使用 Ifx_Console_print,但我想知道是否可以通过标准库来实现。
发表于 06-03 06:48
芯海通用 MCU应用笔记 :在 IAR 及 MDK 开发环境下使用 printf 函数重定向移植差异指南
对 printf 函数支持的差异。并在本应用笔记结尾处给出可以一键移植到 Keil、IAR8.x、IAR9.x 版本下的通用重定向代码。
Keil 和 IAR 都是常用的开发工具 IDE,在实际项目开发
发表于 05-16 11:56
STM32F103RCT6串口重定向数据发送和接收,如何才能不接收MCU发出去的数据?
不知道各位有没有出现过这样的情况,我使用STM32F103RCT6芯片编写串口程序,重定向printf函数到串口1,数据可以正常地发送和接收,但是有个问题
我仿真的时候发现,我每次用
发表于 05-16 08:25
求助,关于HAL下的printf重定向输出疑问求解
(1)网上查了使用printf重定向,串口输出,函数如下,使用HAL_UART_Transmit函数。
int fputc(int ch,FILE *f)
{
uint8_t tem
发表于 05-10 06:04
STM8S如何在STVD环境下重定向printf函数实现UART简化输出?
printf(),网上IAR环境的重定向调通了,求STVD环境下的code。
3. 用STM8的官方例程UART1_Printf在STVD环境下编译OK,但是debug时候报错下载不了程序
4. 针对3
发表于 04-30 08:29
STM8L051片子使用重定向printf函数时总是报错,没办法引用printf函数是什么原因?
STM8L051片子使用重定向printf函数时总是报错,没办法引用printf函数,不知道是什么原因,使用的是IAR编译器,总是报内存不足
发表于 04-28 08:05
用keil仿真无法用printf打印怎么解决?
用keil仿真 无法用printf打印.想用printf重定向到Usart1的方法,使printf打印信息能够在UART#1的窗口打印出来.
发表于 04-11 08:20
STM32CubeIDE中打印重定向报错怎么解决?
HAL_UART_Transmit( huart1 , (uint8_t *) ch, 1, 0xFFFF);报错
printf重定向 报错../Core/Src/main.c:42:21: error: \'huart1\' undeclared
已添加stdio.h头
发表于 04-03 07:33
H7平台如何重定向sqrtf函数到RAM中运行?
如题,H7平台如何重定向sqrtf函数到RAM中运行,这个函数是库函数,不能使用__ramfunc前缀,有什么方法或是例程,网上找了很多ic
发表于 03-27 06:40
评论