Forum: Compiler & IDEs globale variablen schützen


von noob (Gast)


Lesenswert?

Hallo Experten,
ich habe ein recht umfangreichen code für ein uC welches unter anderem 
ein globles array beinhaltet. Dieses globale array verändert plötzlich 
nach einer mir unverständlichen stelle den Inhalt. Habt Ihr erfahrung 
mit so etwas.

Hier ein beispiel

uint8t array[10];

func1()
{
  array[0] = 1;
  array[1] = 2;
  array[2] = 3;
  array[3] = 4;
  array[4] = 5;
  array[5] = 6;
  array[6] = 7;
  array[7] = 8;
  array[8] = 9;
  array[9] = 10;
}
func2()
{
 uint8t temp[20];

.....
sprintf(temp,"textmuster"); /*hier an dieser stelle sind auf einmal die 
Werte meines arrays verändert*/



}

von Floh (Gast)


Lesenswert?

was ist temp? Definition?

von noob (Gast)


Lesenswert?

uint8t temp[20];
also auch array typ unsigned char

von Floh (Gast)


Lesenswert?

ok, meine Vermutung war nicht richtig...
Zeig doch mal bitte den Code komplett her.

von Stefan E. (sternst)


Lesenswert?

Sehr wahrscheinlich versuchst du einfach nur mehr RAM zu nutzen, als du 
überhaupt hast. temp ist auf dem Stack, der vom Ende des Speichers her 
nach unten wächst, und vermutlich in deine Variablen "hineinwächst".

von noob (Gast)


Lesenswert?

Stefan Ernst schrieb:
> Sehr wahrscheinlich versuchst du einfach nur mehr RAM zu nutzen, als du
> überhaupt hast. temp ist auf dem Stack, der vom Ende des Speichers her
> nach unten wächst, und vermutlich in deine Variablen "hineinwächst".

wie kann man soetwas überprüfen

von noob (Gast)


Lesenswert?

und war es nicht so das globale variablen im flash abgelegt werden?

von noob (Gast)


Lesenswert?

den code darf ich leider nicht veröffentlichen. reicht das beispiel denn 
nicht?

von MWS (Gast)


Lesenswert?

noob schrieb:
> und war es nicht so das globale variablen im flash abgelegt werden?

Konstante = Flash, Variable = sRAM, Konstante <> Variable

von Sven P. (Gast)


Lesenswert?

MWS schrieb:
> noob schrieb:
>> und war es nicht so das globale variablen im flash abgelegt werden?
>
> Konstante = Flash, Variable = sRAM, Konstante <> Variable

Variable = SRAM. Konstante = FLASH und SRAM bei AVR/GCC ohne explizite 
Angaben. Dumm gelaufen.

Läuft dein Speicher über?

von noob (Gast)


Lesenswert?

Sven P. schrieb:
> Läuft dein Speicher über?

wie kann ich das prüfen?

von noob (Gast)


Lesenswert?

warum meckert den der Compiler  nicht über so etwas ich meine die 
variablen haben ja eine feste größe?
ich benutze für die IAR entwicklungsumgebung Controller stm32
kann man den zwingen das in flash zu packen wie PROGMEM bei avr?

von MWS (Gast)


Lesenswert?

Sven P. schrieb:
> Dumm gelaufen.

Meine Aussage;
> Variable = sRAM, Konstante <> Variable
passt auf das hier:

noob schrieb:
> globale variablen im flash

Da lief also gar nix dumm :D

Kannst aber jetzt gerne behaupten, daß bei Dir globale Variablen im 
Flash liegen...

von Sven P. (Gast)


Lesenswert?

Und meine Ergänzung dazu bezog sich darauf, dass Konstanten auch im SRAM 
landen können. Das macht(e) u.A. der GCC von Haus aus so.
Obwohl es Konstanten sind, werden sie ins SRAM geladen, vermutlich der 
Harvard-Architektur wegen.

von Rolf Magnus (Gast)


Lesenswert?

noob schrieb:
> und war es nicht so das globale variablen im flash abgelegt werden?

Ihr Initialisierungswert wird im Flash abgelegt, wenn der nicht 0 ist. 
Die Variable muß natürlich im RAM liegen, weil sie sonst nicht mehr 
beschrieben werden könnte.

noob schrieb:
> warum meckert den der Compiler  nicht über so etwas ich meine die
> variablen haben ja eine feste größe?

Der Stack hat keine feste Größe. Der wächst abhängig von 
Funktionsaufrufhierarchien, Interrupts und anderen Faktoren so weit, wie 
eben nötig. Seine Größe ist erst zur Laufzeit bekannt.

> ich benutze für die IAR entwicklungsumgebung Controller stm32

Ach, es geht gar nicht um gcc? Warum hast du es dann im gcc-Form 
gepostet?

> kann man den zwingen das in flash zu packen wie PROGMEM bei avr?

Du kannst nur Konstanten in den Flash legen, keine Variablen.

Sven P. schrieb:
> Und meine Ergänzung dazu bezog sich darauf, dass Konstanten auch im SRAM
> landen können. Das macht(e) u.A. der GCC von Haus aus so.

Nur auf Plattformen, wo das nicht anders geht.

> Obwohl es Konstanten sind, werden sie ins SRAM geladen, vermutlich der
> Harvard-Architektur wegen.

Beim AVR, ja. Das ist aber bei weitem nicht die einzige Architektur, für 
die es einen gcc gibt.

von MWS (Gast)


Lesenswert?

Sven P. schrieb:
> Und meine Ergänzung dazu bezog sich darauf, dass Konstanten auch im SRAM
> landen können. Das macht(e) u.A. der GCC von Haus aus so.

Das hab' ich schon verstanden. Nur, außer daß Du mir das jetzt gesagt 
hast, und ich es mir gemerkt habe, in was für einer Beziehung steht es 
zum Kontext des TO ?

Wenn ich mich jetzt nicht recht täusche, ist dies hier:
> uint8t array[10];
> func1()
> {
>   array[0] = 1;
>   array[1] = 2;
>   array[2] = 3;
>   array[3] = 4;
>   array[4] = 5;
>   array[5] = 6;
>   array[6] = 7;
>   array[7] = 8;
>   array[8] = 9;
>   array[9] = 10;
> }
kein Konstantenarray. Und genau um das ging es bei dieser Fragestellung, 
bzw. falschen Vermutung des TO.

von noob (Gast)


Lesenswert?

habe gerade herausgefunden das man mit "flash char string[10]" den 
string in den flash zwingen kann werde das mal ausprobieren.
danke erstmal

von Karl H. (kbuchegg)


Lesenswert?

Das löst aber höchst wahrscheinlich dein Problem nicht, sondern 
versteckt es nur. Und das ist immer eine schlechte Idee.

von Jax (Gast)


Lesenswert?

Da es um STM32 zu gehen scheint:

ARMV7M Reference Manual:
C1.8 The Data Watchpoint and Trace unit

Jax.

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.