C stack speicher

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
serc
Beiträge: 3
Registriert: So Okt 22, 2017 2:12 pm

C stack speicher

Beitrag von serc » Mo Okt 23, 2017 11:15 am

Guten Tag,
ich bin erst seit einigen Wochen dabei C zu programmieren (Studium) und habe jetzt eine Aufgabe bekommen, wo cih irgndwie auf dem schlauch stehe. Die Aufgabe besteht darin, den Stack speicher mit Werten zu füllen um zu gucken wie viel Speicher noch frei wäre. Dazu soll ich zwei FUnktionen schreiben:
1. stack_max(), welcher ausgibt, wie viel speicher maximal belegt ist. Das bedeutet mang eht von einem __stack_start__[](vom Prof vorgegeben) los und guckt wo das erste und letzte Speicherzelle mit den gefüllten Werten ist, um zu wissen wie viele Zellen frei wären.
2. stack-fill() routine, mit der der Speicher ab der aktuellen freien SPeicherposition gefüllt ist.

eine kleine Schleife zum füllen der Zellen habe ich bereits geschrieben, welche auch funktioniert. Jedoch ist jetzt die Frage, wie ich mit einem Vergleich zählen kann, wie viele damit belegt wurden. Bin halt noch ein noob^^^.
Ich hoffe, das meine Fragestellung in Ordnung ist

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8469
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C stack speicher

Beitrag von Xin » Mo Okt 23, 2017 12:15 pm

Moin Moin,
serc hat geschrieben:ich bin erst seit einigen Wochen dabei C zu programmieren (Studium) und habe jetzt eine Aufgabe bekommen, wo cih irgndwie auf dem schlauch stehe. Die Aufgabe besteht darin, den Stack speicher mit Werten zu füllen um zu gucken wie viel Speicher noch frei wäre.
Das ist mal ein interessanter Plan, um das rauszufinden... ^^

Und ich habe vollstes Verständnis dafür, dass Du da auf dem Schlauch stehst, denn für mich klingt das erstmal total Meschugge. :D
Gehen wir also davon aus, dass wir uns in einem Universum befinden, dass sich der Prof ausgedacht hat.
serc hat geschrieben:Dazu soll ich zwei FUnktionen schreiben:
1. stack_max(), welcher ausgibt, wie viel speicher maximal belegt ist. Das bedeutet mang eht von einem __stack_start__[](vom Prof vorgegeben) los und guckt wo das erste und letzte Speicherzelle mit den gefüllten Werten ist, um zu wissen wie viele Zellen frei wären.
2. stack-fill() routine, mit der der Speicher ab der aktuellen freien SPeicherposition gefüllt ist.
Zu erstens: Kann es sein, dass die Aufgabe lautet, herauszufinden, wieviel Stackspeicher zur Zeit benutzt wird und nicht, wieviel Speicher noch frei ist?
Wenn der Stack eine feste Maximalgröße hat, könnte man den benutzen Speicher davon abziehen. Wächst der Speicher bis zu dem Moment, wo er andere Daten überschreibt, stürzt das Programm irgendwann ab. Das ist suboptimal um herauszufinden, wieviel Speicher man hat.
serc hat geschrieben:eine kleine Schleife zum füllen der Zellen habe ich bereits geschrieben, welche auch funktioniert. Jedoch ist jetzt die Frage, wie ich mit einem Vergleich zählen kann, wie viele damit belegt wurden. Bin halt noch ein noob^^^.
Ich hoffe, das meine Fragestellung in Ordnung ist
Du weist zumindest, wo der Stack startet und wo er endet. Die zwei Adressen bilden die aktuelle Größe vom Stack.

Wie gesagt: Ich bin mir nicht sicher, ob Du die Aufgabenstellung korrekt wiedergegeben hast, denn sie ergibt so für mich keinen Sinn. Also gehe ich davon aus, dass Du die Größe vom Stack ausgeben musst, was Du ganz einfach mit der Differenz von Start und Endadresse machen kannst und anschließend Daten in den Stack schreiben sollst, um erneut die Stackgröße zu ermitteln?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mfro
Beiträge: 303
Registriert: Mi Jan 16, 2013 4:58 pm

Re: C stack speicher

Beitrag von mfro » Mo Okt 23, 2017 12:30 pm

Ich würde davon ausgehen, dass nicht der Prozessorstack (damit dürften selbst viele C-Profis überfordert sein), sondern ein eigenes, selbstkreirtes Stack-Objekt gemeint ist. Im einfachsten Fall ein Array (=Stack) und ein Index (=Stackpointer).

Ein push() wäre dann z.B. sowas:

Code: Alles auswählen

const int STACKSIZE = 100;
typedef int stack_element;
static stack_element stack[STACKSIZE];
static size_t stackpointer = STACKSIZE;

void push(stack_element el)
{
    stack[--stackpointer] = el;
}
Dann lässt sich die Belegung des Stacks leicht mit STACKSIZE - stackpointer ausrechnen.

Dann solltest Du deinem Prof noch ausrichten, dass Bezeichner mit führenden Unterstrichen (__stack_start...) im C-Standard für die Compiler-Implementierung reserviert sind, er also 1. besser seine Finger davon lassen und 2. seinen Studenten keinen solchen Mist beibringen sollte...
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8469
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C stack speicher

Beitrag von Xin » Mo Okt 23, 2017 1:56 pm

mfro hat geschrieben:Dann solltest Du deinem Prof noch ausrichten, dass Bezeichner mit führenden Unterstrichen (__stack_start...) im C-Standard für die Compiler-Implementierung reserviert sind, er also 1. besser seine Finger davon lassen und 2. seinen Studenten keinen solchen Mist beibringen sollte...
Das mit dem Ausrichten würde ich lassen, aber mir trotzdem merken, was mfro schrieb... Vielleicht mal freundlich nachfragen, dass Du da mal was mit Unterstrichen vor dem Namen gelesen hast... ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

serc
Beiträge: 3
Registriert: So Okt 22, 2017 2:12 pm

Re: C stack speicher

Beitrag von serc » Mo Okt 23, 2017 1:59 pm

ja stimmt @Xin, wie viel Stackspeicher benutzt wird. Sorry :D
Weil das ganze Neuland für mich ist und ich auch mit den Pointern sehr unerfahren bin, wie bekomme
ich denn eine "Zahl" vom __stack_start und __stack_end, für die Differenz rechnung heraus :D?

Und wie kann ich werte mit dem Inhalt denn Vergleichen? Geht da eine einfache int Zahl?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8469
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C stack speicher

Beitrag von Xin » Mo Okt 23, 2017 2:53 pm

serc hat geschrieben:ja stimmt @Xin, wie viel Stackspeicher benutzt wird. Sorry :D
Weil das ganze Neuland für mich ist und ich auch mit den Pointern sehr unerfahren bin, wie bekomme
ich denn eine "Zahl" vom __stack_start und __stack_end, für die Differenz rechnung heraus :D?

Und wie kann ich werte mit dem Inhalt denn Vergleichen? Geht da eine einfache int Zahl?
Beides sind Pointer. Pointer sind im Prinzip nichts anderes als Int-Zahlen. Die Differenz zweier Pointer ist vom Datentyp size_t, welches - je nach Maschine - so groß ist wie ein unsigned int (16/32 Bit) oder so groß wie ein long long int (64 Bit).

Das müsste so laufen:

Code: Alles auswählen

int stack[10];
int * begin = &stack[9];   // Stack beginnt am letzten Element -> größte Adresse
int * current = &stack[4]; // aktuell liegt vor dem Ende.

size_t elements = begin-current;   // große Adresse - kleine, da bleibt was über, Datentyp ist int
size_t memusage = elemente * sizeof( int );
printf( "Elemente: %zd\n", elements );
printf( "Speicherverbrauch: %zd\n", memusage );
Je nach Compiler musst Du %z statt %zd schreiben.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

serc
Beiträge: 3
Registriert: So Okt 22, 2017 2:12 pm

Re: C stack speicher

Beitrag von serc » Mo Okt 23, 2017 5:27 pm

Okay also ich habe mal etwas versucht und meinst du das wäre so richtig?

Code: Alles auswählen

extern uint32_t __stack_start__[];   //Definiert in link.ld
extern uint32_t __stack_end__;       //Definiert in link.ld
#define STACK_FILL 0xAAAAAAAA

int stack_fil(){
	int *ptr;
	for(*ptr = __stack_start__; ptr < &__stack_end__; ptr++){
		*ptr = STACK_FILL;
	}
}

int stack_max(){
	int *ptr;
	int counter = 0;
	for(*ptr = __stack_start__; ptr != STACK_FILL; ptr++){
		counter++;
	}

	int *begin = &__stack_end__;
	int *current = __stack_start__[counter];
	
	size_t zellen = begin - current;
	
	TERM_CHAR(zellen);
}


mfro
Beiträge: 303
Registriert: Mi Jan 16, 2013 4:58 pm

Re: C stack speicher

Beitrag von mfro » Mo Okt 23, 2017 7:41 pm

Jetzt kommen wir der Sache näher. Offensichtlich geht's hier doch um den Prozessorstack.

Der Kommentar in deinem Code bezieht sich auf das Linker-Skript. Du hättest uns ruhig verraten können, dass es sich um Embedded-Programmierung handelt (insofern nehme ich auch meine Aussage von oben zurück und leiste Abbitte, das Linker-Skript darf Bezeichner mit führenden Unterstrichen verwenden, weil es Teil der Implementierung ist).

Dann ist aber dein Code verkehrt.

Der Prozessorstack wächst üblicherweise "nach unten", also von hohen Adressen zu niedrigen. Dein Code macht das andersrum. So wirst Du mit ziemlicher Sicherheit einen Crash produzieren, weil Du deine eigenen lokalen Variablen überschreibst.

Die einfachste Art, den Stack "wachsen" zu lassen, ist ein rekursiver Funktionsaufruf mit definierter Rekursionstiefe:

Code: Alles auswählen

void fill_stack(int depth)
{
    if (depth > 0)
        fill_stack(depth - 1);
}
Das dürfte auf einigermassen "nicht-esoterischer" Hardware pro Aufruf 8 Bytes Stack belegen (fill_stack(10) also entsprechend 80 Bytes oder 20 32-bit Worte).
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Antworten