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.

[参考译文] MSP430FR5994:扩展(MSP430X) PUSHM.W 和 POPM.W 的执行周期不符合 Family User's Guide

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1118672/msp430fr5994-execution-cycles-for-extended-msp430x-pushm-w-and-popm-w-doesn-t-appear-to-match-family-user-s-guide

器件型号:MSP430FR5994

我正在使用配置为对我的周期进行计数的计时器 A。 (CCS 周期计数器是毫无价值的--非常无用--所以我必须使用一个硬件计时器/计数器来获得有意义的结果。)

在我的测试中、我发现以下几点:

    pushm #3, R11
    popm #3, R11

需要11个周期。

(根据计时器 A。要获得该值需要很多其他细节--尽管每个指令的长度为4个周期,但打开和关闭计时器需要花费6个周期,因此应该花费8个周期。 但我必须接受的是、发生"开启"和"关闭"的周期点不一定是显而易见的。 因此、很多测试都让我达到了实际可以校准我报告的结果的程度。 这是一个过程。 相信我、这些值是准确的。 我已经付出了很大的努力来确保这一事实。)

《MSP430FR58xx、MSP430FR59xx 和 MSP430x6xx 系列用户指南》的表4-17中的文档:

显示每个周期的周期数应为5个周期、总共为10个周期、而不是11个周期。

我以1MHz 的频率运行、因此我认为这不是 FRAM 的任何等待状态问题、它肯定不是堆栈所在的 SRAM 的等待状态问题。

所以。 是否有额外周期来自何处的想法? 表格是否完全错误?

如果是的话,这不会令我感到意外。 PUSH Rx 指令需要3个周期、但 POP Rx 指令实际上是 MOV @SP+、Rx (格式 I 指令)、所以需要2个周期(请参阅表4-10)、而不是3。 因此、推后推送 POP 为5个周期、这是预期的。

尽管如此、考虑到上表中建议的对为10个周期(其中 N=3)、我预计不会有11个周期。

请提供任何帮助。 我想完全理解这里发生的情况。

谢谢、

Jon

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

    你好、Jon

    感谢您的分享!

    第一步、我在 CCS 上使用 run >> clock 函数来检查 pushm #3、R11和 pum#3、R11的机器周期数。

    Pushm #3、R11为1个机器循环、Pum#3、R11为6个机器循环。

    到目前为止、我不知道该结果是否正确。

    我需要尝试运行您的计时器 A 方法、我还将检查 IAR 上是否有机器计数器功能。

    是否可以使用计时器 A 共享测试代码?

    谢谢!

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

    从计时器开始。 我假设您正在使用读取/修改/写入指令(BIC、bis)来启动和停止计时器。 显然、计时器的确切启动和停止时间取决于写入部分发生的时间。 这将是指令的最后一个周期。 以及计时器内发生的任何延迟或同步。

    我认为我不会启动和停止计时器。 阅读 TAR 似乎是更好的选择。 在寄存器中使用 TAR 的地址(mov @Rx、ry)来实现最快的运行。

    我认为您的问题在于计时器延迟/同步。 尝试多次重复该 pushm/popm 对。 如果您执行10次并计算110个周期、您可能会有一些东西。

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

    不可以、我不使用 BIS 或 BIC 来启动或停止计时器。 下面是我使用的方法:

        ; Calibration:
        mov.w   #(TASSEL_2 | ID_0 | MC_0 | TAIE_0 | TAIFG_0), &TA0CTL   ; uses 4 cycles
        mov.w   &TA0R, R5       ; clock is stopped, read freely.
        mov.w   #(TASSEL_2 | ID_0 | MC_3 | TAIE_0 | TAIFG_0), &TA0CTL   ; uses 4 cycles
        mov.w   #(TASSEL_2 | ID_0 | MC_0 | TAIE_0 | TAIFG_0), &TA0CTL   ; uses 4 cycles
        mov.w   &TA0R, R4       ; read it a 2nd time while clock is stopped.
        ; R4 - R5 = 0x000E - 0x000B = (3 cycles -- calibration value)
    
        ; Test instruction pair:
        mov.w   #(TASSEL_2 | ID_0 | MC_0 | TAIE_0 | TAIFG_0), &TA0CTL   ; uses 4 cycles
        mov.w   &TA0R, R5       ; clock is stopped, read freely.
        mov.w   #(TASSEL_2 | ID_0 | MC_3 | TAIE_0 | TAIFG_0), &TA0CTL   ; uses 4 cycles
        pushm.w #3, R11
        popm.w  #3, R11
        mov.w   #(TASSEL_2 | ID_0 | MC_0 | TAIE_0 | TAIFG_0), &TA0CTL   ; uses 4 cycles
        mov.w   &TA0R, R4       ; read it a 2nd time while clock is stopped.
        ; R4 - R5 = 0x0019 - 0x000B = (14 cycles, less the above 3 cycles = 11 cycles)
    
        ; Test one dozen instruction pairs:
        mov.w   #(TASSEL_2 | ID_0 | MC_0 | TAIE_0 | TAIFG_0), &TA0CTL   ; uses 4 cycles
        mov.w   &TA0R, R5       ; clock is stopped, read freely.
        mov.w   #(TASSEL_2 | ID_0 | MC_3 | TAIE_0 | TAIFG_0), &TA0CTL   ; uses 4 cycles
        pushm.w #3, R11
        popm.w  #3, R11
        pushm.w #3, R11
        popm.w  #3, R11
        pushm.w #3, R11
        popm.w  #3, R11
        pushm.w #3, R11
        popm.w  #3, R11
        pushm.w #3, R11
        popm.w  #3, R11
        pushm.w #3, R11
        popm.w  #3, R11
        pushm.w #3, R11
        popm.w  #3, R11
        pushm.w #3, R11
        popm.w  #3, R11
        pushm.w #3, R11
        popm.w  #3, R11
        pushm.w #3, R11
        popm.w  #3, R11
        pushm.w #3, R11
        popm.w  #3, R11
        pushm.w #3, R11
        popm.w  #3, R11
        mov.w   #(TASSEL_2 | ID_0 | MC_0 | TAIE_0 | TAIFG_0), &TA0CTL   ; uses 4 cycles
        mov.w   &TA0R, R4       ; read it a 2nd time while clock is stopped.
        ; R4 - R5 = 0x0092 - 0x000B = (135 cycles, less the above 3 cycles = 132 cycles)

    (我只需重复 TA0CTL mov.w 指令、一条指令 MC_3启动、另一条指令 MC_0停止。)

    这两条指令背靠背放置(一条紧跟另一条)、导致差值。 如果我现在在这两者之间放置任何指令、我可以检查插入指令的时序是否与数据表中表达的理论相匹配。 到目前为止、在每种情况下(除了我介绍的情况)、时序都与数据表所说的完全匹配。 因此该方法工作正常。

    但是、为了应对您的异议、我按照您的要求(如上所示)反复重复了十多次配对、我的论点仍然没有改变。 每对恰好是11个周期。

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

    以下代码计算插入的汇编代码主体的周期计数:

                        mov.w   #(TASSEL_2 | ID_0 | MC_0 | TAIE_0 | TAIFG_0), &TA0CTL
                        mov.w   &TA0R, R5
                        mov.w   #(TASSEL_2 | ID_0 | MC_3 | TAIE_0 | TAIFG_0), &TA0CTL
                        mov.w   #(TASSEL_2 | ID_0 | MC_0 | TAIE_0 | TAIFG_0), &TA0CTL
                        mov.w   &TA0R, R6
                        mov.w   #(TASSEL_2 | ID_0 | MC_3 | TAIE_0 | TAIFG_0), &TA0CTL
                        ; INSERT CODE BODY HERE -- CYCLE COUNT WILL BE COMPUTED INTO R5 LATER
                        mov.w   #(TASSEL_2 | ID_0 | MC_0 | TAIE_0 | TAIFG_0), &TA0CTL
                        mov.w   &TA0R, R7
                        rla.w   R6
                        add.w   R7, R5
                        sub.w   R6, R5      ; cycle count is now in R5.
                        nop                 ; set breakpoint here and examine R5.

    (我添加了一些额外的指令、以便更轻松地计算任何指令或连续指令集的周期计数。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="527589" URL"~支持/微控制器/MSP-low 功耗微控制器组/msp430/f/MSP-low 功耗微控制器论坛/1118672/msp430fr5994-执行周期-用于扩展的 msp430x-pushm-w-and-w-n-t-s-us-family"用户指南。 是否有额外周期来自何处的想法? 表格是否完全错误?

    2xx 闪存系列数据表中包含周期数的表格完全正确。 对于 CPUXv2和 FRAM、尤其是只有您的方法(使用计时器在汇编器中测量的数百个重复指令序列)可以提供精确的答案。 这不是什么新东西、我在10年前就使用过这个、发现在5xx 闪存系列(而不是 FRAM)上、同一指令的不同序列可以在不同的周期数下执行...

         RRA.b @R5        ;3       RRA.b @R5        ;3.
       NOP              ;1       RRA.b @R5        ;3.
       RRA.b @R5        ;3       RRA.b @R5        ;3.
       NOP              ;1       RRA.b @R5        ;3.
       RRA.b @R5        ;3       RRA.b @R5        ;3.
       NOP              ;1       RRA.b @R5        ;3.
       RRA.b @R5        ;3       nop              ;1.
       NOP              ;1       NOP              ;1.
       RRA.b @R5        ;3       nop              ;1.
       NOP              ;1       NOP              ;1.
       RRA.b @R5        ;3       nop              ;1.
       NOP              ;1       NOP              ;1.
    --------------    --------------
    周期总数24   周期总数27

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

    该数据表适用于 FRAM 系列、如已特别提到的:《MSP430FR58xx、MSP430FR59xx 和 MSP430x6xx 系列用户指南》。 (除非 MSP430x6xx 本身是问题原因?)

    首先、我有点恼火的是、CCS 在 IDE 右下角的周期计数方面毫无用处。 这对我来说几乎没有价值。 这迫使我使用硬件计时器进行测试。 我几乎不能相信这个已经存在了这么长时间的 IDE 在计算周期时会非常糟糕。 令人震惊。

    但是、我发现我也无法信任我在数据表中读取的内容。 相反、我必须花时间手动检查。 我现在并不是很高兴。

    是的、我知道文档是一回事、硬件本身也是另一回事、这些内容可能会不同步。 我期待更好的 但无论如何、我可以得到这样一个事实:它会发生。

    但有一点痛苦、我无法信任任何软件工具或硬件文档、而且我必须独立验证我读取的每一个内容。

    我希望能更好

    感谢您的想法和有趣的演示。 我将在这里看到它在该器件上的表现。 值得一试

    刚刚测试过。 我得到左侧情况的24个周期、右侧情况的27个周期、如图所示!

    我现在非常生气。

    现在、我想对处理器进行完整的内部描述。 (我以前在英特尔工作过奔腾 II 的 BX 芯片组 我可以读取。)

    我还有的唯一问题是:一个周期为5个周期、另一个周期为6个周期。 我是将它们配对还是将它们隔离、这无关紧要。 我得到相同的结果。 因此、与您的示例不同、它在这里看起来是一致的。 不过、我确实需要执行一些操作、例如插入 NOP 指令。 我还没有尝试过。 但现在这也正在进入更复杂的地区。 我将花一点时间讨论这个问题、非常感谢您的贡献。 我可能很快会选择它作为答案、因为我认为其他人不会像您一样添加一个有用的贡献。

    已添加:已完成并已选择。 谢谢! 我对您的贡献非常感谢! (我正在为 MSP430X 编写一个全功能基本解释器、包括矩阵运算。 它完全在汇编代码中。 我要面对很多问题。 但这是另一个在我面前的东西:切比雪夫和非线性 Minimax 只有其中的最小值。 但我对 TI 目前的表现并不特别满意。 唯一的好处是5994 LaunchPad 价格便宜、随时可用、质量非常好。 文件 I/O 系统现在需要 FRAM。 遗憾的是、这意味着闪存不是问题。 但这对我的目标受众来说是可以的。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="527589" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1118672/msp430fr5994-execution-cycles for extended msp430x-pushm-w-and-pum-w-n-n-t-rand-rRAM 用户指南现在不需要将148100与该文件与系统正确匹配。 遗憾的是、这意味着闪存不是问题。 但这对我的目标受众来说是可以的。[/引述]

    只需添加一点、即 MSP430F5xx/6xx 具有非常快速的闪存写入(与其他一些供应商相比)。 在 RAM 中执行的启用智能位(一次写入128个字节)的长字块写入可超过250Kbyte/sec

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

    谢谢。 但对于仿真器而言、寿命是一个问题。 而不是速度。

    添加了(似乎主持人希望在我正在处理的项目相同的时候将我的问题合并在一起--不过我在这里是新手。 因此、当我将这个问题与我之前的问题结合在一起时、我可能会误解其含义。):

    我感谢您的想法、并赢得了我的尊重。 如果您对以下内容有任何想法、我非常感谢您的聆听。

    我对有关 JTAG 接口的文档感兴趣。 而不是愚蠢的"擦除、编程和验证"内容。 但逐位详述了整个 JTAG 链、以及芯片内部通过 JTAG 提供的调试支持以及如何将这些功能组用于调试。 这意味着扫描链调试以及运行-停止调试信息。 您是否以某种方式知道是否已向公众发布此信息?

    我还对一个好的 JTAG 调试器工具感兴趣(因为 CCS 工具链显然不包含一个或其他工具、它不能很好地工作、对我来说是无用的)。 我的结论是、CCS 汇编器和链接器足以满足我的需求。 但我对其调试功能非常失望。 如果需要的话、我的预算可能超过数千美元、以获得一个良好的工具集。 所以钱不是一个障碍。 我只需要一个有效的工具、它可以在必要时帮助我识别硅故障。 (我曾遇到过其中一些问题、并在过去向 Microchip 报告过、因为它们确实具有一些非常好的接合 ICE 系统。)