Forum: Mikrocontroller und Digitale Elektronik ARM - Init Problem bei Second-Stage-Bootloader ADUC7060


von Lars D. (eitum)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein größeres Problem bei der Verwendung eines 
Second-Stage-Bootloaders auf dem ADUC7060.
Das Projekt besteht aus einem Bootloader welcher im Speicher unter 
0x80000 – 0x807FF liegt und einer Anwendung welche bei 0x80800 beginnt.
Ohne Bootloader funktioniert die Anwendung fehlerfrei, wenn sie von der 
Adresse 0x80000 ausgeführt wird. Der Bootloader selbst initialisiert 
einige Hardware und springt unter gewissen Bedingungen in die Anwendung 
mittels
1
void Bootloader_JumpToApplication(uint32_t targetAddress)
2
{
3
    //!< funtion pointer definition for entry into main application
4
    typedef  void (*pFunction)(void);
5
6
    // disable all interrupts before do anything
7
    __disable_irq();
8
    
9
    pFunction EntryPoint = (pFunction)targetAddress;
10
      
11
    EntryPoint();
12
}
Die Anwendung reinitialisiert im StartUp die Vectoren und legt diese in 
den RAM. Anschließend wird der restliche RAM mit 0 beschrieben.
Starte ich die Anwendung dann direkt, wird sobald ich die 
Interrupt-gesteuerte Kommunikation starte, der pAbt Handler ausgelöst.
Setze ich im Interrupt einen Breakpoint, springt er beim Debuggen 
dorthin. Lösche ich ihn dann und lass die Anwendung weiter laufen, sehe 
ich, dass der Controller reseted und anschließend funktioniert die 
Kommunikation fehlerfrei.
Ich vermute daher, dass der Fehler bei den Vectoren zu suchen ist, finde 
aber keinen Ansatzpunkt.

Hilfreiche Vorschläge oder Fragen zur Präzesierung sind gern gesehen.

von Lars D. (eitum)


Lesenswert?

Ich habe eine Lösung welche ich gern der Allgemeinheit zukommen lassen 
möchte:
Das Problem liebt im StartupCode des Bootloaders.
Um Speicher zu sparen, werden keine Stack Pointer für die anderen 
Betriebsmodi außer User und IRQ initialisiert. Dies soll erst in der 
Applikation erfolgen.

Folgende Zeile im Bootloader Startup sorgt dafür, dass der Controller in 
den User Mode wechselt:
1
 ;  Enter User Mode and set its Stack Pointer
2
                MSR     CPSR_c, #Mode_USR

Danach ist es nicht mehr möglich den Betriebsmodi zu wechseln, auch 
nicht in der Applikation und damit konnten die anderen Stackpointer 
nicht initialisiert werden.

Kam es zum Reset, wurde nicht der eigentliche Reset Pointer aufgerufen 
sondern, der im Ram verlegt. Dieser startete dann der Startup Code der 
Applikation welche dann eine saubere Initialisierung durchführen konnte.

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.