ATmega 8515 und "jmp 0x000"

OP #455844
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
Gast #455920
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.
#455927
Lesenswert?
• ▲
▼
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
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...
OP #456843
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren