PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] STM32F407, CooCox und große Char-Arrays machen Probleme.



erik_wolfram
14.12.2015, 15:35
Hallo,

ich komme gut voran mich mit dem STM anzufreunden. Ich habe schon einiges zum Laufen bekommen und wollte "nur mal eben" einen Buffer für die Datenübergabe vergrößern und bin auf ein Fehlverhalten gestoßen. Die Daten werden falsch, oder garnicht übertragen, bzw. der Controller verhält sich komplett seltsam.
Zur Vereinfachung habe ich das Programm auf USART abgespeckt und einen char-Array mit einem Text initialisiert. Diesen gebe ich dann per USART an den PC aus. Bis ca. 1950 Elemente klappt das ganze, danach nicht mehr´... mit Optimierung erhöht sich das ganze minimal.
Der STM32F407 hat 192 kByte RAM und 1MB Flash - ich kann mir schwer vorstellen, dass ich dort an Grenzen stoße ?!

char RxBuffer[1950] = "Hallo Welt! Die ....
for( i = 0; i < 1950; i++ )
usart_sendChar(RxBuffer[i]);


Beim Complieren mit CooCox erhalte ich die folgenden Werte:

text 4216
data 16
bss 2048
6280 dec
hex 1888

Kann mir bitte mal jemand einen kleinen Denkanstoß geben wo der Fehler liegt oder worauf ich achten muss?
In der jetztigen Anwendung benötige ich zwei char-Buffer bis zu 8192 Bytes (chars) - deshalb gibt es für mich keine Möglichkeit das zu umgehen.

Gruß Erik


[EDIT] Wenn ich den Array außerhalb der Funktion definiere funktioniert es! Thema kann gelöscht werden?!

Mxt
14.12.2015, 20:35
[EDIT] Wenn ich den Array außerhalb der Funktion definiere funktioniert es! Thema kann gelöscht werden?!

Na, immerhin hast Du auf diese Weise, wenn auch ohne es zu ahnen, gelernt was ein stack overflow ist. :p


====
Der RAM ist in verschiedene Bereiche eingeteilt, u.a. für globale Variablen, den Stack und den Heap. Wenn das Array außerhalb der Funktion liegt, ist es bei den globalen Variablen gespeichert. Parameter und lokale Variablen von Funktionen landen dagegen auf dem Stack. Der hat in den Compilereinstellungen eine feste Größe. Mit dem großen Array läuft er wahrscheinlich über, dann benimmt sich das Programm so eigenartig.

Unregistriert
05.05.2016, 09:34
wo ist denn die Grenze innerhalb einer Funktion?
Und wie könnte man das Problem umgehen?
Wenn ich also das array global definiere würde es gehen? ODer muss der Aufruf auch außerhalb der Funktion sein!?

erik_wolfram
05.05.2016, 11:49
Ich denke, dass ist abhängig von der verwendeten Programmier-Umgebung.

Umgehen: Global definieren, auch wenn man die Variable/Array nur in einer Funktion nutzt - also der Aufruf innerhalb der Funktion ist kein Problem!

Gruß Erik