STM32 调试进不了main函数

1、问题现象
调试时复位中断能正常进入,在main函数打断点,全速运行进不去main函数的断点。

堆栈如下图所示

汇编显示停留在BKPT指令

2、问题原因
STM32的半主机(Semihosting)模式是一种调试技术,它允许开发者在没有操作系统的环境下,通过调试器来调用一些主机系统的服务。这些服务可以包括文件操作(如打开、读取、写入和关闭文件)、控制台输入输出等。半主机模式对于嵌入式开发来说非常有用,因为它提供了一种简单的方式来执行通常需要操作系统支持的操作。当一个程序运行在半主机模式下时,如果调用了特定的半主机函数(例如sys_open、sys_write等),处理器会生成一个软件中断。使用半主机模式的好处是:简化了开发过程,因为可以直接使用标准C库中的I/O函数,不需要在目标硬件上实现完整的文件系统或复杂的I/O驱动程序,可以直接查看程序运行时产生的输出,这对于调试非常有帮助。
3、解决方案
标准I/O库函数,如printf()、scanf()或fgetc()来执行输入/输出操作。这些函数在标准的ARM Compiler C运行时库中的结构是:

方法1)
MicroLib实现了一组简化的高级函数,因此不实现系统I/O函数。因此可以使用MicroLib来解决问题。使用MicroLib方法。魔法棒->target->use micro LIB勾上复选框,然后重新编译即可。


方法2)
利用MDK的软件组件(software component )功能,它为各种标准I/O通道(File, STDERR, STDIN, STDOUT和TTY)提供重定向I/O功能。点击绿色的菱形,进入运行时环境配置,选择compiler->I/O,默认的配置如下图。


I/O Channel Description
file 用于所有与文件相关的操作(fscanf, fprintf, fopen, fclose等)
stderr 应用程序输出诊断消息的标准错误流。
stdin 进入应用程序的标准输入流(scanfeetc .)
stdout 应用程序的标准输出流(printf等)
tty 电传打字机是错误输出的最后手段

variant Description
file system 使用文件系统组件作为文件相关操作的接口
breakpoint 当I/O通道被使用时,应用程序会停留在BKPT指令
ITM 通过调试器测量跟踪单元(ITM)使用进行I/O通信。
User 将I/O函数重定向到用户自定义的例程(如USART、键盘)

把默认配置修改为如下图所示,然后重新编译程序即可。

作者:只为朝夕

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 调试进不了main函数

发表回复