Forum: Compiler & IDEs Merkwürdiges Verhalten von WinAVR


von SeppK (Gast)


Angehängte Dateien:

Lesenswert?

Ich arbeite mit WinAVR und AVRStudio, jeweils die aktuellste Version.
Bin auf folgendes Problem gestossen. Es geht bei folgender Routine um
die while-Schleife. Die Routine wird von WinAVR ohne zu meckern
compiliert.
Sehe ich mir die while-Schleife im AVRStudio im Disassembler-Fenster an

ist die Reihenfolge der darin enthaltenen Befehle umgekehrt, was für
das
Programm ziemlich fatal ist. Benutze ich stattdessen eine
do-while-Schleife
ist alles in Ordnung. Wer kann sich (und mir) dieses Verhalten
erklären?
1
void add_PAT_entry(volatile uint8_t *name,volatile uint8_t *data)
2
{
3
   volatile uint8_t *pEntry;
4
   volatile uint16_t *pFirstBlock;
5
   
6
   
7
   pEntry=upictureAllocationTable.pictureAllocationTable.PAT;
8
  
9
pFirstBlock=(uint16_t*)upictureAllocationTable.pictureAllocationTable.FreeBlock;
10
   
11
   while(*name)
12
   {
13
  *pEntry++=*name;
14
    eeprom_schreiben((uint16_t)pFirstBlock++,*name++);
15
   };
16
   
17
  
18
upictureAllocationTable.pictureAllocationTable.FreeBlock=(uint16_t)pFirstBlock;
19
20
}

von peter dannegger (Gast)


Lesenswert?

Dein Listing paßt nicht zum Quelltext, daher kann man nichts dazu
sagen.

Schau Dir lieber das Assemblerlisting mit eingefügten Quelltext des GCC
an.

Auch wenn der Compiler umoptimiert, er hatte bei mir bisher immer
recht.


Peter

von Karl H. (kbuchegg)


Lesenswert?

> Sehe ich mir die while-Schleife im AVRStudio im Disassembler-
> Fenster an ist die Reihenfolge der darin enthaltenen Befehle
> umgekehrt

Das heist nicht viel.
Der Compiler hat da einiges umgestellt, sodass keine exakte
1:1 Zurdnung zum originalen Quelltext nicht mehr möglich
ist. Beim kurzen Überfliegen des Assembler sieht aber alles
in Ordnung aus. Der CALL (eeprom_write) findet ganz zum
Schluss der Schleife statt.

Wenn also Dein Pgm nicht funktioniert, dann liegt es nicht
am Compiler sondern (so wie in 99.9% aller Fälle) am
Programmierer.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.