ATmega 8515 und "jmp 0x000"

OP #455844
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
Gast #455920
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.
#455927
so mache ich es, so funktionierts auch:
1
uint16_t __bl_start = (uint16_t) GET_BL_SECTION_START();
2
 // jump to address
3
  __asm__ __volatile__                           \
4
    (                                            \
5
     "movw r30,%0\n\t"                           \
6
     "ijmp \n\t"                                 \
7
     :                                           \
8
     : "r" ((uint16_t) __bl_start)               \
9
     :
10
    );

warum das was ganz anderes sein soll, bitte verratet es mir.
bye kosmo
Gast #456281
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...
OP #456843
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.