mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USB MSC Bootloader mit Arduino Due


Autor: Yannik S. (stegy97)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 Moderator
Autor: Jim M. (turboj)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: Stromverdichter (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: Yannik S. (stegy97)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
void (*application_code_entry)(void);

__disable_irq();
__set_MSP(*(uint32_t *)IFLASH0_ADDR);

for (int i = 0; i < 8; i ++) NVIC->ICER[i] = 0xFFFFFFFF;
for (int i = 0; i < 8; i ++) NVIC->ICPR[i] = 0xFFFFFFFF;

SCB->VTOR = ((uint32_t)IFLASH0_ADDR & SCB_VTOR_TBLOFF_Msk);

__enable_irq();
application_code_entry = (void (*)(void))(unsigned *)(*(unsigned *)(IFLASH0_ADDR +4));
application_code_entry();

Also wirklich nochmal vielen Dank an euch alle, ihr habt mir wirklich 
sehr geholfen!

Yannik

: Bearbeitet durch User
Autor: Stromverdichter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.