0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32的printf函数重定向方法

STM32嵌入式开发 来源:CSDN 2023-07-10 16:22 次阅读

法1:使用MicroLIB库

1.1 KEIL-MDK中的Use MicroLIB选项

在MDK开发环境中,b79be2f4-1ef8-11ee-962d-dac502259ad0.png

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只提供双区内存模型,即单独的堆栈和堆区。
MicroLib提供了一个有限的stdio子系统,它仅支持未缓冲的stdin、stdout和stderr,那么也就是说勾选了Use MicroLib选项后,在代码工程中就可以使用printf()函数咯?然而事实并非如此,这样直接使用printf()函数,其打印的字符串最终不知道打印到何处。我们要做的是将调试信息打印到USART1中,所以需要对printf()函数所依赖的打印输出函数fputc()重定向(MicroLib中的printf()函数打印操作依赖fputc())。

1.2 重定向fputc函数

在MicroLib的stdio.h中,fputc()函数的原型为:b7d131f2-1ef8-11ee-962d-dac502259ad0.png此函数原本是将字符ch打印到文件指针stream所指向的文件流去的,现在我们不需要打印到文件流,而是打印到串口1。基于前面的代码:b7e98db0-1ef8-11ee-962d-dac502259ad0.png注意,需要包含头文件stdio.h,否则FILE类型未定义。勾选了Use MicroLib选项,重定向fputc()函数后,我们就可以在工程代码中使用printf()函数了:b8107fec-1ef8-11ee-962d-dac502259ad0.pngprintf()函数的使用方法跟之前一样,运行结果:b829fdd2-1ef8-11ee-962d-dac502259ad0.png

法2:不使用MicroLIB库

2.1 半主机模式

半主机模式是ARM的一种机制,实现将来ARM应用程序代码的输入/输出请求传送至运行着调试器的主机。例如设置使用半主机模式下的ARM应用程序,可以使用printf()和scanf()来使用主机的显示器和键盘,而不需要在ARM系统上搭配显示器和键盘。半主机通过一组定义好的软件指令(如SVC)来实现的,这些指令在程序控制下产生异常,ARM应用程序调用半主机对应的异常处理函数,然后调试代理处理该异常。一般的ARM应用程序中并不需要半主机操作,在这里为确保ARM应用程序中没有链接MicroLib的半主机相关函数,我们要取消ARM的半主机工作模式。

2.2 实现代码

在工程中加上如下代码:b8696634-1ef8-11ee-962d-dac502259ad0.png这样操作后,在不使用MicroLib的前提下,仍能使用printf()函数将调试信息打印到USART1上了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6288

    浏览量

    121887
  • STM32
    +关注

    关注

    2240

    文章

    10674

    浏览量

    348790
  • 函数
    +关注

    关注

    3

    文章

    3882

    浏览量

    61310

原文标题:STM32的printf函数重定向方法

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    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

    2分钟搞懂输出重定向

    视频最后我们通过重定向把标准输出写到了文件中,但是错误输出还是留在了屏幕上。
    的头像 发表于 01-15 16:41 299次阅读

    AWorksLP应用笔记:重定向printf函数

    printf函数作为标准库定义的格式化输出方式,本文将介绍其在AWorksLP下默认适配以及重映射至热拔插设备端口的实现。默认适配AWorksLP中默认已经对printf函数完成相关适
    的头像 发表于 11-25 08:24 252次阅读
    AWorksLP应用笔记:<b class='flag-5'>重定向</b><b class='flag-5'>printf</b><b class='flag-5'>函数</b>

    如何实现Printf()接口重定向到UART

    车规级MCU开发,不像PC端,包含stdio.h头文件就可以使用Printf()函数。为了实现PC端Printf()接口功能,需要在MCU端实现Printf()接口的"
    的头像 发表于 10-01 10:13 637次阅读
    如何实现<b class='flag-5'>Printf</b>()接口<b class='flag-5'>重定向</b>到UART

    在bash中如何进行各种文件重定向呢?

    本文会用以下测试程序,来演示在bash中,如何进行各种文件重定向
    的头像 发表于 08-25 09:31 695次阅读
    在bash中如何进行各种文件<b class='flag-5'>重定向</b>呢?

    GD32VF103的相关例程中如何完成printf重定向到串口的?

    GD32VF103的相关例程中,如何完成printf重定向到串口的?
    发表于 08-16 07:54

    Splashtop:利用USB设备重定向实现无缝远程办公

    USB设备重定向不仅仅是一个巧妙的技巧,它是一个强大的工具,为远程工作和娱乐开辟了广泛的可能性。在这里,我们将探讨一些真实的示例,说明如何在不同的任务和角色中充分发挥USB设备重定向的潜力。
    的头像 发表于 07-31 14:53 674次阅读

    STM32F407 串口配置步骤

    介绍STM32F407串口配置步骤,完成串口的数据发送与接收、实现中断接收,支持printf重定向
    的头像 发表于 07-06 14:29 1888次阅读
    <b class='flag-5'>STM32</b>F407 串口配置步骤

    使用printf()函数时默认UART0输出,请教如何重定向printf()到UART1?

    芯片:N76E003; 编译环境:keil5 使用printf()函数时默认UART0输出,请教如何重定向printf()到UART1?
    发表于 06-25 07:12

    esphttpd wifi连接和连接后重定向怎么处理?

    加载 esphttpd 固件后,一切正常,除了两个(最重要的事情): 连接到 ESP 接入点后的重定向。它重定向但从未加载,我必须多次按下 chrome 浏览器上的重新加载按钮,直到它加载索引页面
    发表于 05-19 06:53

    printf输出重定向方法

    在 PC 上运行 C 语言时,prinf 输出的内容会打印在电脑显示器上,这是因为 prinf 默认的输出设备就是显示器。而当我们在单片机上,需要通过 printf 函数将信息打印到串口,就要对 printf
    的头像 发表于 05-14 16:22 3805次阅读
    <b class='flag-5'>printf</b>输出<b class='flag-5'>重定向</b>的<b class='flag-5'>方法</b>

    Linux I/O重定向详解

    Linux I/O重定向可以定义为,更改从命令读取输入到命令发送输出的方式。你可以重定向命令的输入和输出。对于重定向符号,可以是 或者 | 。
    的头像 发表于 05-04 14:34 590次阅读