为什么我的软件断点不断消失?
我在代码中设置了一个断点、该断点被加载到闪存中、然后从 RAM 运行。 断点在代码运行的 RAM 区域中设置。 有时、该断点会暂停代码、有时它不会暂停。
我注意到、当我发出新的运行(重置->运行)时、断点似乎消失了。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
为什么我的软件断点不断消失?
我在代码中设置了一个断点、该断点被加载到闪存中、然后从 RAM 运行。 断点在代码运行的 RAM 区域中设置。 有时、该断点会暂停代码、有时它不会暂停。
我注意到、当我发出新的运行(重置->运行)时、断点似乎消失了。
在 C2000应用中、在加载到闪存但从 RAM 运行并在加载代码之前启用的代码区域中设置的软件断点可能无法按预期工作。 断点将在 RAM 地址中正确设置、但在加载/重新加载之后首次运行代码时、程序不会停止。 如果通过取消选中并重新选中"Breakpoints"视图中的复选框来简单地禁用/重新启用断点、则它将在这些断点处正确停止(直到重新加载程序)。 此外、禁用断点后、控制台中还会显示"删除断点时遇到问题"消息。
当一个软件断点被设定时、仿真驱动程序在那个位置读取指令并将其替换为一个软件断点运算代码、此操作代码随后在调试模式中时将停止目标。 调试器在某种程度上向您隐藏此内容、以便您仍然可以看到原始反汇编和/或修改它。
如果应用程序将一条新指令写入已设置软件断点的地址(就像在引导时从闪存复制到 RAM 的代码那样)、特殊的停止操作码将被这个新指令所取代。 这会在调试器不知情的情况下有效地删除断点。 这就是断点无法停止的原因、也是删除断点时打印错误的原因(因为删除会将原始操作码写回、但它会检查断点操作码是否仍然在第一个位置)。
这是软件断点的限制。 由于调试器不知道应用程序何时可以执行此操作、因此除了在事后很好地检测它之外、调试器还能做的事情不多。 如果在代码从闪存复制到 RAM 后启用断点、则它们将起作用。
最简单的解决方法是改用硬件断点。 这在目标上也不会造成侵入、但大多数 C2000器件只有两个可用的硬件断点。 具有 ERAD 模块的器件具有额外的硬件断点。
另一个选项是设置一个断点、该断点将有效告知调试器应用程序将执行的操作、以便调试器可以执行有关此操作的操作。 为此、请执行以下步骤:
在执行从闪存复制到 RAM 的代码之前设置一个断点
右键单击此断点并选择"Properties"。 在"Debugger Response->Action"下、将值从"Remain Halted"更改为"Execute Expression (GEL)"。 新的子属性应显示为"expression"。 将其值更改为"DisableBreakpointDuringRAMCopy()"。 然后单击确定。
通过选择"Tools->GEL Files"打开启动 GEL 文件、然后双击其中的 GEL 文件(如果没有新的空 GEL 文件、也可以添加新的空 GEL 文件)。
在编辑器中添加以下文本:
DisableBreakpointDuringRAMCopy() { GEL_RemoveDebugState (); GEL_Go (LabelWhereCopyIsDone); GEL_RestoreDebugState (); GEL_Run(); }
将"LabelWhereCopyIsDOne"更改为对您的应用有意义的符号。
有关其他信息、请参阅此主题 :https://e2e.ti.com/support/development_tools/code_composer_studio/f/81/p/354642/1246978#1246978