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