mikrocontroller.net

Forum: Compiler & IDEs globale variablen schützen


Autor: noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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*/



}

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was ist temp? Definition?

Autor: noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8t temp[20];
also auch array typ unsigned char

Autor: Floh (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: noob (Gast)
Datum:

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

Autor: noob (Gast)
Datum:

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

Autor: MWS (Gast)
Datum:

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

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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. schrieb:
> Läuft dein Speicher über?

wie kann ich das prüfen?

Autor: noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: noob (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Jax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da es um STM32 zu gehen scheint:

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

Jax.

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.