Forum: Mikrocontroller und Digitale Elektronik Kopieren eines Programms aus Flash zum RAM


von Markus (Gast)


Lesenswert?

Hallo zusammen,

ich möchte für meinen ARM9 (AT91SAM9261) einen Bootloader entwickeln. 
Ein wichtiges Feature ist, dass der Bootloader, der selber aus dem 
externen Flash laufen kann, die Applikation, die ebenfalls im Flash 
gespeichert ist, in das interne SRAM kopiert und diese danach ausführt?

Wie gehen ich dabei vor?
Ich habe:
- die Adresse des Programms im Flash
- die Adresse des SRAMs
- die Größe des Programms

Ich programmiere in C (oder notfalls Assembler) mit der ARM Developer 
Suite und benutze den AxD-Debugger.

von Marius (Gast)


Lesenswert?

in C geht das glaube ich mit memcpy, danach einfach die adresse des 
hauptprogramms als funktionspointer anlegen und aufrufen.

von Stefan (Gast)


Lesenswert?

So einfach ist das nicht. Die Applikation (Variablenadressen, 
Funktionsadressen) muss zur Compile/Linkzeit bereits für die SRAM 
Adressen angepasst werden.

Dies steuert man in der GCC Toolchain mit dem Linker Control Script, in 
dem die Speicherbereiche für CODE, DATA, BSS und Stack definiert werden.

Wahrscheinlich muss auch der Startup-Code angepasst werden, weil ja 
bestimmte Initialisierungen vom Bootloader erhalten bleiben müssen 
(Einsprungpunkt, Variablen?, Stack?) und andere für die Applikation 
vorbereitet werden müssen (andere Vektoren, Variablen, Stack?).

von Markus (Gast)


Lesenswert?

Ich werde die Applikation bereits so linken, dass sie für die Adresse 
des SRAM angleget ist.
Weiterhin initialisiert die App zuerst das OS (µC_OSII), womit die 
Speicherbereiche usw. angelegt werden. Die Initialisierung vom Startup 
wird wirklich nur zum kopieren (und einstellen der PLL, damit es 
schneller läuft) benötigt.

Ein weiteres Problem habe ich (oder etwa doch nicht?):
Mein Flash hat eine Adressbreite von 16 Bit, mein µC hat aber 32 Bit 
(als auch das SRAM). Kann ich die App dann einfach so kopieren, und wenn 
ja, kopiere ich in WORD oder DWORD Schritten?

von Stefan (Gast)


Lesenswert?

> Ein weiteres Problem habe ich (oder etwa doch nicht?):

Ja das musst du klären. Dahinter verstecken sich zwei Aufgaben

1/ Wenn das Flash und deine Applikation mehr als 64 KByte gross ist, wie 
kopierst du den Bereich oberhalb der 16 Bit Adressen? Gibt es bei dem 
speziellen Flash eine Art Banking, welches du in der Kopierroutine 
berücksichtigen musst?

2/ Wie ist der Zugriff auf das Flash möglich? Im Datenblatt des Flashs 
müsste stehen ob BYTE (8 Bit), WORD (16 Bit?) oder gar DWORD (32 
Bit?)Zugriffe möglich sind. Dementsprechend muss deine Kopierroutine 
ausgelegt sein. Das SRAM wird wohl alle Arten verkraften, das sollte 
nicht das Problem sein.

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.