Grzegorz Kurczyk
Guest
Fri Jul 20, 2007 2:28 pm
Witam
Kompilowałem ostatnio swoje starsze źródła na ATmega32.
Program, który wcześniej działał nagle przestał. Tzn. przestał po
skompilopwaniu go za pomocą WinAVR-20060421. Patrzę w kod wynikowy, a
tam z deklaracji procedur obsługi przerwania zdefiniowanych jako
INTERRUPT(vectoR) porobiły się zwykłe procedurki zakończone ret-em.
Przerwania zadeklarowane jako SIGNAL(vector) kompilują się poprawnie.
Czy wie ktoś z Grupowiczów gdzie się podziała deklaracja INTERRUPT ? W
avr-libc wyczytałem (choć nie jest to napisane wprost), że INTERRUPT
zniknęło, a pojawiła się deklaracja ISR(vector), ale z tego co
zauważyłem w kodzie wynikowym to daje ona na wyjściu dokładnie to samo
co SIGNAL.
Pozdrawiam
Grzegorz
T.M.F.
Guest
Fri Jul 20, 2007 2:49 pm
Grzegorz Kurczyk pisze:
Quote:
Witam
Kompilowałem ostatnio swoje starsze źródła na ATmega32.
Program, który wcześniej działał nagle przestał. Tzn. przestał po
skompilopwaniu go za pomocą WinAVR-20060421. Patrzę w kod wynikowy, a
tam z deklaracji procedur obsługi przerwania zdefiniowanych jako
INTERRUPT(vectoR) porobiły się zwykłe procedurki zakończone ret-em.
Przerwania zadeklarowane jako SIGNAL(vector) kompilują się poprawnie.
Czy wie ktoś z Grupowiczów gdzie się podziała deklaracja INTERRUPT ? W
avr-libc wyczytałem (choć nie jest to napisane wprost), że INTERRUPT
zniknęło, a pojawiła się deklaracja ISR(vector), ale z tego co
zauważyłem w kodzie wynikowym to daje ona na wyjściu dokładnie to samo
co SIGNAL.
Zdecydowanie ISR(vector) dziala. Roznica pomiedzy ISR a SIGNAL polega
chyba na wlaczeniu/wylaczeniu przerwan w trakcie.
--
Inteligentny dom -
http://idom.wizzard.one.pl
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz sie do projektu.
Grzegorz Kurczyk
Guest
Fri Jul 20, 2007 4:00 pm
Użytkownik T.M.F. napisał:
Quote:
Zdecydowanie ISR(vector) dziala. Roznica pomiedzy ISR a SIGNAL polega
chyba na wlaczeniu/wylaczeniu przerwan w trakcie.
No właśnie o ten rozkaz sei chodzi. Niestety ISR kompiluje bez niego

K.L Piecuch
Guest
Fri Jul 20, 2007 7:41 pm
Dnia 20.07.2007 Grzegorz Kurczyk <grzegorz.usun.to@control.slupsk.pl> napisał/a:
Quote:
No właśnie o ten rozkaz sei chodzi. Niestety ISR kompiluje bez niego :-(
INTERRUPT zlikwidowano właśnie po to, aby uniknąć zamieszania. Nie wszyscy
rozróżniali, czym się różni SIGNAL od INTERRUPT. W ISR musisz w sposób jawny
włączyć sam sobie sei(). Chodzi o to, aby programista od początku do końca
wiedział co się dzieje.
--
****** Krzysztof Piecuch ******
sp9rqa@radioam.net
GG 7084611
****** Linux User #132375 ******
T.M.F.
Guest
Sat Jul 21, 2007 9:34 am
K.L Piecuch pisze:
Quote:
Dnia 20.07.2007 Grzegorz Kurczyk <grzegorz.usun.to@control.slupsk.pl> napisał/a:
No właśnie o ten rozkaz sei chodzi. Niestety ISR kompiluje bez niego :-(
INTERRUPT zlikwidowano właśnie po to, aby uniknąć zamieszania. Nie wszyscy
rozróżniali, czym się różni SIGNAL od INTERRUPT. W ISR musisz w sposób jawny
włączyć sam sobie sei(). Chodzi o to, aby programista od początku do końca
wiedział co się dzieje.
Tylko jest jeden problem. Jesli jawnie umieszcze sei() w ciele funkcji
to wykona sie ono dopiero po calym prologu, czyli na kilkadziesiat
taktow zegara przerwania sa zablokowane. Niby nic, ale w pewnych
sytuacjach to moze miec znaczenie. Zostaje co prawda naked i dodanie
wlasnego prologu/epilogu ale to dublowanie wczesniejszego signal i
interrupt.
--
Inteligentny dom -
http://idom.wizzard.one.pl
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz sie do projektu.
Zbych
Guest
Sat Jul 21, 2007 10:13 am
T.M.F. przemówił ludzkim głosem:
Quote:
Zostaje co prawda naked i dodanie
wlasnego prologu/epilogu ale to dublowanie wczesniejszego signal i
interrupt.
RTFM!
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
a szczególnie paragraf "Nested interrupts"
K.L Piecuch
Guest
Sat Jul 21, 2007 11:41 am
Dnia 21.07.2007 T.M.F. <tfrancuz@nospam.mp.pl> napisał/a:
Quote:
K.L Piecuch pisze:
Tylko jest jeden problem. Jesli jawnie umieszcze sei() w ciele funkcji
to wykona sie ono dopiero po calym prologu, czyli na kilkadziesiat
taktow zegara przerwania sa zablokowane. Niby nic, ale w pewnych
sytuacjach to moze miec znaczenie. Zostaje co prawda naked i dodanie
wlasnego prologu/epilogu ale to dublowanie wczesniejszego signal i
interrupt.
Myśle, że to wiele wyjąsni.
http://forum.ep.com.pl/search.php?search_author=Jurek+Szczesiul&sid=ab64b33328adbc0652d827262b3cc681
void TIMER1_COMPB_vect(void) __attribute__((interrupt));
--
****** Krzysztof Piecuch ******
sp9rqa@radioam.net
GG 7084611
****** Linux User #132375 ******
Grzegorz Kurczyk
Guest
Sat Jul 21, 2007 5:41 pm
Użytkownik K.L Piecuch napisał:
Quote:
void TIMER1_COMPB_vect(void) __attribute__((interrupt));
BINGO !!! :-)
O to chodziło. Dzięki serdeczne.
Pozdrawiam
Grzegorz
K.L Piecuch
Guest
Sat Jul 21, 2007 6:41 pm
Dnia 21.07.2007 Grzegorz Kurczyk <grzegorz.usun.to@control.slupsk.pl> napisał/a:
Quote:
Użytkownik K.L Piecuch napisał:
void TIMER1_COMPB_vect(void) __attribute__((interrupt));
BINGO !!! :-)
O to chodziło. Dzięki serdeczne.
Nie ma sprawy. Ja też się wcześniej na to nadziałem

--
****** Krzysztof Piecuch ******
sp9rqa@radioam.net
GG 7084611
****** Linux User #132375 ******