Forum: Mikrocontroller und Digitale Elektronik LPC2294 Programmcode aus dem RAM laufen lassen


von Uwe Heinrich (Gast)


Lesenswert?

Hallo,

bevor mich dieser Controller noch vollends in die Klappe bringt, hoffe
ich das ihr mir hier helfen könnt :-)

Folgendes Problem:

Ich möchte es ermöglichen über die serielle Schnittstelle ein Update
aufzuspielen. Damit ich den Controller flashen kann, muss ich das
entsprechende Stückchen Code aus dem Speicher laufen lassen. Was
zumindest lt. Handbuch der Controller auch beherrscht. Nur leider
verrät das Handbuch nicht wie das funktionieren soll.

Über das Scatter-Loading File habe ich versucht den entsprechenden Code
im RAM zu positionieren, was auch (zumindest lt. dem Mapping-File)
funktioniert. Und wenn ich das Handbuch richtig verstanden habe, sollte
der Prozessor beim starten dann dafür sorgen, dass der Code an die
entsprechende Stelle im RAM kopiert wird. Sobald ich den Code dann in
den Emulator lade stelle ich fest, dass an der Adresse im RAM nur
Init-werte stehen. Kann mir jmd. sagen, ob das auf diesem Wege
überhaupt möglich ist, bzw. wie ich es anstelle den Code aus dem RAM
laufen zu lassen?

Wäre klasse, wenn Ihr mir helfen könntet.

Noch ein paar technische Details, ich verwende:

- Philips LPC2294
- den Compiler von Arm (Realview DS)

Besten Dank im vorraus

Uwe Heinrich

von mthomas (Gast)


Lesenswert?

schuss ins Blaue: MAPMEM ?
Warum eigentlich die Updatefunktion selbst basteln? Kenne nur den 2106
aber hat der 2294 nicht auch einen integrierten "uart-bootloader" ab
Werk vorinstalliert?. Falls das Teil ueber IAP verfuegt (muesste es,
wenn der bootloader drin ist) kann man auch die update-routinen in eine
hohes flash segment schreiben (also nicht im RAM) und diese dann aus der
Hauptapplikation anspringen.

von Andreas Auer (Gast)


Lesenswert?

Hi

Ich kann leider keinen Hinweis geben, aber ich will mich in nächster
Zeit auch mit den Philips LPC22xx (wahrscheinlich LPC2214)
beschäftigen.
Du hast in deinem Beitrag des öfteren von "Handbuch" gesprochen. Was
hast du da für ein Handbuch, oder meintest du das Datenblatt. Hast du
ein Development Board für den LPC?? Wenn ja, würd ich noch gerne wissen
woher!

mfg
Andreas

von Uwe Heinrich (Gast)


Lesenswert?

Hi,

erstmal Danke für eure Hilfe. Ich hab inzwischen nen Ansatz gefunden
und werd das heute mal ausprobieren :-) Wenn das funzt schreib ich Euch
mal meine Lösung hier rein :-)

Andreas, ich hab mit Handbuch das User Manuel von Phillips bzw. die
Manuals gemeint, die mein Compiler Hersteller (ARM) mir mitgeliefert
hat. Das von Philips findest Du unter:
http://www.semiconductors.philips.com/acrobat/usermanuals/UM_LPC21XX_LPC22XX_2.pdf


mthomas, ich möchte den gesamten Flash-Bereich flashen können und somit
auch die Routine zur Not überschreiben können, für den Fall das sich
dort ein Fehler eingeschlichen hat, kann man diesen auf recht einfachem
Wege beheben :-)

mfg
Uwe

von Uwe Heinrich (Gast)


Lesenswert?

Hi,

also wie versprochen hier meine Lösung:

- über das Scatter-File die entsprechenden Zeilen im RAM platzieren,
hierzu eine Section anlegen. Das Scatter-File sieht dann in etwa so
aus:

MEM_REGION 0x00000000 0x4000
{
  ...
  FLASH_BURN 0x20000000 0x200
  {
    name_der_c_datei.obj (+RO)
   }
  ...
}

Die Adressen sind natürlich an den jeweiligen Prozessor anzupassen. Das
veranlasst den Compiler, den Code so zu compilieren, dass dieser aus dem
RAM lauffähig ist.

Der Linker erstellt beim linken Symbole, die einem verraten wo im ROM
der Code liegt, damit man ihm vor dem ausführen nur noch an die
entsprechende Stelle (hier ab: 0x2000000) kopieren muss.

Bevor man den Code kopieren kann muss man im entsprechendem C-File die
Symbole wie folgt noch als extern-Deklarationen einfügen

extern unsigned int Image$$FLASH_BURN$$Base
extern unsigned int Load$$FLASH-BURN$$Base

Nun kann man den Code aus dem ROM ins RAM kopieren. Mit
&Load$$FLASH-BURN$$Base erhält man einen Zeiger auf den Code im ROM und
mit &Image$$FLASH_BURN$$Base einen Zeiger auf die Stelle wo der Code
stehen muss. Den ganzen kram einfach umkopieren und die Funktion die
dort im Code liegt einfach aufrufen. Und das wars auch schon :-)

Den kram aus den Handbüchern heraus zu filtern hat mich immerhin 2 Tage
gekostet... aber zum Glück tuts nun :-)

mfg
Uwe

von mthomas (Gast)


Lesenswert?

Danke Uwe fuer die Information was zu tun ist. Habe versucht
herauszufinden, wie die Vorgehensweise fuer eine solche Aufgabe bei der
gcc-toolchain ist. Scheint deutlich anders als beim ARM compiler.
Hinweise ("google futter") wie man Code fuer die Ausfuehrung an einer
anderen Adresse mit der gcc-Toolchain erzeugt sind willkommen.
Martin

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.