Forum: Mikrocontroller und Digitale Elektronik Problem mit Speicherplatz bei TI Controller


von Max (Gast)


Lesenswert?

Hi,

ich habe in meinem Code eine Sinus Tabelle gespeichert als:
1
int array[4000] = { 4000 Werte };

Sobald ich aber eine Tabelle mit mehr als ca. 4000 Werten erzeugen und 
abspeichern möchte, bekomme ich folgende Fehlermeldung im Code Composer 
Studio (Controller ist der TMS320F28335):


errors encountered during linking; "Example_2833xEPwmUpAQ.out" not 
Example_2833xEPwmUpAQ       C/C++ Problem

program will not
program will not
Resource 28335_RAM_Ink.cmd


und es wird in der .cmd Datei auf die beiden Zeilen verwiesen:
1
   .cinit           : > RAML0,     PAGE = 0
2
   .ebss            : > RAML4,     PAGE = 1

Gibt es eventuell eine Lösung für das Problem? Ich würde meine 
Sinustabelle gerne vergrößern.

von Uwe Bonnes (Gast)


Lesenswert?

Soll die Tabelle in Flash oder ins RAM? Gibt es überhaupt 16 kiByte RAM 
auf dem Chip? "const int ..." sollte für den Kompiler langen, um die 
Daten ins Flash zu legen. Sie müssen dann aber bei der Kompilierung 
bekannt sein.

von Max (Gast)


Lesenswert?

Also die Daten sind bereits vorher bekannt und ändern sich nicht. Wo sie 
liegen, spielt für mich denke ich keine Rolle.

Danke für den Tipp erstmal. Mit const int verweist der Compiler auf die 
Zeile
1
   .econst          : > RAML5,     PAGE = 1

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Max schrieb:
> errors encountered during linking; "Example_2833xEPwmUpAQ.out" not
> Example_2833xEPwmUpAQ       C/C++ Problem
>
> program will not
> program will not
> Resource 28335_RAM_Ink.cmd

Das soll die Fehlermeldung sein?

Irgendwie ... verstümmelt.

von Klaus (Gast)


Lesenswert?

Max schrieb:
> ich habe in meinem Code eine Sinus Tabelle gespeichert als:
> int array[4000] = { 4000 Werte };

Da sich der Sinus nach 90° (zwar gespiegelt und invertiert) wiederholt, 
hat die Tabelle ein Auflösung von 0,0225°. Und jetzt solls noch genauer 
werden?

MfG Klaus

von Max (Gast)


Lesenswert?

In einem anderen Fenster habe ich noch die komplette Fehlermeldung 
gefunden:

"C:/DSP2833x_common/cmd/28335_RAM_lnk.cmd", line 130:
error: program will not fit into available memory.  placement with 
alignment/blocking fails for section ".econst" size 0x1488 page 1. 
Available memory ranges:
   RAML5        size: 0x1000       unused: 0x1000       max hole: 0x1000
   .econst          : > RAML5,     PAGE = 1

Ist an anderer Stelle noch mehr Platz?

von John-eric K. (mockup)


Lesenswert?

Könnte es sein, das du die Freie Version mit 4KB 
Programmspeicherbegrenzung benutzt? Die 0x1000 Hex (4096) deuten darauf 
hin.

Ich kenne jetzt nur Code Composer Studio für MSP430 und der hat so etwas 
eingebaut.

: Bearbeitet durch User
von Micha (Gast)


Lesenswert?

Zeig mal dein ganzes linker command file (28335_RAM_Ink.cmd).

von Max (Gast)


Lesenswert?

>Könnte es sein, das du die Freie Version mit 4KB
>Programmspeicherbegrenzung benutzt? Die 0x1000 Hex (4096) deuten darauf
>hin.

Ja! Da hatte ich gar nicht mehr dran gedacht.

Vielen Dank für alle Antworten.

von Micha (Gast)


Lesenswert?

Max schrieb:
>>Könnte es sein, das du die Freie Version mit 4KB
>>Programmspeicherbegrenzung benutzt? Die 0x1000 Hex (4096) deuten darauf
>>hin.
Nach einer ganz kurzen Recherche würde ich sagen, dass das Limit aktuell 
bei 16kB (MSP430) liegt und für C28xx gar nicht existiert, sofern ein 
XDS100 verwendet wird. Ich denke also nicht, dass das Problem ist.

von Karl H. (kbuchegg)


Lesenswert?

Klaus schrieb:
> Max schrieb:
>> ich habe in meinem Code eine Sinus Tabelle gespeichert als:
>> int array[4000] = { 4000 Werte };
>
> Da sich der Sinus nach 90° (zwar gespiegelt und invertiert) wiederholt,
> hat die Tabelle ein Auflösung von 0,0225°. Und jetzt solls noch genauer
> werden?

Da man an dieser Stelle dann schon bei einer Auflösung ist, in der man 
die Zwischenwerte zwischen den Stützstellen in extremst guter Näherung 
als Gerade ansehen kann, könnte man zb eine Auflösung von 8000 Werten 
erreichen, indem man einfach den Mittelwert zwischen benachbarten 
Stützstellen auch noch mit dazu nimmt und zur Laufzeit bei Bedarf 
errechnet.

Ausserdem: muss das wirklich ein int sein?
Kannst du mit einer Auflösung der Ampiltude eines Sinus in 65535 (+- 
32767) tatsächlich irgendwas sinnvolles anfangen?

: Bearbeitet durch User
von Uwe Bonnes (Gast)


Lesenswert?

Micha schrieb:
> Nach einer ganz kurzen Recherche würde ich sagen, dass das Limit aktuell
> bei 16kB (MSP430) liegt und für C28xx gar nicht existiert

int xxx[4096] braucht aber 16 kiByte...

von Steffen R. (steffen_rose)


Lesenswert?

Micha schrieb:
> Zeig mal dein ganzes linker command file (28335_RAM_Ink.cmd).

Dieses Linkerfile ist für die Entwicklung im RAM und für die Benutzung 
vieler Breakpoints.

Sprich ALLE Sectionen befinden sich im RAM.

Ich vermute, dass ein Eval Board benutzt wird. Damit ist auch keine 
Größenbeschränkung aktiv.

Die Änderung auf 'const' ist gut. Nun muss noch das passende Linkerfile 
genommen werden (vermutlich 28335.cmd oder so, ohne RAM) und das 
Programm muß geflashed werden.

Eventuell mal bei den Beispielen schauen. Manchmal ist die Debug 
Variante für's RAM und die Release Variante für's Flash.

von Johnny B. (johnnyb)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Kannst du mit einer Auflösung der Ampiltude eines Sinus in 65535 (+-
> 32767) tatsächlich irgendwas sinnvolles anfangen?

Dem kann ich nur beipflichten, für die meisten Anwendungen reicht ein 
Bruchteil davon mit Abstand aus.
Wir hatten mal was zum Thema "Phasenkorrelation" entwickelt und da 
reichte schon eine Tabelle mit acht Werten um den Sinus in genügender 
Auflösung bereitzustellen.

Daher, verrate uns doch mal die konkrete Anwendung um eine passende 
Lösung zu finden.

Als Alternative kannst Du den Sinus natürlich auch errechnen lassen, das 
spart Speicher, braucht aber mehr Zeit. Kommt halt ebenfalls auf Deine 
Anwendung an, ob das sinnvoll ist oder nicht.

von Micha (Gast)


Lesenswert?

Uwe Bonnes schrieb:
> Micha schrieb:
>> Nach einer ganz kurzen Recherche würde ich sagen, dass das Limit aktuell
>> bei 16kB (MSP430) liegt und für C28xx gar nicht existiert
>
> int xxx[4096] braucht aber 16 kiByte...

Entscheidend ist der Satzteil nach dem "und", da der Kollege für diesen 
Core entwickelt. Aber das nur der Vollständigkeit halber...

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.