开发者社区 问答 正文

【AliOS Things】编译好的keil工程无法执行到断点

我用vs code编译了一个helloworld 的keil工程,然后在keil里使用debug功能,下载到了STM32F429ZI开发板,通过串口工具,可以看到程序正常运行,打印helloworld和count信息,但是存在2个问题: 1. 程序的初始位置不是在reset handler; 2. 在helloworld.c里面打断点,无法运行到断点处。 请教一下,这2个问题怎么解决?

展开
收起
游客mwjqfaflaxoqs 2020-04-02 14:47:14 516 分享
分享
版权
举报
阿里云 AI 助理回答

这两个问题可能与你的工程配置、链接脚本或调试环境有关。下面是一些建议来帮助你解决这些问题:

1. 程序初始位置不是在reset handler

通常,STM32微控制器在上电或复位后会从一个固定的地址开始执行,这个地址通常是Flash的起始位置,而该位置存放的是向量表中的第一条指令,即Reset Handler。如果你发现程序没有从Reset Handler开始执行,可能是以下原因造成的:

  • 链接脚本错误:确保你的链接脚本正确地设置了中断向量表的位置,并且指向了正确的Reset Handler函数。

    解决方法:检查并确认你的.ld链接脚本中是否正确指定了VECT_TAB_OFFSET(如果有的话)和__Vectors段的位置,确保它们与你的硬件设置相匹配。

  • 启动文件问题:Keil MDK为STM32提供了标准的启动文件(如startup_stm32f429xx.s),确保你使用了正确的启动文件,并且其中的Reset Handler实现没有被意外修改或删除。

2. 在helloworld.c里面打断点,无法运行到断点处

这个问题可能涉及到几个方面:

  • 优化级别:如果你的编译器开启了较高的优化级别,某些变量或代码路径可能会被优化掉,导致断点无法命中。尝试降低编译优化级别,比如将Optimization设置为None (-O0)。

  • 调试信息:确保你的编译选项中包含了足够的调试信息。在Keil MDK中,你需要确保Debug Information设置为至少Generate Debug Information,最好是DWARF-4格式。

  • 硬件调试接口设置:确认你的JTAG/SWD接口配置正确,包括速度设置等,有时不恰当的配置会导致调试不稳定。

  • 软件版本兼容性:确保你的Keil MDK、调试驱动以及开发板固件都是最新或兼容的版本。

  • 清空Flash:有时候旧的代码或数据残留在Flash中,可能导致执行流程异常。尝试完全擦除Flash后再下载程序。

针对第二个问题,你可以首先尝试在main函数的第一行设置断点,看是否能正常停止。如果可以,逐步向目标代码推进,观察断点是否能够按预期工作,这有助于定位问题所在。

希望这些建议能帮助你解决问题!如果问题依旧,请提供更详细的信息,比如你的编译和链接设置,以便进行更深入的分析。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: