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.

[参考译文] 编译器/TMS320F28020:如何使用 DMAC 汇编指令?

Guru**** 2606455 points
Other Parts Discussed in Thread: TMS320F28020

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/682885/compiler-tms320f28020-how-to-use-dmac-assembly-instruction

器件型号:TMS320F28020

工具/软件:TI C/C++编译器

尊敬的 TI:

我叫 Phu Nguyen、我用汇编语言为 TMS320F28020芯片编写代码。 读取 DMAC 指令时出现问题(TMS320C28x CPU 和指令集第187页)。

在这张图片中,我知道 Vara_1 = XT[31:16],Vara_2 = XT[15:0],VarB_1 = Prog[XAR7],但我不知道 VarB_2的值=? (1)

您能为我解释这个问题(1)吗?  

谢谢、此致、

Phu Nguyen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Phu Nguyen:

    DMAC 指令使用 XAR7来读取程序空间中的一个32位存储器位置。 参照您的帖子中的图表、VarB_2是 XAR7寻址的32位字的低16位。 数据的访问方式与 loc32相同。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Richard:

    作为 TI 的文档 TMS320C28x CPU 和指令集第17页。 我知道每个22位地址的程序存储器为16位。 那么、为什么您在程序空间中说32位存储器位置。 您能为我解释一下这个问题吗?

    谢谢、此致、

    Phu Nguyen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Phu Nguyen:

    C28x 上最小的可寻址存储器单元为16位宽、然而、16位和32位访问在程序和数据空间中都是可行的。 当 DMAC 指令使用*XAR7执行读操作时,它将进行32位访问。 在该文档的第18页、您将看到上述内容。 另请注意、所有数据总线为32位宽。

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Richard:

    作为您的答案、我可以通过1个32位地址读取数据存储器、我将获取1个32位值?
    示例:如果我将地址放置到数据存储器:0x0000 0000C、我的数据将是0x12345678 (示例值)
    我认为我只收到0x5678 (示例值)

    您能解释一下这个问题吗?

    非常感谢您、

    Phu Nguyen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Phu Nguyen:

    您可以读取32位或16位。 例如、如果您确实具有上述地址/数据组合:

    MOVWDP、#0
    MOVAL、@0xC
    MOVLP、@0xC

    这将执行来自同一地址的连续16位和32位读取、并将0x5678保留在 AL 中、将0x12345678保留在 P 中

    此致、

    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Richard:

    我仍然无法理解数据存储器的宽度。 如果您说的是32位宽度、那么为什么我向 SP 输入值、该值会拆分为两相、并为每个相位放置16位。 当将16位数据存储器置入时为 SP++。

    你可以解释我吗?

    非常感谢您、

    Phu Nguyen
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Phu Nguyen:

    没问题。 C28x 略有不同。 首先、SP++是寻址模式、而不是操作。 您可以使用[SP]和16位或32位移动操作将数据写入堆栈。 例如:

    MOVL*SP++,P

    将执行32位到堆栈的移动、并将 SP 后增量2 (16位字)。 而...

    MOV* SP++、AL

    将执行到堆栈的16位移动、并将 SP 后增量1 (16位字)。

    同样、基本存储器宽度为16位、指令集包含执行16位或32位访问的操作。 如果数据与偶数字边界对齐、则32位访问将是单周期访问。 例如、如果您具有以下内容:

    地址数据
    0xC 0x1234
    0xD 0x5678
    0xE 0x9ABC

    从@0xC 读取的32位将是单周期、而从0xD 读取的32位将需要2个周期。 这两个操作都将产生0x56781234。

    如果仍然不清楚、请随时回帖。

    此致、

    Richard