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.

Compiler/TMS320F28027: simple loop. wrong code generation?

Part Number: TMS320F28027


Tool/software: TI C/C++ Compiler

Hello, all.

I have a simple loop, where I adc and average single channel.

Firstly, I was surprisingly figured out that average was incorrect. Than I add an array BL_ADC_ARRAY where put values for debug purposes.

BL_ADC_ARRAY initialized to -1 beforehand.

BL_ADC_ARRAY[0] <- ADCINTFLG to check whether flag exist before adc start. Ok. flag is clear.

below is a piece of code and a BL_ADC_ARRAY values....

It worth mention, that in single stepping it works ok.

Below picture is a asm generated.

I use compiler v15.12.3.LTS, whole project optimization for speed.

What's wrong???

generated asm from debugger.

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