代码之家  ›  专栏  ›  技术社区  ›  Equation Solver

Trace32 CMM脚本:理解Data.Set命令

  •  0
  • Equation Solver  · 技术社区  · 4 年前

    下面的命令是什么意思?

    sYmbol.NEW _VectorTable 0x34000000
    sYmbol.NEW _ResetVector 0x34000020
    sYmbol.NEW _InitialSP   0x34000100
    Data.Set EAXI:_VectorTable %Long _InitialSP _ResetVector+1
    
    0 回复  |  直到 4 年前
        1
  •  4
  •   Holger    4 年前

    命令 Data.Set 将数据值写入目标的内存。命令的语法为

    Data.Set <address>|<address_range> [<access_width>] {value(s)}
    

    <地址>向其写入数据具有以下形式:

    <access_class>:<address_offset>
    

    一个完整的地址,只是地址偏移量和值(您想要写入),也可以用调试符号表示。这些符号通常是在目标应用程序中定义的变量、函数名和标签,并通过加载目标应用程序的ELF文件向调试器声明。 但是,在这种情况下,符号是由命令在调试器中手动声明的 sYmbol.NEW

    无论如何:通过在命令中将符号替换为其值 Data.Set EAXI:_VectorTable %Long _InitialSP _ResetVector+1 我们得到命令

    Data.Set EAXI:0x34000000 %Long 0x34000100 0x34000021
    

    那么这个命令实际上是干什么的呢?

    • 访问宽度说明符 %Long 指示应写入32位值。因此,对于每个指定的数据值,地址将自动递增4。
    • 值0x340000 100写入地址EAXI:0x340000
    • 值0x3400021写入地址EAXI:0x34000004
    • <access_class>“EAXI”表示调试器应通过 AXI bus (Advanced eXtensible Interface) 。通过直接写入AXI总线,可以绕过目标的CPU核心(绕过任何MMU、MPU或缓存)。访问类EAXI的前导“E”表示写操作也可以在CPU内核正在运行(或被认为正在运行(例如,在准备模式下)时执行。所有可能的访问类的描述都特定于目标的核心体系结构,因此,您可以在调试器的“目标体系结构手册”中找到描述。

    这对您的目标和运行在其上的应用程序到底意味着什么?

    嗯,我不了解你的芯片或SoC(我也不知道你的应用程序)。 但从我看到的数据来看,我猜你正在调试一个ARM架构的芯片——可能是Cortex-M。您的芯片的引导ROM似乎从地址0x340000开始,而实际应用程序的启动代码从0x340020开始(可能带有符号 _start )。

    对于Cortex-M内核,您必须在矢量表(在引导ROM中)的偏移量0处编程 堆叠指标 ,而在偏移量4处,您必须写入 程序计数器 。在您的情况下,程序计数器应初始化为0x340021。为什么是0x3400021而不是0x3400020?因为您的启动代码可能编码在 ARM Thumb 。(Cortex-M只能执行Thumb代码)。通过将程序计数器初始值的最低有效位设置为1,核心知道它应该开始解码Thumb指令。(在Cortex-M上不将最低有效位设置为1将导致异常)。

    推荐文章