|
问题描述 在开发过程中,开发者常用printf函数进行串口输出调试信息,在MDK Keil环境下,客户在调试开发过程中发现,只要程序添加了printf函数调用,就会出现程序无法执行。通过调试,查看汇编,发现程序没有进入到main函数,而是停在了下面BKPT语句。当单步执行的时候,程序可以运行下去,但是全速执行,程序一直停在了BKPT语句。察看用户工程设置,没有选用MicroLIB选项。
Semihosting是一种调试技术,主要用于嵌入式系统开发。它允许嵌入式设备在运行时通过调试器与主机系统(通常是开发者的计算机)进行通信,从而实现一些复杂的输入输出操作。在STM32开发中,最常见的Semihosting应用是通过printf函数输出信息到PC的串口终端。其常规的调用路径如下图所示。
针对Semihosting导致的问题,通常情况下,在编译的过程中,不使用C标准库,而使用MicroLIB库是可以解决的,但是由于客户应用程序限制,不能使用MicroLIB库,而为了调试方便,又需要使用printf函数,所以只能采取其他的解决办法,在上述ARM提供的文档中,给出使用CMSIS-Compiler pack解决该问题,经过实验,该方法方便有效,按照如下步骤即可。 使能CMSIS-Compiler设置 在Run-Time Environment窗口中,使能CMSIS-Compiler CORE组件并设置STDOUT为Custom选项,如下图所示。
STDOUT 输出到用户定义的接口 这种方式应该是不调用底层的标准输出接口而是调用用户定义的接口,从而避免Semihosting导致的问题。既然不再调用底层标准库的接口,那么我们需要按照ARM提供的模板实现用户接口,如下所示。
重新编译代码,下载即可正常运行。 总结 本文根据客户反馈的问题,结合ARM的帮助文档,给出了printf函数导致的程序不执行的解决方案,以供参考。 |
STM32L562DK探索板——给Audio Play添加音量控制功能
STM32L562DK探索板——重写Led闪烁demo
STM32L562DK探索板——触摸菜单的实验
STM32L562DK探索板——简单的显示变量函数
经验分享 | STM32 IAP应用时的跳转注意事项
实战经验 | 碰到hardfault问题你还在死磕代码吗?
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
HAL2架构与项目工程格式使用方法
微信公众号
手机版