2

尝试在特定位置设置断点并设置基于寄存器之一的值的触发条件,例如 R1(Cortex-R 系列 CPU)。

有没有办法在trace32中做到这一点?条件的语法是什么?

4

1 回答 1

3

您还可以在断点条件下检查寄存器值。

但是,请注意,条件断点总是会干扰芯片的运行时行为。这意味着您的目标 CPU 将始终在断点位置停止,然后调试器评估条件,如果条件不满足,则重新启动 CPU。(请注意,“条件断点”与“数据断点”不同(将某个值写入特定位置)。数据断点在许多芯片(如您的 Cortex-R)上是非侵入性的)。

基本技巧是使用 PRACTICE 函数 Register() 来访问核心寄存器。

要设置程序断点,在某个程序位置停止并保持停止状态,如果核心寄存器包含某个值,请使用以下命令之一:

  • Break.Set <prog.addr|symbol> /Program /CONDition Register(<reg.>)==<reg.value>
  • Break.Set <prog.addr|symbol> /Program /VarCONDition \Register(<reg.>)==<value>

例如:

  • Break.Set P:0x1000 /Program /CONDition Register(R0)==0x42
  • Break.Set P:0x1000 /Program /VarCONDition \Register(R0)==0x42

两个命令的区别?第一个使用 TRACE32 表达式,其中符号代表它们的地址(就像链接器看到符号一样)。第二种使用所谓的 HLL 表达式,其中符号代表 C/C++ 语言中的变量。(HLL expr. == C 风格的 expr.)

通常在 HLL 表达式中编写条件更容易(尤其是在处理变量时),而在 TRACE32 表达式中使用 PRACTICE 函数通常更容易。

您还可以在 Break.Set 对话框中设置条件:单击“高级”按钮,然后在“条件”字段中单击您的条件。“条件”字段右侧的 HLL 复选框定义您是否使用 HLL 表达式。

于 2017-02-15T11:03:51.873 回答