www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik MSP430 InfoSegment vorbelegen

Autor: Gerd K. (struuve)
Datum: 09.04.2008 21:01

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
Autor: Andi (Gast)
Datum: 15.04.2008 08:40

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
Autor: Gerd K. (struuve)
Datum: 15.04.2008 19:49

Hallo Andi,

funktioniert, danke!

Gruß
Gerd
Autor: Andi (Gast)
Datum: 19.04.2008 13:01

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
Autor: Christian R. (supachris)
Datum: 19.04.2008 15:35

Probier mal die Deklaration mit:
const int Test __attribute__ ((section ("infomem"))) = 0;
Autor: Christian R. (supachris)
Datum: 19.04.2008 16:14

So klappts, hatte oben den . vor infomem vergessen

Folgender Code
#include <msp430x16x.h>
const int Test __attribute__ ((section (".infomem"))) = 0x23;

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
  P1DIR |= 0x01;                        // Set P1.0 to output direction

  while(1)
  {
    volatile unsigned int i;            // volatile to prevent optimization

    P1OUT ^= 0x01;                      // Toggle P1.0 using exclusive-OR

    i = 10000;                          // SW Delay
    do i--;
    while (i != 0);
  }
}

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.
Autor: Andi (Gast)
Datum: 19.04.2008 18:00

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
Autor: Christian R. (supachris)
Datum: 19.04.2008 18:12

1. Der GCC mag den Bezeichner Struktur gerne hintenan.

Deklaration ohne Warnung:
typedef struct 
{
  int test1;
  int test2;
}
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.
Autor: Andi (Gast)
Datum: 19.04.2008 19:29

...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
Autor: Andi (Gast)
Datum: 19.04.2008 19:43

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
Autor: Christian R. (supachris)
Datum: 19.04.2008 21:32

Dann intialisiere doch mit 0xFF :)

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net