Merkwürdiges Verhalten von WinAVR

Gast #364641
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
}
Angehängte Dateien:
Gast #364642
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
#364643
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.