Forum: Mikrocontroller und Digitale Elektronik STM32F4-Discovery Keil startup code


von mikeR (Gast)


Lesenswert?

Hi,

ich habe gerade angefangen mich mit dem STM32F4-Discovery Board zu 
beschäftigen und nutze dafür Keil. Nun ist mir aufgefallen das Keil im 
Startup code nur eine Stack-Size von 0x00000400 also knapp 1k angibt und 
der Heap nur halb so groß ist.

Nun hat der Prozessor aber 192k Ram und irgendwie scheinen mir die oben 
genannten Settings komisch.

Frage habe ich was falsch gemacht habe den STM32F407VG gewählt weil es 
keinen STM32F407VGT6 gab aber vermute das T6 steht für das Package...


Oder hat jemand ein vernünftiges Sample für den Startupcode?

Danke schonmal,

lg mike

von Ersi (cell85)


Lesenswert?

Bootloader größe?

von mikeR (Gast)


Lesenswert?

Wie meinst du sind das nur STACK und HEAP für den Bootloader? ist das 
nicht fix im chip integriert?

lg mikeR

von Daniel F. (daywalker)


Lesenswert?

Hi,

ich arbeite beruflich mit Keil und 0x400 scheint die 
Standard-Stack-Größe zu sein im Startup-Code oder Scatter-File.

Da ich von Hand etwas optimieren muss, habe ich mir einen Teil des SRAMs 
aufgeräumt und gewisse statische/globale Variablen dort feste 
reingelegt.
Mit
1
U32 fastBuffer[128] __attribute((at(0x00200800))
 legst du das Array "fastBuffer" feste an die Speicherandresse 0x200800.

So kann man auch einen Teil des SRams nutzen. Wenn du einen 
Stackoverflow hast, solltest du ihn natürlich vergrößern.

Ich bring das Scatter-File zwar eher mit dem SDRam in Verbindung, aber 
du kannst vielleicht auch dort angeben, dass gewisse Routinen im SRam 
landen. Da würde ich natürlich nur etwas reinlegen, was fast immer und 
andauernd benötigt wird.

Schöne Grüße
Daniel

von mikeR (Gast)


Lesenswert?

Thx für die Erklärung,

Frage was passiert mit dem Restlichen code ich hab schon gesicht was/wo 
der Ausführbare code hingeladen wird müsste ja auch im RAM sein oder? 
Wie funktioniert das beim STM32F407VGT6 oder wird der direkt vom Flash 
ausgeführt?

lg

von Moritz M. (moritz_m35)


Angehängte Dateien:

Lesenswert?

Hallo,

ist das nicht in Words angegeben? Steht in meinem Startup-Code 
jedenfalls so drin (CoIDE). Also 4kB. Ich verwende immer 0x200 also 2kb.

Außerdem hab ich vor einiger Zeit ein kleines StdFramework zusammen 
gestellt.
Alle Konfigurationen können über eine Config-Header erldigt werden.

Moritz

von mikeR (Gast)


Lesenswert?

HI

danke das scheint wirklich hilfreich zu sein aber eine Frage hätte ich. 
Ich habe niergenst einen export von heap lables gesehen werden diese 
nicht benötigt? Brauch kein Teil der Libc diese?


lg

von Steel (Gast)


Lesenswert?

Man verwendet bei embedded Software normalerweise keinen Heap. Man 
verwendet kaum Stack. Der Code wird direkt aus dem Flash ausgeführt. Das 
sind alles so Sachen die uC Programmierung von PC Programmierung 
unterscheiden.

von mikeR (Gast)


Lesenswert?

Steel schrieb:
> Man verwendet bei embedded Software normalerweise keinen Heap. Man
> verwendet kaum Stack. Der Code wird direkt aus dem Flash ausgeführt. Das
> sind alles so Sachen die uC Programmierung von PC Programmierung
> unterscheiden.

An der verwendung von Stack kommst du nicht vorbei. (Funktions aufrufen 
dafür ist der ja da)

bei nem 168mhz  uc mit 192kb ram macht für mich der heap schon Sinn is 
ja kein Atmega8

lg

von Choose (Gast)


Lesenswert?

Beschäftige dich lieber mit Coocox ;-)

von Steel (Gast)


Lesenswert?

mikeR schrieb:
> An der verwendung von Stack kommst du nicht vorbei. (Funktions aufrufen
> dafür ist der ja da)

Darum schrieb ich KAUM.

von mikeR (Gast)


Lesenswert?

Choose schrieb:
> Beschäftige dich lieber mit Coocox ;-)

Jo klingt interessant habs mal runter geladen.


@ Steel du wirst KAUM ein Programm schreiben das keinen Stack benötigt 
generell ist das ein extrem wichtiges Element.

lg

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

mikeR schrieb:
> danke das scheint wirklich hilfreich zu sein aber eine Frage hätte ich.
> Ich habe niergenst einen export von heap lables gesehen werden diese
> nicht benötigt? Brauch kein Teil der Libc diese?

Stack: Die libc eher nicht, da der normalerweise verwendete Stackpointer 
bereits im Startup-Code gesetzt wird (erster Eintrag in der 
Vektortabelle).
Heap: Zur Konfiguration der dynamischen Speicherverwaltung gibt es in 
der libc (eigentlich sind es mehrere) von ARM zwei Ansätze, für 
"normale" libc und die sogen. microlib. Die Dokumentation sollte beide 
beschreiben (Suchbegriffe: __MICROLIB und __user_initial_stackheap). 
Beim letzten Mal schauen, waren auch beide Ansätze in den MDK-ARM 
Beispielen für STM32F4 implementiert. Im Forum bei keil.com wird man 
mehr potentielle Antworter finden.

von Matthias (Gast)


Lesenswert?

Die definierten Grössen fuer Stack und Heap sind relativ klein gewählte 
Defaults. Beide sollten für die eigene Applikation natürlich noch 
angepasst werden.
Der Stack ist natürlich notwendig. Allerdings wird in einem modernen 
Design die Reservierung und Verwaltung der/des Stack(s) einem 
RTOS-Kernel überlassen. Dann sind sogar die 1024 Byte noch viel zu 
grosszügig bemessen.

Heap ist auch auf einem schnelleren Mikrocontroller mit mehr Speicher 
nach Möglichkeit zu vermeiden. Nur weil man mehr Performance hat muss 
man die nicht durch dynamische Speicherverwaltung wieder zum Fenster 
rauswerfen.
Am schnellsten bleiben statisch reservierte Puffer und Variablen.

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.