Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

wywoływanie funkcji w C i stos

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:
wywoływanie funkcji w C i stos

Postautor: Sławek5 » 29 lip 2006, o 15:15

Zastanawiałem sie ostatnoi nad taką rzeczą.

Jeśli piszemy procedury w asemblerze i mamy np.

Kod: Zaznacz cały

procdura_1: .... lcall procedura_2 .... return procedura_2: ... lcall procedura_3 .... return procedura_3: ........ return:
w prceduerze_1 wywołujemy procedura_2 a ta z kolei wywołuje procedura_3 po po każdym wywołaniu następnej zostaje odłożona wartośc adresu na stos aby procesor powrócił do miejsca skąd wywołał czyli będąc w procedura_3 odłożyliśmy na stos poszczególne adresy powrotu dla 8051 to 6 bajtów (chyba - nie ważne).

Jeśli teraz podobnie byśmy napisali w c z funkcjami

Kod: Zaznacz cały

void f1(void) { f2(); } void f2(void) { f3(); } void f3(void) { ... }
To tez funkcje wywołują następne funkcje

I pytanie. Czy tak samoo jak w asemblerze są odbładane wartości adreów na stos, czy jest to jakoś rozwiązane inaczej przez kompilator.
Pytam dlatego, że często widzę sposób pisania progeamów w ten sposób, że tworzymy np. funkcję obsługi lcd i w tej funkcji jest wywoływana inna a ta z kolei wywouje jeszcze inna i na dodatek z parametrami.
czy jest tu jakieś niebezpieczeństwo zapełnienia stosu zarówna dla AVR jak i 8051.

stan24
-
-
Posty:60
Rejestracja:16 lut 2004, o 10:19
Lokalizacja:Łódź

Postautor: stan24 » 29 lip 2006, o 17:15

Witam,
Opowiem nie wprost :) Dobrym przykladem tego problemu jest algorytm rekurencyjny np. obliczenia funkcji silnia:

Kod: Zaznacz cały

int silnia(int n){ if(!n){ return 1; } else { return n*silnia(n-1); } }
Trudno przewidziec jaki bedzie fizyczny wierzcholek stosu. W kazdym jezyku mechanizm wywolania funkcji jest podobny i korzysta ze stosu. Dlatego celowe jest wykonanie symulacji programu za pomoca debuggera. Dla powyrzszego przykladu i wywolania funkicji silnia(5 milionow) zostanie zgloszony odpowiedni komunikat, np.: Stack is filled to 100%. Kompilatory jezykow wysokiego poziomu maja mozliwosc zmiany rozmiaru stosu kosztem pamieci danych.

Sławek5
-
-
Posty:485
Rejestracja:15 sie 2003, o 16:40
Lokalizacja:Szczecin
Kontaktowanie:

Postautor: Sławek5 » 6 sie 2006, o 09:39

Ale rekurencja to specyficzny typ funkcji wywołującej samą siebie i kompilator odpowiednio sobie z tym radzi.

A tu jest chyba trochę naczej, kolejne funkcje wywołują inne, co sie zagłębia.
A jak sprawdzić co się dzieje ze stosem w tym przypadku?

michalko12
-
-
Posty:10
Rejestracja:5 lut 2006, o 20:05
Lokalizacja:Warszawa

Postautor: michalko12 » 17 wrz 2006, o 17:45

Ale rekurencja to specyficzny typ funkcji wywołującej samą siebie i kompilator odpowiednio sobie z tym radzi.

A tu jest chyba trochę naczej, kolejne funkcje wywołują inne, co sie zagłębia.
A jak sprawdzić co się dzieje ze stosem w tym przypadku?
Najlepiej programowo, na początku każdej funkcji aktualizuj zmienna globalna stanem wskaźnika stosu jeśli jest on "głębszy" od poprzedniej wartości, a potem wyświetl tą zmienna w sposób nie inwazyjny dla stosu np poprzez wysłanie przez UART. Najlepiej jest to zrobić w postaci warunkowego makra.

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 6 gości