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*/ }
ok, meine Vermutung war nicht richtig... Zeig doch mal bitte den Code komplett her.
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".
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
den code darf ich leider nicht veröffentlichen. reicht das beispiel denn nicht?
noob schrieb: > und war es nicht so das globale variablen im flash abgelegt werden? Konstante = Flash, Variable = sRAM, Konstante <> Variable
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?
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?
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...
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.
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.
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.
habe gerade herausgefunden das man mit "flash char string[10]" den string in den flash zwingen kann werde das mal ausprobieren. danke erstmal
Das löst aber höchst wahrscheinlich dein Problem nicht, sondern versteckt es nur. Und das ist immer eine schlechte Idee.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.