Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 3 lut 2025, o 09:12


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 22 lut 2016, o 11:02 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1081
Pomógł: 73

Witam, pisząc program zacząłem zastanawiać się nad jedną rzeczą...
Obrazek
Rys. 1.

Na rysunku 1 zamieściłem poprawny schemat blokowy, który ilustruje pracę programu. W funkcji main znajduje się pętla nieskończona while a co jakiś czas wywoływana jest funkcja A, która wywołuje funkcję B a ta z kolei funkcję C. Ta ostatnia czyli funkcja C zwraca wynik, następnie funkcja B również zwraca wynik i podobnie funkcja A. Program działa prawidłowo a stos za każdym razem wejścia w kolejne funkcje "powiększa się" a po ich wykonaniu "pomniejsza".

Obrazek
Rys. 2.

Co się jednak stanie kiedy kolejne funkcję będą się wykonywać w sposób pokazany na rysunku 2? czy stos zostanie w końcu zapełniony i program zawiesi się? Funkcja A wywołuje funkcję B, ta z kolei wywołuje funkcję C a funkcja C wywołuje funkcję main bo powiedzmy jest taka potrzeba aby program zaczął wykonywać się od początku. Jak myślicie program się wysypie czy może kompilator tak skompiluje kod że będzie on działał poprawnie bez ryzyka zapełnienia stosu?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2016, o 11:47 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27352
Lokalizacja: Szczecin
Pomógł: 1042

Jarecki napisał(a):
ta z kolei wywołuje funkcję C a funkcja C wywołuje funkcję main bo powiedzmy jest taka potrzeba aby program zaczął wykonywać się od początku. Jak myślicie program się wysypie czy może kompilator tak skompiluje kod że będzie on działał poprawnie bez ryzyka zapełnienia stosu?


Wiesz najgorszym z możliwych pomysłów i to koszmarnych jest właśnie takie podejście i tłumaczenie że:

Jarecki napisał(a):
a funkcja C wywołuje funkcję main bo powiedzmy jest taka potrzeba

Sorki ale to jest już KOMPLETNIE hmmmm .... no żeby jakoś delikatnie to określić nonsens ...

Uwierz mi, że NIGDY ale to NIGDY tak się nie robi a sposobów aby program się rozpoczął całkowicie od nowa jest MILION. Przy czym nawet takie podejście aby w toku normalnego działania program miał się resetować to też jakieś koszmarne podejście ...

Tyle tytułem próby wybicia tobie z głowy takich pomysłów ....

-------------------------------------------------

Chcesz wiedzieć jak to się robi ? można ci pomóc i dużo podpowiedzieć ale najpierw trzeba byłoby wiedzieć co chcesz zrobić - zrealizować. Więc lepiej napisz o tym a nie pytaj co będzie ze stosem gdy będziesz wywoływał z funkcji C funkcję main() ... bo widać, że sam i to dobrze przeczuwasz że będzie masakra amerykańską piłą tarczową.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2016, o 11:54 
Offline
Użytkownik

Dołączył(a): 13 lut 2015
Posty: 99
Pomógł: 6

Jarecki napisał(a):
Obrazek
Rys. 2.

Co się jednak stanie kiedy kolejne funkcję będą się wykonywać w sposób pokazany na rysunku 2? czy stos zostanie w końcu zapełniony i program zawiesi się? Funkcja A wywołuje funkcję B, ta z kolei wywołuje funkcję C a funkcja C wywołuje funkcję main bo powiedzmy jest taka potrzeba aby program zaczął wykonywać się od początku. Jak myślicie program się wysypie czy może kompilator tak skompiluje kod że będzie on działał poprawnie bez ryzyka zapełnienia stosu?

GCC tak właśnie optymalizuje generowany kod jeśli wyniki z ostatniej funkcji są zwracane do main() - ostatnia funkcja zawiera 'ret' a reszta zwykłe jmp/rjmp albo leżą jedna za drugą. Jakiekolwiek ręczne obejścia skończą się wysypaniem stosu.

EDIT:
Oczywiście mowa o powrocie do punktu wyjścia - na początek maina to poprzez reset można co najwyżej.
Kod:
asm volatile("jmp 0" ::);

_________________
AVR-UART-lib
AVR-FAST-ENCODER
RFM7x-lib



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2016, o 12:03 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27352
Lokalizacja: Szczecin
Pomógł: 1042

jnk0le napisał(a):
Oczywiście mowa o powrocie do punktu wyjścia - na początek maina to poprzez reset można co najwyżej.

Można też o wiele czyściej np za pomocą watchdog'a ale nie w tym rzecz - warto zaznaczyć, że takie pisanie programów nie ma sensu, które w ramach normalnej pracy będą dokonywać resetu procka

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2016, o 12:07 
Offline
Użytkownik

Dołączył(a): 23 sty 2014
Posty: 1081
Pomógł: 73

Wiem że to paskudne rozwiązanie i nie mam zamiaru go stosować :) to tylko takie głośne przemyślenia :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2016, o 12:09 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27352
Lokalizacja: Szczecin
Pomógł: 1042

Jarecki napisał(a):
to tylko takie głośne przemyślenia

No to właśnie - masz dobre przemyślenia - że ze stosem byłaby masakra ;) wąż w pewnym momencie zacząłby zjadać własny ogon aż by się zadławił ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2016, o 13:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1967
Lokalizacja: Lipsko
Pomógł: 125

A jak koniecznie chcesz wracać do początku bez zmiany wyników utworzonych przez kolejne funkcje to mając świadomość takiej sytuacji zrób sobie dodatkową flagę, która w wypadku ustawienia, będzie przy każdym powrocie w funkcji wywołującej informować o zignorowaniu wyniku, który właśnie przyszedł z wywołanej przed chwilą funkcji. To tylko jeden ze sposobów, a rozwiązań w zależności od potrzeb może być dużo więcej.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2016, o 19:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

Myślę, że koledze Jarecki chodziło bardziej o to co się stanie, gdy wskaźnik stosu osiągnie swoje maksimum (minimum).

Spróbuj i daj znać - funkcja A wywoła funkcję B, ta z kolei funkcję C a ta funkcję A itp.
Jakiś delay w kodzie i niech każda z funkcji wyświetli wskaźnik stosu na LCD. Kompilator powinien to puścić.
To może być ciekawe doświadczenie.

A swoją drogą - nie bardzo wiem jak i czy w ogóle można wywołać funkcję main(). Nie znajduje się ona na pewno pod adresem zerowym.

A... nie używaj zmiennych globalnych i static... ;)

_________________
Mr. Nobody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2016, o 22:15 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27352
Lokalizacja: Szczecin
Pomógł: 1042

Cytuj:
Jakiś delay w kodzie i niech każda z funkcji wyświetli wskaźnik stosu na LCD. Kompilator powinien to puścić.
To może być ciekawe doświadczenie.

No tak doświadczenie może być bardzo ciekawe - zwykle przepełnienie stosu objawia się w programach tak - że programista szuka tygodniami błędu w CAŁKOWICIE innym miejscu zanim na końcu dopiero zorientuje się, że chodzi o stos ;) opisuję to i metodę sprawdzania wolnej pamięci RAM która nie została użyta na zmienne globalne i stos w Greenbooku. Czasem gdy występują dziwne zjawiska w programie i wydaje się że jesteśmy bezsilni a powodem są kosmici :lol: - to pierwsze co stosuję, to właśnie tę metodę aby się upewnić że nie sypie mi się stos zanim nie stracę znowu kilku tygodni na szukanie problemu w całkiem innym miejescu ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO