Hallo, im Beitrag "Re: Compilerbug bei AVR-GCC ?: Stack Pointer und Interrupts" wurde das Problem diskutiert, daß der VMLAB Simulator in der vom Compiler oft erzeugten Sequenz cli out SP_H, r? out SREG, r? out SP_L, r? die Interrupts schon direkt nach dem "out SREG" wieder freigibt, und nicht erst einen Befehl später, wie es sein sollte. Dadurch kann es passieren, daß bei der Simulation (und nur dort) der Stackpointer einen falschen Wert hat. Als Workaround habe ich mir ein kleines Programm geschrieben, daß im .hex File die Reihenfolge vertauscht: cli out SP_H, r? out SP_L, r? out SREG, r? Die Simulation läuft jetzt ohne Stackpointerprobleme durch. Für die Realität bedeutet es, daß die Interruptfreigabe einen Takt später kommt, bzw. daß Simulation und Realität einen Takt auseinander liegen. Das Workaround-Programm habe ich angehängt, der Sourcecode enthält noch Hinweise, wie man es in den Build-Prozess von VMLAB einbinden kann. Viele Grüße, Peter H.
kleines Update auf Version 2.0 wegen Fehlerkorrektur :-) Korrigiert wurde - die Checksummenberechnung für die Ergebnisdatei (war falsch für checksumme == 0) - die Kommandozeilenoption quite -> quiet Viele Grüße, Peter H.
noch 'ne Fehlerkorrektur: Beim Vertauschen wurden feste Registernummern verwendet, inzwischen habe ich aber gemerkt, daß der Compiler an diesen Stellen verschiedene Register verwendet. Also werden ab jetzt einfach nur die Bytes im Hexfile vertauscht. Peter H.
Hallo nach langer Zeit, in der Version 3.15 von VMLAB kann ich diesen Fehler noch immer reproduzieren. Angehängt ist ein Testprogramm, um den Fehler hervorzurufen. Getestet habe ich mit ATmega32. Als Workaround kann weiterhin das oben genannte Tool verwendet werden, es läßt sich z.B. im Makefile unterbringen:
1 | # Create final output files (.hex, .eep) from ELF output file. |
2 | %.hex: %.elf |
3 | @echo |
4 | @echo $(MSG_FLASH) $@ |
5 | $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ |
6 | swap_sreg_spl.exe $@ |
Peter H.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.