Forum: Mikrocontroller und Digitale Elektronik MSP430 Linker Error Segment CSTACK is too long


von Leon (Gast)


Lesenswert?

Guten Abend,

ich habe ein Problem mit der Stackgröße des msp430 Mikrocontrollers.
Wenn ich die entsprechenden Variablen/Arrays mit __persitent festlege 
erscheint diese Meldung nicht mehr. Gibt es womöglich eine andere 
Lösung?
Kann man die Stackgröße verändern bzw. welche Möglichekiten gäbe es noch 
die Variablen/Arrays anderweitig zu deklarieren?

von Master-Jimmy (Gast)


Lesenswert?

Falls du TI-CCS benutzt:
1
Project -> Properties -> Build -> MSP430 Linker -> Basic Options -> Set C system stack size
Bzw. kannst du die entsprechende Option des Linkers nutzen:
1
--stack_size

von Leon (Gast)


Lesenswert?

Ok Danke!

Was den Speicher betrifft, wie könnte man eine Struktur in ein 
bestimmten Datensegment ablegen? Ich weiß es gibt da wa smit #pragma 
DATA_SEGMENT allerdings weiß ich nicht genau wie sowas im Linkerskript 
definiert und verwendet werden kann.

von Gerald K. (geku)


Lesenswert?

Für welchen Typ des MSP430 wurde der Compiler eingerichtet?
Z.B. verfügt der MSP430G2553 über maximal 512 Byte RAM. Diesen Speicher 
muss sich das Stack mit allen anderen statischen Variablen teilen.

Die Größe des Stacks wird durch die Verschachtelungstiefe (PC, zu 
sichernde Register und lokale Variable) bestimmt.

: Bearbeitet durch User
von Leon (Gast)


Lesenswert?

Wir benutzen den MSP430FR5949 mit 64KB FRAM und 2KB SRAM.
Im MAP File steht am Ende wieviel Speicher benutzt wird:
1
 25 628 bytes of CODE  memory (+             38 254 range fill )
2
  1 997 bytes of DATA  memory (+ 40 absolute )
3
    614 bytes of CONST memory

von Thomas Z. (usbman)


Lesenswert?

Leon schrieb:
> 1 997 bytes of DATA  memory (+ 40 absolute )
zu viel bei 2KByte SRAM. Hast du Funktionen mit großen Arrays oder 
structs lokal? Falls ja prüf mal ob da da was global machen kannst und 
den Speicher mehrfach zu benutzen (ev mit einer union).

Schau dir die lokalen strings genauer an.

: Bearbeitet durch User
von Leon (Gast)


Lesenswert?

Ich habe nun mal die Struktur und auch den Puffer in den CODE Bereich 
verschoben. Allerdings sehe ich da nicht, dass der Wert DATA memory im 
linkerscript kleiner wird. Müsste doch eigentlich dann kleiner werden 
oder?

1
#pragma constseg = CONSTDATA
2
__persistent struct data_t data;
3
__persistent char buffer[100];
4
#pragma constseg = default
1
#pragma dataseg = DATASEGDATA
2
__no_init struct data_t data;
3
__no_init char buffer[200];
4
#pragma dataseg = default

von Michael F. (Firma: IAR Systems) (michael_iar)


Lesenswert?

Hallo

Leon schrieb:
> Guten Abend,
>
> ich habe ein Problem mit der Stackgröße des msp430 Mikrocontrollers.
> Wenn ich die entsprechenden Variablen/Arrays mit __persitent festlege
> erscheint diese Meldung nicht mehr. Gibt es womöglich eine andere
> Lösung?
Im "C/C++ Compiler User Guide" gibt es eine Erklärung für 
"__persistent". Macht es bei den von Dir verwendeten Variablen / Arrays 
Sinn, diese entsprechend zu kennzeichnen?


Leon schrieb:
> Kann man die Stackgröße verändern bzw. welche Möglichekiten gäbe es noch
> die Variablen/Arrays anderweitig zu deklarieren?
Im Linker Configuration File (*.xcl) sollte es so was in der Art geben:
1
 -Z(DATA)CSTACK+_STACK_SIZE#
Darüber kannst Du die Größe des Stacks festlegen.

Leon schrieb:
> Ich habe nun mal die Struktur und auch den Puffer in den CODE Bereich
> verschoben. Allerdings sehe ich da nicht, dass der Wert DATA memory im
> linkerscript kleiner wird. Müsste doch eigentlich dann kleiner werden
> oder?
Die Auswirkungen der Änderungen sollten im MAP File sichtbar sein. Für 
das Linker Configuration File bist Du selbst verantwortlich.

Sind die Struktur und der Puffer "const"? Falls nicht, dann macht es 
wenig Sinn, diese in den CODE Bereich zu verschieben. Ist die 
Verschiebung an den Adressen der Struktur, bzw. des Puffers im MAP File 
erkennbar?

Wie sind denn die entsprechenden Segmente aus Deinen Code-Schnipseln im 
Linker Configuration File definiert?

Gruß,
Michael

von Leon (Gast)


Lesenswert?

Hi, die Stacksize ist 300. Diesen Wert wird von IAR Embedded Workbench 
übernommen.

Linkerskript:
1
-P(CODE)CODE,SEGDATA,CHECKSUM=4400-FF7F,10000-13FFF

Verwendung im Code:
1
#pragma dataseg = SEGDATA
2
__no_init struct data_t data;
3
__no_init char buffer[200];
4
#pragma dataseg = default


MAP-File:
1
 SEGMENTS IN THE MODULE
2
  ======================
3
SEGDATA
4
  Relative segment, address: 764A - 771D (0xd4 bytes), align: 1
5
  Segment part 28.            Intra module refs:   test_function                                                   
6
           ENTRY                   ADDRESS         REF BY
7
           =====                   =======         ======
8
           data                    764A 
9
    -------------------------------------------------------------------------
10
SEGDATA
11
  Relative segment, address: 771E - 7781 (0x64 bytes), align: 0
12
  Segment part 29.            Intra module refs:   test_function
13
           ENTRY                   ADDRESS         REF BY
14
           =====                   =======         ======
15
           buffer                  771E 
16
    -------------------------------------------------------------------------

von Michael F. (Firma: IAR Systems) (michael_iar)


Lesenswert?

Hallo,

hier ein rudimentäres Beispiel mit der IAR Embedded Workbench für MSP430 
v7.21.1:

Das Linker Configuration File basiert auf dem Default für den 
MSP430FR5949 mit der folgenden Änderung
1
-P(CODE)CODE,SEGDATA=4400-FF7F,10000-13FF7

Source-Code:
1
#include "io430.h"
2
3
#pragma dataseg = SEGDATA
4
__no_init char buffer[100];
5
#pragma dataseg = default
6
7
int main( void )
8
{
9
   volatile char foo;
10
   int i;
11
12
   for (i = 0; i<100; i++)
13
   {
14
      foo = buffer[i];
15
   }
16
   
17
   return 0;
18
}

Ergebnis:
1
SEGDATA
2
  Relative segment, address: 440C - 446F (0x64 bytes), align: 0
3
  Segment part 2.             Intra module refs:   main
4
           ENTRY                   ADDRESS         REF BY
5
           =====                   =======         ======
6
           buffer                  440C
1
 170 bytes of CODE memory
2
 160 bytes of DATA memory
Die 160 Byte DATA sind für den CSTACK reserviert.

Wenn ich die beiden #pragma Direktiven auskommentiere, dann erhalten 
ich:
1
DATA16_N
2
  Relative segment, address: 1C00 - 1C63 (0x64 bytes), align: 0
3
  Segment part 2.             Intra module refs:   main
4
           ENTRY                   ADDRESS         REF BY
5
           =====                   =======         ======
6
           buffer                  1C00
1
  70 bytes of CODE memory
2
 260 bytes of DATA memory

Somit ist der erwartete Unterschied der Platzierung am 
Speicherverbrauch, bzw. im MAP File sichtbar.

Gruß,
Michael

von dummschwaetzer (Gast)


Lesenswert?

dein MSP ist mit FRAM.
Der ältere IAR hatte noch die Möglichkeit Variablenadressen mit @ zu 
definieren.
Du könntest also mal testweise einige deiner Variablen mi @ in den FRAM 
legen.

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.