Forum: Mikrocontroller und Digitale Elektronik MSP430 - Info-Speicher und Optimierung


von rangi jones (Gast)


Lesenswert?

Ich möchte den Informationsspeicher meines MSP340F2132 nutzen um 
Parameter dauerhaft zu seichern. Dazu benutze ich eine Struktur, mit der 
die einzelnen Werte leicht zugänglich sind. Mit einem #pragma wird diese 
Struktur an eine feste Adresse gelegt, hier Segment C - 0x1040. 
Unoptimiert funktioniert das prima.
Wenn ich die Optimierung auf "High" stelle werden die Lese-Zugriffe 
weg-optimiert. (IAR EW 4.x) Die Defaultwerte, welche der Struktur 
zugewiesen werden, werden gleich in den Quellcode eingebettet.
Welche Qualifier oder #pragmas muss ich verwenden damit korrekt auf den 
Inforamtionsspeicher zugegriffen wird?

Aktuell verwende ich folgenden Code:
1
typedef struct _EED_tstSegC_Data { ... u8 bParameterXYZ; ... } EED_tstSegC_Data
2
3
#pragma location = 0x1040
4
__root const EED_tstSegC_Data EED_stSegC_Data= { $Defaultwerte meiner Applikation$ }

Die Lesezugriffe erfolgen dann auf die Elemete der Struktur. Beispiel:
1
#define EED_bGET_ParameterXYZ()   EED_stSegC_Data.bParameterXYZ
Wie kann ich verhindern, dass die Code-Optimierung die Lese-Zugriffe 
weg-optimiert? Ich habe bereits einige varianten mit volatile und 
__no_init ohne erfolg ausprobiert


Vielen Dank

von Karl-heinz S. (cletus)


Lesenswert?

Das Information Memory ist eigentlich Read-Only.

Wenn du es neu beschreiben willst, musst du den kompletten Block 
löschen.

Kann es sein, dass der Compiler das erkennt?

von rangi jones (Gast)


Lesenswert?

Nochmal, es geht nicht nicht ums Schreiben - das mache ich in einer 
eigenen Funktion. Das funktioniert auch super.
Es geth ums lesen aus dem Info-Bereich. Die Daten werden mit 
Optimierung nicht mehr aus dem Info-Block entnommen. Die Werte stehen 
dann im Quellcode.
zb: "mov.b   #0x14,R12" dabei ist 0x14 mein Defaultwert, der eigentlich 
aus dem Info-Block entnommen werden sollte.
richtig waere "mov.b 0x1040,R12" - hier steht die 0x14 auf adresse 
0x1040

von Stefan (Gast)


Lesenswert?

Frag mich jetzt nicht warum... klingt komisch, ist aber so... keine 
Ahnung warum!

Das produziert Dein beschriebenes Verhalten:
[c]
#include <msp430x20x2.h>
//#include "global_vars.h"

#pragma location = 0x1040
__root const int  test = 0x1234;

void main(void)
{
  int value = test;
  P1OUT |= (value & 0x00AA);

  while(1);
}
[c]

von Stefan (Gast)


Lesenswert?

Ähh... nochmal:

Das produziert Dein beschriebenes Verhalten:
1
#include <msp430x20x2.h>
2
3
#pragma location = 0x1040
4
__root const int  test = 0x1234;
5
6
void main(void)
7
{
8
  int value = test;
9
  P1OUT |= (value & 0x00AA);
10
  
11
  while(1);
12
}


Während das hier (zumindest in IAR V3.42A) funktioniert:
1
<global_vars.h>:
2
extern const int  test;
3
4
5
<global_vars.c>:
6
#include "global_vars.h" 
7
8
#pragma location = 0x1040
9
__root const int  test = 0x1234;
10
11
12
<main.c>:
13
#include <msp430x20x2.h>
14
#include "global_vars.h"
15
16
void main(void)
17
{
18
  int value = test;
19
  P1OUT |= (value & 0x00AA);
20
  
21
  while(1);
22
}

von Stefan (Gast)


Lesenswert?

Hier noch das List-File, max. Optimierungsstufe "speed"

1. Fall:
1
     11            int value = test;
2
     12            P1OUT |= (value & 0x00AA);
3
   \   000000   F2D020002100 BIS.B   #0x20, &0x21


2. Fall:
1
      9            int value = test;
2
     10            P1OUT |= (value & 0x00AA);
3
   \   000000   5E42....     MOV.B   &test, R14
4
   \   000004   7EF0AA00     AND.B   #0xaa, R14
5
   \   000008   C2DE2100     BIS.B   R14, &0x21

von rangi jones (Gast)


Lesenswert?

schrei JAAAA, das Funktioniert !!!
vielen Dank.

und ich ich weiss auch warum. Man haette fast selber drauf kommen 
muessen.
Die einzelnen Module duerfen nichts vom Inhalt der Daten wissen. Sie 
muessen wissen wie die Struktur aussieht. Dazu muss das Ding mit extern 
rausgegeben werden. Dadurch dass der Inhalt aber in einem anderen c-File 
steht, kann der Compiler es nicht rausoptimieren sondern muss zugreifen. 
Das Optimieren erfolgt ja vor dem Linken.

Theoretisch sollte es im eigenen Modul optimiert werden. Da das aber 
nicht passiert, denke ich steckt da eine Logik im Compiler dahinter.

Da ich das nicht genau weiss, werde ich jetzt ein reines Daten-Modul 
anlegen, mit eigenem Header. Darin wird nicht zugegriffen.

vielen Dank nochmal.

von Johnny (Gast)


Lesenswert?

Also wenn Du "test" explizit als const deklarierst, dann würde ich es 
als Compiler auch gleich wegoptimieren ;-)
Deine ursprüngliche Variante würde evtl. auch funktionieren, wenn Du bei 
"test" noch volatile voranstellst, damit es nicht wegoptimiert wird.

von Stefan (Gast)


Lesenswert?

>Deine ursprüngliche Variante würde evtl. auch funktionieren, wenn Du bei
>"test" noch volatile voranstellst, damit es nicht wegoptimiert wird.

Das wäre eine logische Schlußfolgerung, die sogar im IAR-Compiler 
User-Guide als Beispiel vorgeschlagen wird. Jedoch funktioniert das in 
der Praxis nicht, da der Compiler die Kombination aus:

#pragma location = 0x1040,
volatile + const und
Wertzusweisung (test = 0x1234)
mit Fehlermeldung quittiert.

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.