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.

[参考译文] CCS/MSP430FR5969:汇编语言:执行指令的周期

Guru**** 2603845 points
Other Parts Discussed in Thread: MSP-EXP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/647490/ccs-msp430fr5969-assembly-language-cycles-to-execute-instructions

器件型号:MSP430FR5969
主题中讨论的其他器件:MSP-EXP430FR5969

工具/软件:Code Composer Studio

尊敬的所有人:

我使用汇编语言、需要计算准确的编码时序。 我看不到这些代码之间的差异、但根据作者、它们需要不同的周期才能运行

MOV#dataBuf、R12;[2]载入&dataBuf[0]
MOV#DATABUFF_SIZE、R13;[1]载入到 Corr reg (numBytes) 
MOV #TX_时序_ACK、R5 ;[2]

而 dataBuf 声明为 uint8_t dataBuf[30]、而 DATABUFF_SIZE 和 TX_时序_ACK 定义为常量。 []中的数字是要执行的代码的周期数。  

我找到了 TI 的指令集摘要。 但我对我正在阅读的示例项目感到非常困惑、如上所述。

感谢您的任何建议。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    DATABUFF_SIZE 和 TX_时序_ACK 的值是什么? 如果这些值来自常数发生器、则保存循环。

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

     您好、Minh、

    所有这三条指令都将一个常量写入寄存器、该寄存器需要2个周期、如用户指南(slau367n)的第4.5.1.5.4节所示。 如果是第二条指令、可以使用常数发生器(R3和 R4)中的常数替换常量#DATABUFF_SIZE。 在这种情况下、数据从一个寄存器写入另一个寄存器、这只需要1个周期。

    谢谢、致以诚挚的问候
    Christoph

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

    非常感谢你的帮助。 在代码 DATABUFF_SIZE 和 TX_时序_ACK 中、分别为14和20。 因此、我想在本例中、我们无法应用常数发生器。 我不明白为什么提交人这么说。 也许他/她错了...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊、我还想问一件事。 这些指令的格式是什么、例如 INC &V 或 CLRC? 有一些指令我不知道它们的类型。 谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哦、很抱歉、我没有仔细阅读。 INC 的仿真器是 ADD#1、dst

    让我解释一下我的理解。 例如、对于代码:Inc .var、它将是 ADD #1、var =>它将像往常一样花费5个周期(表4.10的最后一种类型)。 但是、由于常数发生器生成的#1、最终周期将为4而不是5。 我是对的吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     您好、Minh、

    这些是仿真指令、旨在使代码更易于读取。 它们将自动替换。 INC 将使目的递增一、而 CLRC 将清零状态寄存器的进位位。

    增量 R5 

    与相同  

    地址#1、R5 

    while

    CLRC 

    与相同  

    BIC #BIT0、SR 

    谢谢、此致、

    Christoph

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

    [引用 user="Minh Ling]哦、很抱歉、我没有仔细阅读。 INC 的仿真器是 ADD#1、dst

    让我解释一下我的理解。 例如、对于代码:Inc .var、它将是 ADD #1、var =>它将像往常一样花费5个周期(表4.10的最后一种类型)。 但是、由于常数发生器生成的#1、最终周期将为4而不是5。 我是对的吗?

    [/报价]

    没错  

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

    非常感谢 Christoph 为您提供的友好支持。  

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

    尊敬的所有人:

    我遇到了生成时钟的问题。 对于以下代码、我认为时钟周期最多为12uS。 但是、它几乎达到了14美元。 如果我切换到比系统默认时钟源(1MHz)更快的时钟源(12MHz)、则误差将是一个重要因素。

    我将使用 MSP-EXP430FR5969进行测试。 时钟系统默认为1MHz。

    BIS#BIT4,&P1OUT;[5] P1.4=1 --第1轮(执行此命令后开始计算)
    NOP
    BIC#BIT4,&P1OUT;[5] P1.4=0 --23us (执行此命令时
    ) NOP
    BIS#BIT4,&P1OUT;[5] P1.4=1
    NIT4=0
    ,
    NOP #BIT4;[5] P1.4[NOP1.4=0
    

    在我的计算中、NOP 需要1个周期。 指令 BIS/BIC 需要5个周期。 只有在这些指令被执行后、引脚状态才会改变。 因此、在 P1.4上生成的时钟将花费大约12uS 的时间(6uS = NOP + BIS/BIC)。 但实际结果与在示波器上测量的结果不同。

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

    如果要处理周期数、请使用2xx (非 FRAM)系列、其中与系列数据表中注明的汇编器指令相关的所有内容都是100%正确的。

    对 FRAM 周期的计数会造成混乱、但如果需要、您可以在这方面浪费时间。 系列数据表未全面介绍该器件。 如果您需要 FRAM 器件输出引脚上的精密信号、请使用计时器。

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

    尊敬的 zrno soli:

    非常感谢您的解释和建议。 请您详细解释一下 FRAM 周期吗? 根据我的理解、默认情况下、CPU 时钟由 SMCLK 生成。 为什么这与 FRAM 有关? 我将尝试按照您的建议使用计时器来查看其响应。

    我想问的另一个问题。 我正在读取的一个用于时钟源选择的示例代码如下:

    CSCTL0_H = 0xA5;
    CSCTL1 = DCOFSEL_0;//1MHz
    CSCTL2 = SELA_VLOCLK + SELM_3 + SELM_3;
    CSCTL3 = DIVA_0 + DIVS_0;
    BITCLR (CSCTL6、(MODCLKCLKEN
    )、CSCLMCLQEN (REQEN);CSCLMCLQREEN (CSCTL6) 

    而 BITCLR 和 BITSET 被定义为:  

    //宏------------------------------------------------------------ //
    #define BITSET (端口、引脚)端口|=(引脚)
    #define BICLR (端口、引脚)端口&=~(引脚)
    #define BITOG (端口、引脚)端口^=(引脚)
    

    在上面的代码中 、除了 ACLK 请求、所有 MODOSC、SMCLK 和 MCLK 请求被禁用。 我想知道为什么这些模块、比如具有来自 SMCLK 的 CLK 源的计时器 A 模块、能够工作、因为这些时钟请求都被禁用了! 实际上、它们确实起作用、但我不明白为什么。

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

    [引用 user="Minh Ling)]非常感谢您的解释和建议。 请您详细解释一下 FRAM 周期吗? 根据我的理解、默认情况下、CPU 时钟由 SMCLK 生成。 为什么这与 FRAM 有关? 我将尝试按照您的建议使用计时器来查看其响应。

    我为 e2e 上的相关主题写了多篇文章、因此请尝试搜索。 这并不是那么简单、TI 已将其记录在案。

    例如、两个 NOP 和一个跳转(JMP $+2)应该具有相同数量的周期(2)、它们对于闪存2xx/5xx 是如此、但对于 FRAM 则不是如此。

    部分汇编器代码在闪存2xx 系列上具有相同的总周期数、并具有任何指令顺序。 对5xx 系列指令顺序的影响会影响总周期数。

    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