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.

[参考译文] 编译器/TMS320F28027:简单循环。 代码生成错误?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/698078/compiler-tms320f28027-simple-loop-wrong-code-generation

器件型号:TMS320F28027

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

大家好。

我有一个简单的环路、其中 I ADC 和平均单通道。

首先,我惊讶地发现平均值是不正确的。 然后添加一个数组 BL_ADC_ARRAY、其中放置了用于调试的值。

BL_ADC_ARRAY 预先初始化为-1。

BL_ADC_ARRAT[0]<- ADCINTFLG、用于在 ADC 启动前检查标志是否存在。 好的。 标志已清除。

下面是一段代码和一个 BL_ADC_array 值....

值得一提的是、在单步执行中、它可以正常工作。

下图是生成的 ASM。

我使用编译器 v15.12.3.LTS、对整个项目的速度进行优化。

怎么了???

从调试器生成的 asm。

BL_ADC_ARRAT[0]= AdcRegs.ADCINTFLG.ALL;
3f2ba3:8F008640 MOVL XAR4、#0x008640
789UINT16 tmp = AdcRegs.INTSEL7N8.bit.INT7SEL;
3f2ba5:CC0B001F 和 AL、@0xb、#0x1f
3f2ba7:83A4 MOVL XAR5、@XAR4
3f2ba8:BE03 MOVB XAR6、#0x03
3f2ba9:9645 MOV *-SP[5]、AL
790AdcRegs.INTSEL7N8.bit.INT7SEL = 15;//+ BL_ZC_FREE_PH_NUM;// 12 + BL_ZC_FREE_PH_NUM;
3f2baa:CC0BFFE0和 AL、@0xb、#0xffe0
3f2bac:500F ORB AL、#0xF
3f2bad:DD01 ADDK XAR5、#1
3f2bae:960B MOV @0xb、AL
803BL_ADC_ARRAY[0]= AdcRegs.ADCINTFLG.ALL;
3f2baf:9204 MOV AL、@0x4
3f2bb0:96C4 MOV *+XAR4[0]、AL
800signed int Vb_sum = 0;//hi0;//= 30000;//0;// VSE。 Nizhe nulya, znachit budet vsyo ok。 没有 Tak nelzya,T.K. esli eshe do 0 ne upalo,到 budet tipa podem。
3f2bb1:9A00 MOVB AL、#0x0
3f2bb2:DC02 ADDK XAR4、#2
3f2bb3:9643 MOV *-SP[3]、AL
C$L5:
3f2bb4:761F01C4 MOVW DP、#0x1c4
811AdcRegs.ADCSOCFRC1.all = 0b1000000000000000;//<bl_ZC_FREE_PH_NUM;// smesharem suttvetstvenno na 0、1 ili 2
3f2bb6:281A8000 MOV @0x1A、#0x8000
813while (AdcRegs.ADCINTFlG.bit.ADCINT7 = 0)
C$L6:
3f2bb8:4604 TBIT @0x4、#0x6
3f2bb9:6CFF SB C$L6、NTC
817AdcRegs.ADCINTFLGCLR.bit.ADCINT7 = 1;// ubiraem 标志
3f2bba:1A050040或 @0x5、#0x0040
3f2bbc:761F002C MOVW DP、#0x2C
819vb_sum = vb_sum + AdcResult.ADCRESULT15;
3f2bbe:940F 添加 AL、@0xF
3f2bbf:9643 MOV *-SP[3]、AL
822BL_ADC_array[i]= AdcResult.ADCRESULT15;
3f2bc0:920F MOV AL、@0xF
3f2bc1:96C5 MOV *+XAR5[0]、AL
807for (i = 1;i < 9;i=i+2)
3f2bc2:DD02 ADDK XAR5、#2
822BL_ADC_array[i]= AdcResult.ADCRESULT15;
3f2bc3:9243 MOV AL、*-SP[3]
823BL_ADC_array[i+1]= Vb_sum;//AdcResult.ADCRESULT15;
3f2bc4:96C4 MOV *+XAR4[0]、AL
807for (i = 1;i < 9;i=i+2)
3f2bc5:DC02 ADDK XAR4、#2
3f2bc6:000EFFEE BANZ 65518、AR6-3f2bc8
:761F022C MOVW DP、#0x22c
827BL_V_BATT = Vb_sum;
3f2bca:962A MOV @0x2a、AL
828Vb_sum = Vb_sum / 4;
3f2bcb:FFA0 ASR AL、1
833BL_ADC_array[9]= BL_ZC_DV_DT_UP;
3f2bcc:8DC08640 MOVL XAR3、#0x008640
828Vb_sum = Vb_sum / 4;
3f2bce:FFCD LSR AL、14
833BL_ADC_array[9]= BL_ZC_DV_DT_UP;
3f2bcf:D009 MOVB XAR0、#0x9
3f2bd0:761F01C4 MOVW DP、#0x1c4
3f2bd2:8BA3 MOVL XAR1、@XAR3
828Vb_sum = Vb_sum / 4;
3f2bd3:9443 添加 AL、*-SP[3]
782uINT32时间= 0;//= CpuTimer1Regs.TIM.all;
3f2bd4:D200 MOVB XAR2、#0x0
828Vb_sum = Vb_sum / 4;
3f2bd5:FFA1 ASR AL、2
3f2bd6:9643 MOV *-SP[3]、AL
830AdcRegs.INTSEL7N8.bit.INT7SEL = 13;//+ BL_ZC_FREE_PH_NUM;// 12 + BL_ZC_FREE_PH_NUM;
3f2bd7:CC0BFFE0和 AL、@0xb、#0xffe0
3f2bd9:500d ORB AL、#0xd
3f2dda:D90B ADDK XAR1、#11
3f2bdb:960B MOV @0xb、AL
833BL_ADC_array[9]= BL_ZC_DV_DT_UP;
3f2bdc:56BF0A93 MOVB *+XAR3[AR0]、#0x0a、UNC
834BL_ADC_array[10]= Vb_sum;
3f2bde:D00A MOVB XAR0、#0xA
3f2bdf:9243 MOV AL、*- SP[3]
3f2be0:9693 MOV *+XAR3[AR0]、AL 

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

    在禁用优化或降低选择级别时、您是否观察到相同的行为?

    Bharathi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果在中断等任何其他上下文中访问该变量、您可能需要尝试将其声明为"volatile"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 、Subrahmanya、

    我没有尝试其他选择级别。 我会、但这是我最后想要做的、因为我对一些代码相关常量进行了微调。 和代码本身应尽可能快。 同样的原因,我还没有尝试更高版本的编译器。。。

    此致、  

    Konstantin

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

    这是声明为的全局变量

    易失性 signed int BL_ADC_array[BL_A_size];

    但我的示例从 ISR 中执行、并且不能为其他 IRQ 提供服务。

    根据生成的 asm、它在栈中存储 Vb_sum。 那么、它可能是堆栈溢出情况。。。?
    但在单步调试中、该代码工作正常...

    在 AdcRegs.ADCSOCFRC1.all = 0b1000000000000000之后;
    它跳过 while (AdcRegs.ADCINTFlG.bit.ADCINT7 = 0){}
    但为什么呢?


    还有其他想法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家、看起来我发现了一个问题。
    我会尝试并通知您、它是否正常。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Subrahmanya、
    问题是在转换前 ADC 被设定为脉冲 IRQ。