Ich versuch in Microvision das Programm in den "executable RAM" zu flashen. Hab auf jeden Fall genügend Speicher, doch bekomme beim Kompilieren die Meldung: "Numeric Value is out of Range". Woran hakts?
> Woran hakts?
Es fehlen alle sinnvollen Informationen. Meine Glaskugel ist in
Reparatur.
Der externe RAM hat den Speicherbereich: 0x81000000 - 0x81200000 Unter "LA Locate" hab ich angegeben: User classes: ERAM(0x81000000-0x81200000) Mein Programm ist folgender: #include <LPC22XX.H> int main(void) __ram { int var = 1; var++; return 0; } --> Das ist ein winziges Programm. Das sollte doch in den externen RAM locker reinpassen?
John schrieb: > "Numeric Value is out of Range". Woran hakts? Bitte den ganzen Build-Output posten. Gruß Oliver
Build target 'Projekt2_XFLASH' assembling Startup_phyCORE-LPC2294.s... compiling test.c... linking... *** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS CAUSE: Numeric value is out of range SEGMENT: ?PR?main?Blinky ADDRESS: 081000004H *** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS CAUSE: Numeric value is out of range SEGMENT: ?PR?main?Blinky ADDRESS: 08100001AH Program Size: data=1336 const=208 code=468 Target not created
Oh man.. Das tut echt der Seele weh. Ich hab das Problem gelöst: Die Funktion war im "THUMB"-Modus. Nachdem ich Sie in "ARM"-Modus umgedänert habe gings. Womit hat das zu tun? Wieso kann man einer Funktion nicht "__ram" anhängen, wenn diese nicht im ARM-Modus ist? lg
Aber jetzt, wo das Programm dann in den RAM geladen wird, wird es auf dem Board nicht ausgeführt.
Wieso funktioniert mein Code nicht, wenn ich hinter dem Funktionsnamen noch "__ram" mit angebe? Es wird richtig kompiliert und in den Mikrokontroller geflasht. Ohne "__ram" funktioniert es , mit "__ram" aber nicht. Wieso?
Ich schätze mal, dass das Hauptprogramm zwagsläufig im Flash Speicher stehen muss, weil der Programmzähler nach einem Reset auf einer Adresse steht, die den Flash Speicher anspricht. Warscheinlich kannst Du andere funktionen in den RAM verschieben, aber nicht das Hauptprogramm. Mich würde mal interessieren, wie die ensprechen gekennzeichneten Programmteile überhaupt in das RAM übertragen werden, um später ausgeführt zu werden. Initial muss der Code ja wohl im Flash liegen, dann ins RAM kopiert werden und dann erst ausgeführt werden. Den dazu nötigen Code erzeugt der Compiler sich nicht "von selbst", oder doch?
Ja du hast Recht. Das Problem tritt nur dann auf, wenn ich bei der Hautpfunktion main auch "__ram" mit angebe. Woran liegt denn das? lg
John schrieb: > Woran liegt denn das? Sollte irgendwo in der Compiler-Doku stehen. Manchmal sind Compilerbauer aber auch praktisch denkende Menschen. Sie implementieren nur das, was auch einen Sinn hat. Und welchen praktischen Vorteil siehst darin, das Main in den RAM zu packen? RAM ist in der Regel nicht üppig. Daher packt man nur schnelle Funktionen und Interrupts hinein. Peter
John schrieb: > Ja du hast Recht. Das Problem tritt nur dann auf, wenn ich bei der > Hautpfunktion main auch "__ram" mit angebe. Woran liegt denn das? Ich mutmaße mal folgendes: 1. Die Funktion main() ist ja nicht der allererste Code, der nach einem Reset ausgeführt wird. Davor läuft ja noch der (aus C-Sicht unsichtbare) Startup-Code (Variableninitalisierung usw). Erst am Ende davon springt dann die CPU zu main(). 2. Der µC hat einen Resetvektor, indem die Adresse des Startup-Codes steht. Nach einem Reset (und PowerOn ist ja auch ein Reset) springt der µC in den Startup-Code und der Startup-Code springt dann an die Adresse, wo er main() vermutet. 3. Du mußt also Deine RAM-Adresse irgendwie in den Startup-Code bekommen, oder Du läßt main() im Flash und springt erst aus main() in Deinen RAM-Code.
Was ist denn der Sinn des Ganzen? Entwicklung im RAM oder schnelle Funktionen? Für schnelle Funktionen gehören nur diese in RAM - wenn überhaupt, bei den LPC2000 bringt das nicht so arg viel. Es ergibt aber keinen Sinn, das ganze Programm Funktion für Funktion mit __ram zu versehen um die Entwicklung im RAM statt im Flash durchzuführen. Los wirst du das Flash dann nämlich trotzdem nicht, weil der Kram trotzdem als Initialisierungsdaten dort landet und beim Start ins RAM kopiert wird. Es lässt sich normalerweise im Entwicklungssystem einstellen, dass der komplette Kram im RAM landet und das Flash überhaupt nicht verwendet wird, Reset/Interrupt-Tabelle inklusive.
Vermutlich ist der Startup-Code in Assembler geschrieben und verwendet einen kurzen Sprung zum Main, der den RAM nicht erreichen kann. Oder er verwendet garkeinen Sprung und muß daher direkt vor dem Main stehen, d.h. läuft einfach in das Main hinein. Sobald Du aber im C-Programm bist, kümmert sich der Compiler darum, den passenden Sprungbefehl zu verwenden. Da ist also jede Adresse in Reichweite. Peter
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.