Problem mit Speicherplatz bei TI Controller

Gast #3343359
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.
Gast #3343366
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.
Gast #3343379
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
Gast #3343390
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
Gast #3343393
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?
Gast #3343514
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.
Gast #3343582
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.
#3343590
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?
#3343623
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.
#3343827
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.
Gast #3358806
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren