Forum: Mikrocontroller und Digitale Elektronik LPC2368 Bootloader Memorymap/Interruptvektoren wohin?


von Nik B. (nikbamert)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe mir gerade die APPnote AN10835 "LPC2000 secondary bootloader 
for code update using IAP" von NXP durchgelesen, habe da aber eine 
kleine Verstaendnisschwirigkeit weil die Beschreibung meiner Meinung 
nach zu wenig detailliert ist fuer jemanden der seinen ersten Bootloader 
auf nem ARM schreibt.

Mein BL ist nun beinahe fertig, schreibt alles ins Flash, springt zur 
Applikation, bleibt dann aber nach ein paar Zeilen haengen, ich denke es 
liegt wohl am im Betreff genannten.

Ich habe den Bootloader an 0x0000 0000, die Applikation startet bei 
0x0000 6000, die Applikation ist natuerlich auch dorthin gelinkt.

Nun stellt sich aber die Frage ob ich den RAM (IRAM1 in uVision) der 
Applikation nach 0x40000000 oder 0x40000040 mappen muss, und wie es mit 
den Interruptvektoren aussieht.

Ich habe dazu einen Screenshot aus der AN10835 angehaengt, ich wuerde 
meinen mit meiner Konfiguration bin ich ein "Software Activation by boot 
code" und somit "Interrupt vectors are not remapped".
Nun, meine Interrupt vector sind ja gerade nicht "remapped" deshalb 
verstehe ich nicht wirklich, weshalb meine Applikation so bockig tut.

Uploaden kann ich leider weder Source der Applikation noch des 
Bootloaders, aber es handelt sich ja nicht um eine den Sourcecode 
betreffende Frage.

Gruss
Nik

von Nik B. (nikbamert)


Lesenswert?

anstubs :-)

von Nik B. (nikbamert)


Lesenswert?

Hallo allerseits!

Nun, ich habe mitlerweilen so ziemlich alle Dinge ausprobiert die im 
Zusammenhang mit Bootloader + LPC23xx mit diesem Problem irgendwo in 
Foren auffindbar sind. Es scheint mir nicht ganz trivial zu sein.

Das Problem ist der Jump von Bootloader zur Applikation. Einerseits muss 
ich dazu die Interruptvektor ins Ram mappen (getestet, selber Fehler).

Einige Beitraege im Keil Forum weisen darauf hin dass man
a) Den Rambereich der Applikation noch weiter nach hinten schieben muss, 
damit dieser nicht mit dem Ram des BL ueberlappt. Ich kann dies 
allerdings nicht ganz verstehen, wass kuemmert es mich wenn der nachdem 
die Applikation laeuft noch mein Bootloader Ram Bereich platt macht.
Ausser den dort platzierten Vektoren(0x40 gross) kann mir das doch egal 
sein?

b) Ein experimentelles Codeschnipselchen, welches ich ebenfalls im Keil 
Forum gefunden habe, schlaegt vor dass man mit einem Trick wieder in den 
Supervisor mode kommt um den Stack wieder initilisieren zu koennen fuer 
die Applikation.
Wie das denn, macht das nicht schon der Startupcode?(uVision generiert 
den selbststaendig)

Ich finde kein gescheites Dokument welches quasi step-by-step aufzeigt, 
wass ich beim Bootloader->App jump beachten muss. Bitte helft mir vom 
Schlauch runter ;-)

Gruss
Nik

von Microman (Gast)


Lesenswert?

Hallo Nik,

habe selber schon einen Bootloader für den LPC2368 geschrieben. Habe 
aber alles unter GNU gemacht. Bei mir hat der Bootloader die Exception 
Vectoren umkopiert und das Remapping gemacht, bevor der Jump zu App im 
SVC-Mode erfolgte. Leider kann ich nicht sagen, wie diverse 
Einstellungen in Keil gemacht werden müssen, damit alles genau 
zueinander passt.
Wichtig war bei den Exception-Vectoren nur, dass die Sprungadressen als 
Konstanten direkt hinter der Exception-Vector-Adressen liegen, um eine 
ausreichende Sprungweite von überall aus den Adressraum gewährleisten zu 
können. Deshalb ja auch die 0x40 RAM die reserviert werden müssen.
Ich habe bei der App auch nur die 0x40 reserviert, da mir der Speicher 
vom Bootloader dann überhaupt nict mehr wichtig ist und die App gar 
nicht weiß das es jemals einen Bootloader vorher gegeben hat. 
Voraussetzung ist dann natürlich, das der Bootloader der MC möglichst so 
hinterlässt, wie es nach einem Reset wäre.

Keine Ahnung ob Dir etwas von dem hier geholfen hat, wenn nicht kannst 
Du aber gerne noch genauer nachfragen.

Gruß Microman

von Nik B. (nikbamert)


Lesenswert?

Danke fuer deine Antwort! Ich bin leider etwas spaet dran, konnte erst 
heute wieder an die Hardware. Ich denke es wird daran liegen, dass ich 
irgendwie nicht in den Supervisor mode komme.

Ich habe meine Applikation nun dahingehend veraendert, dass ich im 
startup code einen Codeschnippsel von NXP eingebaut habe, der fuer das 
remapping sorgt, ich denke das sollte also funktionieren.

Wie hast du das mit dem supervisor-switch geloest? Ich habe dazu ein 
paar Zeilen im Keil Forum gefunden, die als Workaround dienen soll und 
direkt vor der Stackinitialisierung platziert wird, aber klappen tut es 
weiterhin nicht.
1
SWI_RAM_ADDR    EQU             0x40000028
2
                LDR             R8, =SWI_RAM_ADDR         ;
3
                LDR             R7, [R8]                          ;Save SWI_Handler address
4
                LDR             R9, =Stack_Set_Addr
5
                STR             R9, [R8]                          ;Replace SWI_Handler (for next command) with Stack_Set_Addr
6
                SWI             11                                        ;Just jump to Stack_Set_Addr in Supervisor mode
7
8
Stack_Set_Addr  DCD             Stack_Setup
9
10
Stack_Setup             STR             R7, [R8]                          ;Restore SWI_Handler address
11
;End of edit

Gruss Nik

von daniel_III (Gast)


Lesenswert?

Hallo zusammen,

in meinem LPC2378 project benutze ich einen bootloader der auf 0 
programmiert ist.
Die Applikation liegt auf 8000h und wird erst im fertigen Produkt 
mittels IAP programmiert.

Der Bootloader und die Applikation sind total unabhaengige Programme die 
mit uVision erstellt wurden. Dazu gehoert auch das von Keil gelieferte 
LPC2300.s startup file.

Bootloader: linked at 0000

Applikation: linked at 8000.


im Bootloader werden als erstes die Interrupt Vektoren in den RAM 
Bereich 40000000 kopiert. Dann wird der 'user ram mode' selektiert 
(MEMMAP = 0x02). (in uVision startet der Rambereich ab 40000040).
Anschliessend wird die Kommunikation aktiviert (USB, UART...) wobei der 
Interrupt Teil dieser Funktionen ins RAM gelinkt sind mit UVision.
Der Bootloader testet ob eine gueltige Applikation vorhanden ist:

Ja:
---> ein Jump zur Applikation:

   VICIntEnClr = 0xFFFFFFFF;              /* disable all interrupts   */

  (*((void(*)(void))(APPLICATION_START_ADDR)))(); /* it's only a jump */

die Applikation initialisert alles neu (PLL, MEM...etc; so bleibt alles 
unabhaengig, aber das macht schliesslich LPC2300.S).

Applikation: linked at 8000.




Nein:
---> die Applikation wird vom Host angefordert und ueber USB mittels IAP 
ins Flash programmiert
anschliessend wird gibt's einen Reset mit dem Watchdog (..der Bootloader 
wird beim naechsten Start die gueltige Applikation finden und das Teil 
laeuft dann wie es sollte).

Ich habe nix Spezielles machen muessen, das startup file wurde NICHT 
geaendert; bloss die Addressen fuer die ROM und RAM Bereiche sind im 
startup wizard natuerlich angepasst worden.

hoffentlich gibt dir das eine Anregung

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.