avr-gcc: Czy mozna wywołać funkcje z wn

Jul 01, 2005 4 Replies

Witam!



Trafiłem na dziwny problem i w zasadzie nie mogę się doszukac na google jasnej odpowiedzi, może ktoś pomoże:



mam taki kod:



SIGNAL(SIG_OVERFLOW0) { counter++; }



I on działa ok.



Mam taki kod:



SIGNAL(SIG_OVERFLOW0) { proc(); }



void proc(void) { counter++; }



I nie działa poprawnie. Teraz pytanie zanim zaczne kombinowac z symulatorem: czy wolno z wnętrza przerwań wołać funkcje ? Wydaje mi się, że nie ma problemu ze stosem, jednak z nieznanych mi przyczyn procesor idzie w maliny w tym drugim przypadku. Rejestry w przerwaniu używane w funkji "proc()" są przechowywane (przynajmniej tak widze analizując listing).



Wywoływanie funkcji z głownego kodu działa poprawnie.



Problem jest podczas używania flagi -O1 oraz O2 kompilatora, jesli zmienie na bez optymalizacji lub O3/O4 działa poprawnie (ale jest 2x dłuzszy kod więc to żadne rozwiązanie :( ). Kompilator avr-gcc w wersji



3.4.1.

Na pewno mozna. A propos optymalizacji: zadeklaruj moze te zmienne jako volatile - zwlaszcza jesli sa uzywane w przerwaniu i gdzie indziej

Hmmm .... bardzo dziwne, oglądam kod w asm z O2 i O3 i nic złego nie widzę :/

To jest oczywiście zrobione.

[...]

Tak to jest jak ktos zaczyna z jezykiem C nie znajac asemblera.

Uprosc program do minimum i porownaj kod w asemblerze wypluty przez kompilator obu wersji (dzialajacej i niedzialajacej). Wszystko powinno sie wyjasnic.

Nie przesadzaj, to nie jest wina nieznajomosci assemlbera, przecież w następnym wątku napisłem, ze zmienna ląduje w 2 róznych obszarach pamięci jeśli użyje static i extern. Swoją drogą problem już rozwiązałem, o czym napisze w tamtym wątku.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required