This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Seems to be a bug...

Hello all,

while checking the code given here.
www.maxim-ic.com/.../3524
I found that Keil compiler is not generating the correct code required for the following commands in C

spiTmp = spiData[i];
SCK_PRE; MOSI=spiTmp7; SCK_MID; spiTmp7=MISO; SCK_POST; // bit 7
SCK_PRE; MOSI=spiTmp6; SCK_MID; spiTmp6=MISO; SCK_POST; // bit 6
SCK_PRE; MOSI=spiTmp5; SCK_MID; spiTmp5=MISO; SCK_POST; // bit 5
SCK_PRE; MOSI=spiTmp4; SCK_MID; spiTmp4=MISO; SCK_POST; // bit 4
SCK_PRE; MOSI=spiTmp3; SCK_MID; spiTmp3=MISO; SCK_POST; // bit 3
SCK_PRE; MOSI=spiTmp2; SCK_MID; spiTmp2=MISO; SCK_POST; // bit 2
SCK_PRE; MOSI=spiTmp1; SCK_MID; spiTmp1=MISO; SCK_POST; // bit 1
SCK_PRE; MOSI=spiTmp0; SCK_MID; spiTmp0=MISO; SCK_POST; // bit 0
spiData[i] = spiTmp;

NOTE: Here the spiTmp variable is getting modified bitwise. And then the modified byte is again copied back to spiData[i] variable

It generates this assemble code

                                           ; SOURCE LINE # 80
0004 7400        R     MOV     A,#LOW spiData
0006 2F                ADD     A,R7
0007 F8                MOV     R0,A
0008 E6                MOV     A,@R0
0009 F500        R     MOV     spiTmp,A
                                           ; SOURCE LINE # 81
000B C282              CLR     SCK
000D A200        R     MOV     C,spiTmp7
000F 9283              MOV     MOSI,C
0011 D282              SETB    SCK
0013 A284              MOV     C,MISO
0015 9200        R     MOV     spiTmp7,C
                                           ; SOURCE LINE # 82
0017 C282              CLR     SCK
0019 A200        R     MOV     C,spiTmp6
001B 9283              MOV     MOSI,C
001D D282              SETB    SCK
001F A284              MOV     C,MISO
0021 9200        R     MOV     spiTmp6,C
                                           ; SOURCE LINE # 83
0023 C282              CLR     SCK
0025 A200        R     MOV     C,spiTmp5
0027 9283              MOV     MOSI,C
0029 D282              SETB    SCK
002B A284              MOV     C,MISO
002D 9200        R     MOV     spiTmp5,C
                                           ; SOURCE LINE # 84
002F C282              CLR     SCK
0031 A200        R     MOV     C,spiTmp4
0033 9283              MOV     MOSI,C
0035 D282              SETB    SCK
0037 A284              MOV     C,MISO
0039 9200        R     MOV     spiTmp4,C
                                           ; SOURCE LINE # 85
003B C282              CLR     SCK
003D A200        R     MOV     C,spiTmp3
003F 9283              MOV     MOSI,C
0041 D282              SETB    SCK
0043 A284              MOV     C,MISO
0045 9200        R     MOV     spiTmp3,C
                                           ; SOURCE LINE # 86
0047 C282              CLR     SCK
0049 A200        R     MOV     C,spiTmp2
004B 9283              MOV     MOSI,C
004D D282              SETB    SCK
004F A284              MOV     C,MISO
0051 9200        R     MOV     spiTmp2,C
                                           ; SOURCE LINE # 87
0053 C282              CLR     SCK
0055 A200        R     MOV     C,spiTmp1
0057 9283              MOV     MOSI,C
0059 D282              SETB    SCK
005B A284              MOV     C,MISO
005D 9200        R     MOV     spiTmp1,C
                                           ; SOURCE LINE # 88
005F C282              CLR     SCK
0061 A200        R     MOV     C,spiTmp0
0063 9283              MOV     MOSI,C
0065 D282              SETB    SCK
0067 A284              MOV     C,MISO
0069 9200        R     MOV     spiTmp0,C
                                          ; SOURCE LINE # 89
006B F6                MOV     @R0,A

See the code generated for line 89. It should be


MOV A,spiTmp
MOV @R0,A

or directly


MOV @R0,spiTmp

I think its because the byte spiTmp is getting modified bitwise and that by no way the compiler is knowing that the byte is modifed and it has to read back the variable and copy the same to the destination.

I tried almost all the setting options for C51 (Code optimisation, warnings etc.), starting with default setting. And that I am using the latest version of the compiler from Keil.

It will be a great help if experts throw more light on this.

Thank you.

Regards,
Shriram

0