Forum: Mikrocontroller und Digitale Elektronik userprog dataflash


von Bernd S. (mms)


Lesenswert?

Hallo,

ich hab einen kleinen "Bootloader" geschrieben, welcher im Dataflash 
gespeichert ist. Nach dem Prozessorstart AT91RM9200 wird der Bootloader 
in den internen RAM 0x0 geladen und ausgeführt. Unter anderem ladet 
dieser Bootloader das Userprogramm welches ebenfalls im Dataflash 
abgelegt ist (offset 0x4200) in den SDRAM

Zum Schluss möchte ich gern dieses Userprogramm starten und springe an 
die Startaddresse vom SDRAM (an der sich auch das Userprogramm 
befindet). Zwar wird der Sprung ausgeführt, allerdings erfolgt auch 
innerhalb des Startup-Codes wieder ein Rücksprung auf 0x0, so dass das 
Boot-Programm immer wieder ausgeführt wird.
1
typedef void (*fnc)(void);
2
const fnc AppEntry = (fnc) 0x20000000;
3
4
int main(void)
5
{
6
  
7
  led();
8
9
  //cpy prog from df to sdram
10
  memcpy((char *)0x20000000, (char *)0x00004200, size); 
11
  
12
  //start app 
13
  AppEntry(); 
14
15
  return(0);
16
17
}


Gruß
Bernd

von Haku (Gast)


Lesenswert?

Im Zweifelsfall häng den Prozessor doch auf:
1
for (;;);

Pass aber auf, dass der Optimierer nich zulangt.

von Bernd S. (mms)


Lesenswert?

1
//cpy prog from df to sdram
2
  memcpy((char *)0x20000000, (char *)0x00004200, size);

hab ich hier lediglich im übertragenen Sinne verwendet. Eigentlich steht 
hier eine Funktion ReadSPI(), welche die notwendigen Commands etc. an 
das DF schickt und dadurch die Daten in den SDRAM kopiert werden.


>Im Zweifelsfall häng den Prozessor doch auf-...

Das würde nicht einmal funktionieren, da der Prozessor die while(1) oder 
for(;;) Schleife nicht erreichen würde. Der Prozessor führt den 
AppEntry() Sprung aus und innerhalb der ARM-Vektoren springt die 
Anwendung auf 0x0 zurück und startet somit den Bootloader wieder neu.




Bernd

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.