www.mikrocontroller.net

Forum: Compiler & IDEs ATmega 8515 und "jmp 0x000"


Autor: Jürgen Sachs (jsachs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

auf die Gefahr hin das ich mich nun blamiere:
der ATmega8515 kennt wohl keinen "jmp" Befehl. Zumidest meckert der gcc 
bei der Zeile :
asm("jmp 0");
mit :
/tmp/ccu3fldo.s:112: Error: illegal opcode jmp for mcu atmega8515

Ein Blick ins Datenblatt bestätigt meine Vermutung.
Ich nehme an die Lösung ist "rjmp"
Aber wie springe ich da geziehlt an 0x0000 (von meinem Bootloader aus). 
Ich weis ja von meinem C-Code aus nicht an welcher Stelle des Programms 
ich nun stehe.

Danke für Eure Hilfe
Juergen

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
probier doch nen IJMP.
bye kosmo

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alle AVRs mit bis zu 8 KB Flash besitzen keinen jmp-Befehl, sondern nur 
den rjmp. jmp gibts nur für die AVRs mit 16 KB Flash und mehr. In jedem 
AVR-Datenblatt steht übrigens hinten eine Tabelle aller Befehle, die für 
den Controller relevant sind.

ijmp macht einen indirekten Sprung und ist etwas ganz anderes.

Autor: Jürgen Sachs (jsachs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ich schon schrieb, viel mir das im Datenblatt ja auch auf.
Nur wie mache ich es dann.
Kann mir einer hier ein Beispiel geben, also nur die Zeilen die für den 
Sprung Notwendig sind ?

Danke
Juergen

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so mache ich es, so funktionierts auch:
uint16_t __bl_start = (uint16_t) GET_BL_SECTION_START();
 // jump to address
  __asm__ __volatile__                           \
    (                                            \
     "movw r30,%0\n\t"                           \
     "ijmp \n\t"                                 \
     :                                           \
     : "r" ((uint16_t) __bl_start)               \
     :
    );

warum das was ganz anderes sein soll, bitte verratet es mir.
bye kosmo

Autor: Jürgen Sachs (jsachs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Joe,

hab dein Beispiel etwas gekürzt:
  asm("movw R30,0x0000");
  asm("ijmp");
Funktioniert tadellos.

Gruss
Juergen Sachs

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

als unlesbare Version (oder als Denkaufgabe ;)

clr r0
push r0
push r0
ret

Gruß aus Berlin
Michael


Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, wenn ich die anderen Postings richtig gelesen hätte, dann hätte 
ich vll. auch mitgekriegt, worum es eigentlich ging... 
schämundineckeverkriech Sorry, kosmo hatte natürlich recht. Michaels 
Variante ist allerdings auch nett...

Autor: Jürgen Sachs (jsachs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch, da muß ich zustimmen.
Michaels Varinte ist echt nett. Den Compiler auch so zu verschaukeln :-)
Aber es funktioniert.

Andere Frage, wieso geht folgendes nicht ?:

void (*restart)(void) = (void (*)(void))0x0000; // Dummyfunktion an 
Adresse 0x0000
restart();

Das wäre eine schöne(?!) C-Only Variante gewesen. Aber durch das 
Verschieben von ".text" in den Bootloader Bereich wandert auch das 
0x0000 dorthin, d.h. der Compiler hat den Wert angepasst.
Wieso macht er das nicht bei den obigen Lösungen in Asembler ?
Oder kann man ihm das für die eine Codezeile verbieten ?

Gruss
Juergen

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.