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
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
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
Probier mal die Deklaration mit:
1 | const int Test __attribute__ ((section ("infomem"))) = 0; |
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.
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
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.
...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
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
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.