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
C stack speicher
- Xin
- nur zu Besuch hier
- Beiträge: 8859
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: C stack speicher
Moin Moin,
Und ich habe vollstes Verständnis dafür, dass Du da auf dem Schlauch stehst, denn für mich klingt das erstmal total Meschugge.
Gehen wir also davon aus, dass wir uns in einem Universum befinden, dass sich der Prof ausgedacht hat.
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.
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?
Das ist mal ein interessanter Plan, um das rauszufinden... ^^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.
Und ich habe vollstes Verständnis dafür, dass Du da auf dem Schlauch stehst, denn für mich klingt das erstmal total Meschugge.
Gehen wir also davon aus, dass wir uns in einem Universum befinden, dass sich der Prof ausgedacht hat.
Zu erstens: Kann es sein, dass die Aufgabe lautet, herauszufinden, wieviel Stackspeicher zur Zeit benutzt wird und nicht, wieviel Speicher noch frei ist?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.
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.
Du weist zumindest, wo der Stack startet und wo er endet. Die zwei Adressen bilden die aktuelle Größe vom Stack.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
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: C stack speicher
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:
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...
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 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.
- Xin
- nur zu Besuch hier
- Beiträge: 8859
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: C stack speicher
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... ^^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...
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: C stack speicher
ja stimmt @Xin, wie viel Stackspeicher benutzt wird. Sorry
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 ?
Und wie kann ich werte mit dem Inhalt denn Vergleichen? Geht da eine einfache int Zahl?
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 ?
Und wie kann ich werte mit dem Inhalt denn Vergleichen? Geht da eine einfache int Zahl?
- Xin
- nur zu Besuch hier
- Beiträge: 8859
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: C stack speicher
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).serc hat geschrieben:ja stimmt @Xin, wie viel Stackspeicher benutzt wird. Sorry
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 ?
Und wie kann ich werte mit dem Inhalt denn Vergleichen? Geht da eine einfache int Zahl?
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 );
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: C stack speicher
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);
}
Re: C stack speicher
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:
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).
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);
}
It's as simple as that. And remember, Beethoven wrote his first symphony in C.