1
\ \ begingroup \美元

我只是在写一些测试程序,以便了解STM32F4 (ARM Cortex M4)。我使用的开发板在flash中预装了U-Boot。当板启动并运行时,U-Boot显示它的命令提示符,

  1. 我正在通过JTAG连接OpenOCD+GDB
  2. 加载我的二进制图像到RAM (OpenOCD:load_image
  3. reset the CPU (OpenOCD:重新初始化
  4. 并设置PC到我想运行的位置(GDB:设置电脑= 0 x2000001d美元
  5. 和运行(GDB:继续

这个问题

大多数情况下,这是正常的。然而,有几次我遇到了这样的问题,当CPU处于RUNNING状态时,OpenOCD突然显示这个消息:

错误:jtag状态包含无效的模式值-通信失败轮询目标stm32f4x。cpu失败,GDB将被停止。在100ms内再次轮询

如果我的观察是正确的,只有当

  1. 我在用重置按钮重置开发板
  2. 然后在这时出现的U-Boot提示符中输入一些东西。

当代替U-Boot的一些其他程序出现在flash中,这个问题似乎不会发生。

我的假设

目前我假设这是由U-Boot写入RAM位置引起的继续命令。我不知道怎么做继续确实有效,但我的理论是,这个命令会以某种方式影响调试电路,因此写入RAM地址会导致问题。

当我的其他程序在flash中出现时,一切工作正常。即使按下重启键也能起作用。我认为这是因为它的内存占用非常小,因此0x2000001d不受影响。

我的问题

  1. 是什么继续到底做什么?除了将CPU设置为运行模式,还有什么其他的功能吗?它会以某种方式影响断点吗?
  2. 我上面解释的假设有道理吗?
\ \ endgroup \美元
    1
    \ \ begingroup \美元

    我在用重置按钮重置开发板

    不要在OpenOCD运行时这样做。使用OpenOCDs重置停止重新运行而不是命令。

    reset按钮将影响目标的内部调试状态,但OpenOCD可能无法正确检测到这一点,这取决于您使用的调试器以及它是如何连接的。

    注意你应该做的重新初始化之前将二进制文件加载到flash中。

    \ \ endgroup \美元

      你的答案

      点击“发布你的答案”,即表示你同意我们的服务条款隐私政策饼干的政策

      不是你想要的答案?浏览其他带标签的问题问你自己的问题