Forum: Compiler & IDEs anderes verhalten bootloader beim sprung von applikation


von Joe D. (kosmonaut_pirx)


Lesenswert?

hallo,
ich suche nach einer möglichkeit, den bootloader anders zu fahren, wenn
er von der applikation angesprungen wurde.
hintergrund ist, dass in diesem fall kein timeout laufen soll. dieses
soll nur im reset-falle aktiviert werden und ggf. zuschlagen.

derzeit mache ich es über eine variable in der noinit:

int from_appl_jmp _attribute_ ((section (".noinit")));

die ich dann beim sprung aus der applikation setze:

from_appl_jmp = FROM_APPL_MAGIC;
asm volatile ("jmp 0x1E000"); // jmp main bootloader

und in der main des bl angekommen schaue, was sache ist:

if ( from_appl_jmp != FROM_APPL_MAGIC ){
    static S_Start _s_start; // start timer
}
else{
  from_appl_jmp = FROM_APPL_MAGIC + 1; // sram change for next reset
}

das funktioniert zwar, ist aber - imo - sehr sehr unschön. gibt es  vll
einen weg, wie das besser zu bewerkstelligen ist? irq's sind tabu, die
brauche ich.
noch etwas: "jmp 0x1E000" .. wie kann ich an die erste adresse in der
bl-section springen? ich hatte die idee, die irq-vektoren zu verschieben
und dann an 0 zu springen, aber das funktioniert aus mir unbekannten
gründen leider nicht :(

vielen dank im voraus,
schönen sonntag, bye kosmo

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

ich würde das über die Resetquellen im MCUCSR lösen. Dieses löschst du
bevor du den Bootloader anspringst. Wenn dein µC aus dem Reset kommt
ist ein Bit gesetzt und du wartest deinen Timeout ab. Kommt er nicht
aus dem Reset (du hast den BL manuell angesprungen) ist kein Bit
gesetzt -> kein Timeout.

Die Info wo die BL-Section anfängt scheint es in den io-Headern der
avr-libc nicht zu geben. IMHO bleibt dir nichts anderes als die Adresse
im Programm stehen zu haben.

Matthias

von Joe D. (kosmonaut_pirx)


Lesenswert?

gute idee, danke. den start der bl-section kann ich zur not aus den
fuse-bits ausrechnen.

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
Noch kein Account? Hier anmelden.