Forum: Compiler & IDEs LPC2478 - Problem mit Bootloader


von Christian (Gast)


Lesenswert?

Hallo,

ich habe derzeit ein Problem mit einem LPC2478.

Meine Applikation (einige Daten über die UART empfangen, ein paar Tasten 
auslesen und diverse Werte auf einem TFT ausgeben) habe ich soweit 
ziemlich stabil in Betrieb.

Jetzt habe ich noch einen SD-Karten Bootloader (NXP Application Note 
AN10835) implementiert.

Den Bootloader habe ich fix und fertig so übernommen - habe nur ein paar 
Anpassungen bzgl. der Ports usw. getätigt.

Den Bootloader habe ich erstmal mit der Keil Demo übersetzt, meine 
eigentliche Applikation habe ich aber mit WinArm erstellt.

Der Bootloader funktioniert auch soweit. Ich kann mein 
Applikationsprogramm mit WinArm übersetzen, die Binätdatei auf die 
SD-Karte schieben und anschließend den Controller über das Bootloader 
Terminal flashen.

Das Applikationsprogramm wird eigentlich auch korrekt ausgeführt, 
allerdings mit einem kleinen (oder besser gesagt GROßEN) Haken...

Ich habe im internen RAM ein paar große Arrays angelegt, in denen ich 
div. Werte zwischenspeichere.
Nun tritt das Phänomän auf, dass diese Werte teilweise willkürlich 
überschrieben und verändert werden.
Die Größen der Arrays und auch der Zugriff über irgendwelche Pointer 
etc. habe ich bereits mehrmals überprüft - alles io.

Ich steh inzwischen wirklich auf dem Schlauch...

Noch ein paar Fakten:
---------------------
Der Bootloader ist auf 0x00000000 gelinkt.
Die Applikation ist auf 0x10000 gelinkt.
Der RAM-Bereich der Appliaktion beginnt ab 0x40000040
Im Startup File der Applikation kopiere ich die Exception Vectors nach 
0x40000000 und aktiviere das Memory Mapping.

Was ich nun durch rumspeilen festgestellt habe ist folgendes:
Wenn ich im Linkerskript des Applikationsprogrammes den RAM-Bereich erst 
bei 0x40000100 (anstatt bei 0x40000040) beginnen lasse, funktioniert 
alles einwandfrei.
Irgenwo und irgendwie kommt sich etwas in die Quere.
Im MAP-File konnte ich allerdings nichts Verdächtiges feststellen.

Probleme mit dem Stack schließe ich inzwischen auch aus, da ich diese 
Bereich zum testen z. Zt. alle auf 0x400 stehen habe...

Hat jemand von Euch eine Iddee?

Gruß,

Christian

von holger (Gast)


Lesenswert?

>Was ich nun durch rumspeilen festgestellt habe ist folgendes:
>Wenn ich im Linkerskript des Applikationsprogrammes den RAM-Bereich erst
>bei 0x40000100 (anstatt bei 0x40000040) beginnen lasse, funktioniert
>alles einwandfrei.
>Irgenwo und irgendwie kommt sich etwas in die Quere.
>Im MAP-File konnte ich allerdings nichts Verdächtiges feststellen.

Wenn der Bootloader das neue Programm geflasht hat solltest
du dringend einen Reset z.B. durch Watchdog oder so durchführen.
Machst du das?

von Christian (Gast)


Lesenswert?

Hallo Holger,

erstmal danke für die Rückmeldung.

Nein, z. Zt. springe ich nach dem Flashen direkt zur Applikation.

Deinen Vorschlag werde ich mal ausprobieren.

Du meinst also, dass nach dem Flashen evtl. irgendwelche Resourcen noch 
nicht freigegeben sind?

Gruß,
Christian

von holger (Gast)


Lesenswert?

>Du meinst also, dass nach dem Flashen evtl. irgendwelche Resourcen noch
>nicht freigegeben sind?

Nein, ich meine das dein Bootloader dieselben Resourcen
benutzt wie deine Applikation. Der weiss möglicherweise
gar nichts von deiner Applikation. Und dann überschreibt er
dir halt RAM Bereiche weil er sie selber auch nutzt.

Also sauberen Reset hinlegen damit aufgeräumt wird.

von Christian (Gast)


Lesenswert?

Achso - nein.

Der Ablauf bei meinem Prog. ist folgender:

1. Reset
2. Bootloader startet (immer)
3. Flashen der Applikation (falls gewünscht)
4. Sprung nach 0x10000
4.1 Neuinitialisieung des Controllers, Applikation

Die Applikation selbst kann den BL nicht mehr aufufen.
Das heißt, dass der BL nach dem Start der Applikation tod da liegt - der 
wird bis zum nächsten Reset ja nicht mehr verwendt und läuft ja nicht 
mehr.

Hab ich da evtl. noch was nicht beahtet?

Gruß,
Chistian

von holger (Gast)


Lesenswert?

>Der Ablauf bei meinem Prog. ist folgender:
>
>1. Reset
>2. Bootloader startet (immer)
>3. Flashen der Applikation (falls gewünscht)
>4. Sprung nach 0x10000
>4.1 Neuinitialisieung des Controllers, Applikation

Ok, räumt der Bootloader auch hinter sich auf?
Also benutzte Interrupts ausschalten, UART abschalten,
DMA abschalten usw? Das volle Programm. Bevor du in
die Applikation springst sollte der Controller so
sauber sein wie nach einem Reset.

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.