Hallo, ich bin seit Jahren Leser dieses Forums und bin jetzt zum ersten mal nicht fündig geworden: Ich habe für den Arduino Due einen Bootloader geschrieben, der im Flash1 sitzt und beim Start direkt geladen wird (GPNVM für Flash1 gesetzt). Dieser sucht auf einem USB Stick nach einer aktuelleren Firmware als die bereits installierte und schreibt diese gegebenenfalls an die Adresse 0x80000 (Also beginn von Flash0). Das Problem: Wenn die Firmware geschrieben ist, springt er scheinbar nicht an die richtige Stelle, bzw. das Programm in Flash0 wird nicht ausgeführt. Das komische ist, die Firmware habe ich separat getestet und stand dabei genau an der gleichen Adresse, wie es der Bootloader schreiben würde (0x80000). Auch nachdem der Bootloader die Firmware geschrieben hat, ist das Speicherabbild von Flash0 identisch mit dem, das ich beim Test gelesen hab. Demnach funktioniert der Bootloader für sich schon, nur springt er danach nicht zu 0x80000. Hat jemand eine Idee? Würde mich über jede Denkanregung freuen! MfG Yannik
:
Verschoben durch User
Yannik S. schrieb: > Ich habe für den Arduino Due einen Bootloader geschrieben Aha, Wo ist der Quellcode? Yannik S. schrieb: > Das Problem: Wenn die Firmware geschrieben ist, springt er scheinbar > nicht an die richtige Stelle, bzw. das Programm in Flash0 wird nicht > ausgeführt. Tja, da haste dann einen Fehler drin. Von allein springt der nicht im Flash rum, und Cortex-M Programme haben an der untersten Addresse eine Vektortabelle und keinen ausführbaren Code. Also ist einfaches nach 0x8000 springen schon mal falsch -> Hardfault.
Hallo Yannik, warum schaust du nicht mit einem Debugger, an welche Adresse er springt? Wenn du einen Bootloader schreiben kannst, weißt du auch sicherlich, wie die Linker-Skripte jeweils anzulegen sind? Wohin springst du? In den Reset-Handler des neuen Programmbereiches? Werden die Interrupt-Vektoren auch passend für den neuen Bereich umgestellt? Schau dir doch mal an wie das andere machen. Ohne deinen Code preiszugeben, wirst du nur sehr schwer Hilfe bekommen können. Ja wohin springt denn nun dein Bootloader? Das kann dir keiner beantworten, außer du selbst.
Jim M. schrieb: > und Cortex-M Programme haben an der untersten Addresse eine > Vektortabelle und keinen ausführbaren Code. … wobei es ja fast passt: der erste Eintrag ist der Wert des neuen Stackpointers (den der Bootloader selbst entsprechend setzen sollte, bevor er die Firmware anspringt), der zweite ist der Reset-Vektor.
Hallo! Vielen Dank, dass ihr euch mit meinem Problem beschäftigt habt! Stromverdichter schrieb: > Wenn du einen Bootloader schreiben kannst, weißt du auch sicherlich, wie > die Linker-Skripte jeweils anzulegen sind? Kann ich eben nicht ;) Aber das mit dem Linken klappt wenigstens. Nachdem ich alle euren Tipps berücksichtigt hab, komme ich zu folgendem (funktionierenden!!!!) Code zum laden der Software:
1 | void (*application_code_entry)(void); |
2 | |
3 | __disable_irq(); |
4 | __set_MSP(*(uint32_t *)IFLASH0_ADDR); |
5 | |
6 | for (int i = 0; i < 8; i ++) NVIC->ICER[i] = 0xFFFFFFFF; |
7 | for (int i = 0; i < 8; i ++) NVIC->ICPR[i] = 0xFFFFFFFF; |
8 | |
9 | SCB->VTOR = ((uint32_t)IFLASH0_ADDR & SCB_VTOR_TBLOFF_Msk); |
10 | |
11 | __enable_irq(); |
12 | application_code_entry = (void (*)(void))(unsigned *)(*(unsigned *)(IFLASH0_ADDR +4)); |
13 | application_code_entry(); |
Also wirklich nochmal vielen Dank an euch alle, ihr habt mir wirklich sehr geholfen! Yannik
:
Bearbeitet durch User
Hallo Yannik, schön dass dein Code funktioniert. Ich finde es auch gut, dass du uns den Code zeigst. Es wäre für alle, und auch für dich hilfreich, wenn du im Code kommentierst, was welche Zeile macht. Z.B.: //Interrupts abschalten //anstehende Interrupts löschen ... Wenn du in einem Jahr mal wieder an den Code ran musst, findest du dich dann viel leichter zurecht. Schönes WE, Stromverdichter
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.