Forum: Mikrocontroller und Digitale Elektronik MSP430 InfoSegment vorbelegen


von Gerd K. (struuve)


Lesenswert?

Hallo,

hat jemand eine Idee wie ich dem Compiler klar mache dass er einen 
Defaultwert im InfoSegmet A ablegt? Ich hab was von pragma und no_init 
gelesen aber nicht verstanden, kann mir geholfen werden? Ich verwende 
den IAR-Compiler und den MSP 149.

Gruß
Gerd

von Andi (Gast)


Lesenswert?

Hi!

Also ich mach das immer so:

Im Headerfile
#define     SEG_D         (0x1000)

Im C File
für nicht initialisierte Variable:
#pragma location = SEG_D            //Speicheradresse
__root
__no_init UINT8 test;               //Variable nicht initialisiert
                                    //Wird zur Laufzeit beschrieben

für initialisierte Variable (z.B. Default Wert)
#pragma location = SEG_D            //Speicheradresse
__root
const UINT8 default = 10;           //Variable mit Default Wert 
vorbelegt
                                    //als "const"

Zu dem Befehl __root:
Ensures that a function or variable is included in the object code even 
if unused --> Egal ob verwendet oder nicht, der Compiler legt die 
Variable an


Gruß Andi

von Gerd K. (struuve)


Lesenswert?

Hallo Andi,

funktioniert, danke!

Gruß
Gerd

von Andi (Gast)


Lesenswert?

Hi!

Da ich jetzt von IAR auf Eclipse + MSPGCC umsteige, da mir 4k der IAR zu 
wenig sind, krieg ich das mit den Segmenten nicht mehr hin.

Wie oben beschrieben funktioniert das jetzt nicht mehr, was ja nicht 
verwunderlich ist, da jetze ein anderer Compiler / Linker zum einsatz 
kommt. Kann mir jemand sagen wie das mit MSPGCC funktioniert?

Möchte mir auch hier wieder Segmente im InfoFlash namentlich einrichten, 
damit ich darauf zur Laufzeit wie auf normale Variablen zum -Lesen- 
namentlich zugreifen kann und wenn sich dann was ändert mittels Routine 
eben diese neu beschreibe.

Mir gehts also nicht darum wie ich das Flash beschreibe, sondern nur wie 
ich mir die Segmente definiere um dort z.b. eine Struktur oder einfache 
Variablen anlgege.

Eben so wie ich es oben im Post mit IAR beschrieben habe nur eben jetzt 
mit MSPGCC.

Danke!

Gruß Andi

von Christian R. (supachris)


Lesenswert?

Probier mal die Deklaration mit:
1
const int Test __attribute__ ((section ("infomem"))) = 0;

von Christian R. (supachris)


Lesenswert?

So klappts, hatte oben den . vor infomem vergessen

Folgender Code
1
#include <msp430x16x.h>
2
const int Test __attribute__ ((section (".infomem"))) = 0x23;
3
4
int main(void)
5
{
6
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
7
  P1DIR |= 0x01;                        // Set P1.0 to output direction
8
9
  while(1)
10
  {
11
    volatile unsigned int i;            // volatile to prevent optimization
12
13
    P1OUT ^= 0x01;                      // Toggle P1.0 using exclusive-OR
14
15
    i = 10000;                          // SW Delay
16
    do i--;
17
    while (i != 0);
18
  }
19
}

Wird in folgendes TI-TXT File übersetzt:

@4000
b2 40 80 5a 20 01 3f 40 6c 40 3e 40 00 11 3d 40
04 11 0d 9e 05 24 fe 4f 00 00 1e 53 0e 9d fb 2b
3f 40 04 11 3d 40 04 11 0d 9f 05 24 cf 43 00 00
1f 53 0f 9d fb 2b 30 40 40 40 30 40 3e 40 00 13
31 40 fe 38 04 41 b2 40 80 5a 20 01 d2 d3 22 00
d2 e3 21 00 b4 40 10 27 00 00 b4 53 00 00 fd 23
f7 3f 21 53 30 40 68 40 02 df fe 3f
@406c
00 00 00 00
@1000
23 00
@ffe0
3a 40 3a 40 3a 40 3a 40 3a 40 3a 40 3a 40 3a 40
3a 40 3a 40 3a 40 3a 40 3a 40 3a 40 3a 40 00 40
q

Wie man sieht, steht im InfoMem an 0x1000 die Variable.

von Andi (Gast)


Lesenswert?

Danke!

Das funktioniert soweit.

Hab mir zum testen mal eine Structur erstell:

const struct strTest{
  int value1;
  int value2;
  int value4;
}; <-- hier kommt allerdings eine Warnung:
useless keyword or type name in empty declaration


const struct strTest Test _attribute_ ((section(".infomem"))) = {1, 2, 
3};

Hab jetzt vergeblich nach der Definition von infomem gesucht. Da die 
neuen Derivate ja zum Teil 4 Sektoren (INFO SegA - SegD) im Flash haben. 
Irgendwie muss man das ja in die anderen Speicherbereiche auch "rein 
linken", bzw. selbst definieren können wo im infomem er das ablegt.
Bzw. die Bereiche einzeln vorbelegen können.

Kannst du mir da evtl auch noch behilflich sein?

Und wie ist das eigentlich mit nicht initialisierten Variablen, erstell 
ich mir im Flash eine einzelne Variable wie oben wird die automatisch 
mit 0 initialisiert. Das stört mich zwar jetzt erstmal nicht, wäre aber 
interessant zu wissen. Mit IAR musste man das __no_init voranstellen.

Danke!

Gruß Andi

von Christian R. (supachris)


Lesenswert?

1. Der GCC mag den Bezeichner Struktur gerne hintenan.

Deklaration ohne Warnung:
1
typedef struct 
2
{
3
  int test1;
4
  int test2;
5
}
6
TestStruct;

2. Die Info-Mem-Bereiche sind wie alle anderen Speicherbereiche in den 
Linker-Scripten definiert. Kannst du gerne auch selber ändern, die 
liegen unter:

C:\mspgcc\msp430\lib\ldscripts

Eine nichtinitialisierte Variable im Flash? Was soll das sein? Und wozu? 
Die wird doch beim Flashen des µC automatisch mit einem Wert 
beschrieben.

von Andi (Gast)


Lesenswert?

...da steht das alles. Ok, das krieg ich hin!

Nach "einwenig" probieren hab ich in der Zwischenzeit das gefunden...
Ich hab unter:
"Properties" -> C/C++ Build - Settings
--> Tool settings -> mspgcc GCC C Linker
hier unter: Other options (-Xlinker [option])
das eingetragen: msp430-gcc -Wl,--section-start -Wl,infomemB=0x1080

dann konnte ich das genauso ansprechen wie du oben geschrieben hast, nur 
ohne dem "." davor.

Allerdings gefällt mir deine Variante mit dem ändern des Files besser!

Hab hier jetzt gemäß dem "infomem beispiel" einfach noch infoSegA und 
infoSegB  in dem msp430x149.x File eingefügt.
Muss das in den anderen Files mit den Endungen .xbn .xn .xr und .xu auch 
erfolgen?

Das mit den nicht initialisierten Variablen kenne ich halt noch von der 
IAR Workbench. Den genauen Sinn habe ich bisher ehrlich gesagt nicht 
hinterfragt.

Danke!

Gruß Andi

von Andi (Gast)


Lesenswert?

Ergänzend zum vorherigen Beitrag ist mir noch was eingefallen, warum es 
sinn machen kann das Flash nicht mit 0 zu initialisieren.
Wenn z.B. die Daten erst währen der Laufzeit "entstehen" wird der 
Speicher bereich (mit IAR Workbench) mit "__no_init int value" definiert 
(#pragma Anweisung mal weggelassen).
Wenn jetzt in dem FlashSegment noch weitere Daten stehen müsste dieses 
nicht gelöscht werden um "value" mittels Routine im Flash abzulgen, da 
von 0xFF auf 0x00 geschrieben werden kann, nur eben anders rum nicht.

Ob das jetz allerdings sinn macht oder ob man das braucht lasse ich 
jetzt mal dahin gestellt.

Gruß Andi

von Christian R. (supachris)


Lesenswert?

Dann intialisiere doch mit 0xFF :)

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.