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?
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 |
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.
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
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 |
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
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
|
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
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 | -------------------------------------------------------------------------
|
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.