当前位置: 首页 > news >正文

KEIL 环境下 printf 导致程序无法执行的解决方案

关键字:printf,semihosting,keil,CMSIS

1. 问题描述

在开发过程中,开发者常用 printf 函数进行串口输出调试信息,在 MDK Keil 环境下,客户在调试开发过程中发现,只要程序添加了 printf 函数调用,就会出现程序无法执行。通过调试,查看汇编,发现程序没有进入到 main 函数,而是停在了下面 BKPT 语句。当单步执行的时候,程序可以运行下去,但是全速执行,程序一直停在了 BKPT 语句。察看用户工程设置,没有选用 MicroLIB 选项。

图1. 调试信息

显然,这是一个与应用代码无关的问题,本文介绍产生该问题的原因并给出解决方案。

2. Semihosting 简介

Semihosting 是一种调试技术,主要用于嵌入式系统开发。它允许嵌入式设备在运行时通过调试器与主机系统(通常是开发者的计算机)进行通信,从而实现一些复杂的输入输出操作。在 STM32 开发中,最常见的 Semihosting 应用是通过 printf 函数输出信息到 PC 的串口终端。其常规的调用路径如下图所示。

图2. Semihosting

当应用程序调用了 printf 函数,则编译器会默认启用的 Semihosting 功能,从而在初始化 C 库的时候,会执行与调试器进行交互操作的动作,应用程序是通过 SVC 或者 BKPT 这些指令与调试器进行交互,如果初始化过程中得不到调试器的响应,那么应用程序就不会往下执行。

结合 ARM 的参考文档,既然是 Semihosting 引起的问题,那么 ARM 也提供了解决问题的方法,可以参考文档ARM: Application Builds Without Error, But Does Not Run。

3. 问题解决

针对 Semihosting 导致的问题,通常情况下,在编译的过程中,不使用 C 标准库,而使用 MicroLIB 库是可以解决的,但是由于客户应用程序限制,不能使用 MicroLIB 库,而为了调试方便,又需要使用 printf 函数,所以只能采取其他的解决办法,在上述 ARM 提供的文档中,给出使用 CMSIS-Compiler pack 解决该问题,经过实验,该方法方便有效,按照如下步骤即可。

• 使能 CMSIS-Compiler 设置

在 Run-Time Environment 窗口中,使能 CMSIS-Compiler CORE 组件并设置STDOUT 为 Custom 选项,如下图所示。

图3. 使能 CMSIS-Compiler CORE component

• STDOUT 输出到用户定义的接口

这种方式应该是不调用底层的标准输出接口而是调用用户定义的接口,从而避免 Semihosting 导致的问题。既然不再调用底层标准库的接口,那么我们需要按照 ARM 提供的模板实现用户接口,如下所示。

图4. 生成 STDOUT 用户接口

• 重新编译代码,下载即可正常运行。

4. 总结

本文根据客户反馈的问题,结合 ARM 的帮助文档,给出了 printf 函数导致的程序不执行的解决方案,以供参考。
 

http://www.dtcms.com/a/321619.html

相关文章:

  • GPT5评测对比与使用
  • 2025年城市建设与智慧交通国际会议(ICUCIT 2025)
  • OpenAI重磅开源回归!GPT-OSS-120B/20B登陆星辰MaaS
  • 【长度最小的子数组】
  • C++ 红黑树实现详解:理论+代码+图解
  • 主流多模态大模型使用总结
  • GPT-5测评:AI新纪元的开启还是炒作?
  • 【SpringBoot】01 基础入门-SpringBoot2:从核心技术到响应式编程
  • Jenkins自动化构建部署Java、Web前后端项目
  • 使用Python将中文语音翻译成英语音频
  • 达梦DISQL执行SQL和SQL脚本
  • 医疗数据中台架构实战:Java实现高可用、低耦合的数据治理方案
  • 30人大型视频会议设备清单
  • 零基础小白如何使用QGIS制作研究区地形区位图教程
  • 参数服务器 server and client
  • 一文可视化分析2025年6月计算机视觉顶刊IJCV前沿热点
  • 满足高性能AI服务器的企业SSD有哪些?三星PM1743与Solidigm PS1010
  • Ⅹ—6.计算机二级综合题27---30套
  • 研发流程管理经验分享
  • 部署ELK8.18对日志进行收集、展示
  • 1Panel Agent 证书绕过实现远程命令执行漏洞复现(CVE-2025-54424)
  • 【Spring Boot 快速入门】八、登录认证
  • Java 大视界 -- Java 大数据机器学习模型在金融风险传染路径模拟与防控策略制定中的应用(387)
  • [Oracle] LEAST()函数
  • CORS 跨域问题 Next.js 跨域问题放通
  • HttpURLConnection (JDK原生)和Hutool HTTP工具的区别
  • GStreamer:开源多媒体框架技术详解与应用实践
  • c++初学day1(类比C语言进行举例,具体原理等到学到更深层的东西再进行解析)
  • 从0配置yolo实例分割(ubuntu)
  • 五种IO模型与⾮阻塞IO