【问题标题】:Trace32 practice script: DATA.SET how to useTrace32练习脚本:DATA.SET如何使用
【发布时间】:2021-01-23 01:43:14
【问题描述】:

以下命令是什么意思? EA 是什么意思?

&HEAD=0x146BF94C
DATA.SET  EA:&HEAD+0x4  %LONG  DATA.LONG(EA:&HEAD+0x4)&0xFFFFFF

【问题讨论】:

    标签: trace32 lauterbach


    【解决方案1】:

    Data.Set 命令将原始数据写入目标内存的给定地址。

    命令遵循以下架构:
    Data.Set


    在哪里

    • 的格式为 :

      其中“access class" 是几个字母,指定以哪种方式访问​​哪个内存。
    • 8 位为 %Byte,16 位为 %Word,32 位为 %Long,64 位为 %Quad
    • 是你真正要写入的数据。

    对于“访问类”,请查看处理器架构手册中的访问类一章(菜单 → 帮助 → 处理器架构手册)。可用访问类别的类型因使用的处理器架构而异。 (例如 ARM 和 PowerPC 的不同类)

    “访问类”EA:表示:

    • 在 CPU 运行时访问内存 (E)。
    • 通过绕过 MMU 的绝对(物理)内存地址 (A) 访问内存。

    最后,您要写入内存的数据()可以是固定值(例如 0x42)或通过表达式(0x40+0x02)计算得出。这样的表达也可以使用所谓的“实践功能”。您的示例中使用的函数是 Data.Long(<address>),它从给定地址读取 32 位。 (注意:表达式不能包含空格。)

    然后你有一个宏&HEAD=,其中包含字符串“0x146BF94C”。这意味着出现在任何后续命令中的任何 &HEAD 都会被宏的内容替换。这类似于 C-Preprossor。

    因此,您的命令

    &HEAD=0x146BF94C
    DATA.SET EA:&HEAD+0x4 %LONG DATA.LONG(EA:&HEAD+0x4)&0xFFFFFF
    

    意思相同

    Data.Set  EA:0x146BF950  %LONG  Data.Long(EA:0x146BF950)&0x00FFFFFF
    

    这实际上定义了对地址 EA:0x146BF950 的 32 位值的读取-修改-写入:从内存中读取该值,将高 8 位设置为零,然后将结果写回相同的内存位置。

    它与 C 代码表达式(几乎)具有相同的含义

    *((volatile uint32_t*) 0x146BF950)  &=  0x00FFFFFF;
    

    这只是“几乎相同”,因为 C 代码表达式不会像您的 Data.Set 命令那样绕过 MMU,这要归功于地址的内存访问类中的“A”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      相关资源
      最近更新 更多