Hallo, ich schreibe gerade an meiner Studienarbeit und nutze dabei den DSP TMS320F28016 von Texas Instruments auf einem eva-board von Olimex (TMS320-P28016 ist der name des boards). Ich habe nun alle benötigten Peripherien in Betrieb genommen und auch erfolgreich. Dachte ich zumindest. Denn als ich meine Teilprogramme zusammengeführt habe, passt auf einmal der Code nicht mehr in den RAM. Dieser ist allerdings 12kB groß und mein Programm kann eigtl. nix ausser initialisieren und ein bisschen idlen. Wenn ich mir den Disassembly Code anschaue, dann belegt der von mir geschriebene Teil die Adressen 0x08000 .... 0x08200 Der RAM geht allerdings bis 0x09000. die restlichen Adressen zwischen meinem Code und dem RAM-Ende sind voll mit Befehlen, denen kein Source-Code zugeordnet werden kann durch das Code Composer Studio. Und dazwischen immer mal versplittert die ein oder andere Funktion aus den Headerfiles von TI. Die Code-Start-Marke c_int00 liegt verwunderlicherweise auf Adresse 0x8676 und der unterste Bereich zwischen 0x8748 und 0x9000 ist mit _etext bezeichnet, was mir (und google) überhaupt nichts sagt. Hat jemand schon mal das selbe (oder ein ähnliches) Problem gehabt und eine Lösung parat? Wie könnte ich denn dafür sorgen, dass wirklich nur der Code im RAM liegt, den ich geschrieben habe und die eingebundenen Headerfiles direkt dahinter? Hoffentliche könnt ihr mir helfen. Liebe Grüße, Andreas
Je nach Anwendung macht es öfters Sinn, die Initialisierungen direkt vom Flash auszuführen, wie auch Funktionen die selten benutzt werden. Sollte der ganze Code zeit unkritisch sein, dann ist es kein Problem den kompletten Code direkt aus dem Flash auszuführen.
@Leo: wie kann ich denn sicherstellen, dass bestimmte Teile meines Programms in den Flash geschrieben werden und andere in den RAM? Ich habe von TI ein Linker-command-file, welches den Source-Code in den RAM schreibt und ein cmd-file für die ausführung aus dem Flash. @Jan: was ist ein Map-file und wie kann ich einsehen? Meinst du die Memory Map des DSP?
Als Beispiel: Im Linker unter Page 0 steht folgende Code-Zeile:
1 | FLASHA : origin = 0x3F6000, length = 0x001F80 /* on-chip FLASH */ |
Sections verweist dann auf diesen Adressbereich und gibt dem ganzen einen Namen:
1 | .init: > FLASHD PAGE = 0 /* Intitialisierungen */ |
Mittels pragma weist man nun die Funktion den Speicherbereich in der betreffenden C Datei zu:
1 | #pragma CODE_SECTION(init_SCI, ".init")
|
2 | |
3 | |
4 | void init_SCI() |
5 | {
|
6 | }
|
Ein wenig kurz erklärt, aber vielleicht hilft es ein wenig.
Im Map-File wird die Speicheraufteilung entsprechend Deiner Projekt-Konfiguration (Linker-Command-File) aufgezeigt. Hier zeigt sich welcher Speicherbereich voll ist oder ob's noch Luecken gibt. Unter "Project" => "Build Options..." wählst Du den Reiter "Linker" aus. In der Category "Basic" findest Du den Eintrag "Map Filename (-m)". Hier kannst Du den Namen des Map-Files, das der Linker erstellen soll, festlegen (bei CCS 3.3). Gruss, Jan P.S.: Das Thema gab's schonmal: Beitrag "Zu wenig RAM bei Debuggen (TMS320F2808) - was tun?"
Danke für die Antworten! Ich habe den Code jetzt in den Flash geladen. Schnell auszuführende Code-Schnipsel habe ich zur Laufzeit in den RAM geladen. Nun passt wieder alles und es kann weiter gehen mit der Programm-entwicklung :) Danke!
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.