Hat jemand eine Idee bevor ich verzweifel?
Bei folgendem Code.. und c=0x00;
Code:
#define LCD_LL 0x0f
static uint8_t lcd_cpos;
static uint8_t lcd_line;
c=0x00;
lcd_line = 0x00;
lcd_cpos = (c - (lcd_line * LCD_LL));
Kommt bei mir in lcd_cpos immer 1 raus.. obwohl es 0 sein muss.
Bei (lcd_line * LCD_LL) müsste es sich zu 0 x 15 also 0 berechnen was es nicht tut und bei c=0 dann 0 - (0 x 15) = 0 !!! nicht 1
Erst hab ich gedacht, es liegt am casting weil c ein typ char ist und hab alles mit (uint8_t) versehen aber es ändert sich nichts.
Es werden auch keine Bereichsgrenzen überschritten, keine Division durch 0.. oder sonstiger Unfug...
Ist der Compiler defekt?
Ich habs unter Amtel Studio 6.1 2730 SP2 im Sim laufen lassen und da kommt auch 1 raus. CPU Defekt ist damit auszuschließen.
Da dieser Machinecode simuliert, scheint ja der Code nicht ok zu sein... hier mal eine Ausgabe mit -O0
Code:
596: c=0x00;
000008A1 STD Y+2,R1 Store indirect with displacement
597: lcd_line=0x00;
000008A2 STS 0x00BF,R1 Store direct to data space
599: lcd_cpos = (c - (lcd_line * LCD_LL));
000008A4 LDS R25,0x00BF Load direct from data space
000008A6 LDI R24,0xF0 Load immediate
000008A7 MUL R25,R24 Multiply unsigned
000008A8 MOV R25,R0 Copy register
000008A9 CLR R1 Clear Register
000008AA LDD R24,Y+2 Load indirect with displacement
000008AB ADD R24,R25 Add without carry
000008AC SUBI R24,0xFF Subtract immediate
000008AD STS 0x00BE,R24 Store direct to data space
Und nu mit -O1
Code:
597: lcd_line=0x00;
00000257 STS 0x00BF,R1 Store direct to data space
599: lcd_cpos = (c - (lcd_line * LCD_LL));
00000259 LDI R24,0x01 Load immediate
0000025A STS 0x00BE,R24 Store direct to data space
In beiden Fällen kommt 1 raus, im letzten lädt er die 1 sogar einfach nur ins R24 und schreibt sie weg.
Das er beim Optimierungslauf mit O1 die Multiplikation mal eben weg spart kann ich mir ja noch erklären - aber das er das mit einer 1 ersetzt.. nicht!
Angaben zur Toolchain:
Installed Packages: Atmel AVR (8 bit) GNU Toolchain Snapshot - 3.4.2.1000
AVR Toolchain 8 Bit
Version: AVR8_Toolchain_Version:3.4.2.974 GCC_VERSION:4.7.2
Package GUID: 01BAAEB9-EC97-4398-95D1-633DB220CD77
Company: Atmel
HelpUrl:
Release Description: AVR Toolchain For 8-Bit Devices
Falls das wirklich ein Compilerfehler ist, dürfte das mehr Leute betreffen... und nicht nur RP6ler..
Ich wollte es morgen mal mit der recht neuen 6.2 Studio Beta probieren.. in der Hoffnung, das da eine neuere Toolchain mit bei ist.
Ich verstehs aber trotzdem nicht. HILFÄÄÄÄÄ
(die 3.4.3 Toolchain, welche bei Atmel angeboten wird, ändert auch nichts daran... grade noch probiert...)
Gruß