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