Mam ciekawy problem. Chciałem aby przerwania od UARTA były INTERRUPT. Nie można jednak tego zrobić, bo flaga przerwania jest kasowana po operacji na UDR a nie powejściu w IRQ tak jak np w przypadku timerów.Gdy zadeklaruje sie więc przerwanie INTERRUPT to natąpi przepełnienie stosu. W konsekwencji trzeba użyć przerwania SIGNAL, w nim wykonać operację na UDR i uruchomić IRQ przez sei(). Niestety to nie to samo co INTERRUPT, ponieważ tam kompilacja wygląda tak:
Natomiast w przypadku SIGNAL + sei() tak:
Rozwiązaniem jest NAKED i wstawka assemlerowa:
I tu moje pytanie, jak sie dowiedzieć jakie rejestru są użyte przez kompilator bez analizy procedury przerwania?
Code: avrasm
Natomiast w przypadku SIGNAL + sei() tak:
Code: avrasm
Rozwiązaniem jest NAKED i wstawka assemlerowa:
Code: avrasm
I tu moje pytanie, jak sie dowiedzieć jakie rejestru są użyte przez kompilator bez analizy procedury przerwania?