Forum: Mikrocontroller und Digitale Elektronik CoOS Stack Berechnung


von Mutex (Gast)


Lesenswert?

Hallo zusammen,

ich hab eine Frage zur Berechnung des benötigten Stacks in CoOS. 
(http://www.coocox.org/CoOS.htm)

Im CooCox CoOS User's Guide (Revision 1.1, 
http://www.coocox.org/downloadfile/CoOS/PDF/CooCox_CoOS_User_Guide.pdf) 
wird leider kaum auf die Berechnung der Stackgröße eingegangen.

Im Beispiel (Seite 5, User`s Guide) steht:
1
OS_STK taskA_stk[128]; /*!< define "taskA" task stack */
2
OS_STK taskB_stk[128]; /*!< define "taskB" task stack */
3
OS_STK led_stk [128]; /*!< define "led" task stack */
4
5
//Zur Info:
6
//typedef unsigned int       OS_STK;

Auf der Seite 13 im User´s Guide steht lediglich, dass
alle 16 CPU-Register (32-bit breit, entspricht 4Byte * 16 = 64 Byte = 2 
unsigned int) gesichert werden und und 4 Bytes (unsigned long) für die 
Erkennung eines StackOverflow sind.
Da sind also, nach meiner Rechnung, lediglich 3 Elemente eines jeden 
Arrays von oben belegt.

Habe ich einen Denkfehler und wozu wird der Stack so groß angegeben?
Wo werden lokale Variablen abgelegt?

Danke fürs erleuchten ;-)

von Artjomka (Gast)


Lesenswert?

Lokale Variablen werden in genau diesem Stack abgelegt.

Also kommt es drauf an wie viel Stack-Speicher sich dein Thread maximal 
genehmigt.

Das ermitteln der Stack-Groesse erfolgt durch ausprobieren.


Ist ziemlich doof, wenn du z.B. mehrere Threads hast, die alle z.B. eine 
Funktion aufrufen die sehr viel Stack-Speicher braucht.
Dann bietet es sich an diese eine Funktion (oder Funktions-Bibliothek) 
als gesonderten Thread laufen zu lassen. Als Beispiel waere da die FatFS 
library.

von Mutex (Gast)


Lesenswert?

Danke für deine Antwort.
Wie aber "weiß" der Context Wechsel welche und vor allem wieviele 
lokalen Variablen zusätzlich gesichert werden sollen? (Für den Fall das 
die Variablen nicht in einem der CPU-Register stehen?)

Da dies von "keine" bis "viele" Variablen sein kann, muss doch dabei ein 
System bzw. Mechanismus dahinter stecken um dies möglichst effizient zu 
lösen?

Ständig zu viel zu speichern macht den Taskwechsel doch nur unnötig 
lang.

Oder wird pauschal einfach ein Teil des RAMs komplett gesichert?

Danke fürs lesen.

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.