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/TMS320f2.8379万D:编译代码中的意外NOP

Guru**** 2600515 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/627659/ccs-tms320f28379d-unexpeceted-nops-in-compiled-code

部件号:TMS320F2.8379万D

工具/软件:Code Composer Studio

嘿,

在我进行C2000软件开发的第一个步骤时,我发现编译器在编译的代码中添加了一些NOP。 优化设置为-O3,我使用6.2。

示例:

我为计时测试制作了C代码:
      GpioDataRegs.GPATOGLE.ALL = 0x8000万;
      f_reg_result = AdcaResultRegs.ADCRESULT0;
      f_reg_result += AdcaResultRegs.ADCRESULT1;
      f_reg_result += AdcaResultRegs.ADCRESULT2;
      f_reg_result += AdcaResultRegs.ADCRESULT3;
      f_reg_result += AdcaResultRegs.ADCRESULT4;
      f_reg_result += AdcaResultRegs.ADCRESULT5;
      f_reg_result += AdcaResultRegs.ADCRESULT6;
      f_reg_result += AdcaResultRegs.ADCRESULT7;
      v_result = f_reg_result / 8;
      GpioDataRegs.GPATOGLE.ALL = 0x8000万;

装配体的结果如下:
174        GpioDataRegs.GPATOGLE.ALL = 0x8000万;
082c2f:  1E06       MOVL        @0x6,符合
082c30:  761F002C   MOVW        DP,#0x2C
175        f_reg_result = AdcaResultRegs.ADCRESULT0;
082c32:  E2C4.03万   UI16TOF32   R3H,@0x0
176        f_reg_result += AdcaResultRegs.ADCRESULT1;
082c34:  E2C4.0201万   UI16TOF32   R2H,@0x1
177        f_reg_result += AdcaResultRegs.ADCRESULT2;
082c36:  E2C4.0002万   UI16TOF32   R0H,@0x2
176        f_reg_result += AdcaResultRegs.ADCRESULT1;
082c38:  E71.0009万B   ADDF32      R3H,R3H,R2H
082c3a:  7700       NOP          
177        f_reg_result += AdcaResultRegs.ADCRESULT2;
082c3b:  E71.0001万B   ADDF32      R3H,R3H,R0H
178        f_reg_result += AdcaResultRegs.ADCRESULT3;
082c3d:  E2C4.0203万   UI16TOF32   R2H,@0x3
082c3f:  7700       NOP          
082c40:  E71.0009万B   ADDF32      R3H,R3H,R2H
179        f_reg_result += AdcaResultRegs.ADCRESULT4;
082c42:  E2C4.0104万   UI16TOF32   R1H,@0x4
082c44:  7700       NOP          
082c45:  E71.0005万B   ADDF32      R3H,R3H,R1H
180        f_reg_result += AdcaResultRegs.ADCRESULT5;
082c47:  E2C4.0005万   UI16TOF32   R0H,@0x5
082c49:  7700       NOP          
082c4a:  E71.0001万B   ADDF32      R3H,R3H,R0H
181        f_reg_result += AdcaResultRegs.ADCRESULT6;
082c4c:  E2C4.0106万   UI16TOF32   R1H,@0x6
082c4e:  7700       NOP          
082c4f:  E71.0005万B   ADDF32      R3H,R3H,R1H
182        f_reg_result += AdcaResultRegs.ADCRESULT7;
082c51:  E2C4.0007万   UI16TOF32   R0H,@0x7
082c53:  7700       NOP          
082c54:  E71.0001万B   ADDF32      R3H,R3H,R0H
082c56:  7700       NOP          
183        v_result = f_reg_result / 8;
082c57:  E84F8018   MPYF32      R0H,#0x3e00,R3H
082c59:  761F02A0   MOVW        DP,#0x2a0
082c5b:  E203万   MOV32       @0x0,R0H
082c5d:  761F01FC   MOVW        DP,#0x1fc
184        GpioDataRegs.GPATOGLE.ALL = 0x8000万;
082c5f:  1E06       MOVL        @0x6,符合

这种NOP的原因是什么?

此致,
Thomas。

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

    在C28x上,普通CPU指令受到流水线保护。  这意味着编译器从不需要发出NOP指令来处理指令未准备好执行的情况。  CPU自行检测到这种情况并停止。  这与ADDF32等浮点指令的情况不一样。  编译器保留了这些指令的执行模型。  它知道何时不准备执行此类指令。  发生这种情况时,它会发出一个或多个NOP指令,以便处理器等待较早的指令完成。   

    总之,对于受保护和不受保护的指令,编译器会尝试调度这些指令,以便最大程度地减少停顿或NOP。

    谢谢,此致,

    -George