mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik VMLAB Interrupt zu früh, Stackpointer falsch


Autor: Peter H. (pehe)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter H. (pehe)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter H. (pehe)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter H. (pehe)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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:
# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
    @echo
    @echo $(MSG_FLASH) $@
    $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
    swap_sreg_spl.exe $@ 

Peter H.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.