Używam dwóch przerwań - TCCR0 do obsługi LED displaya i TCCR2 do operacji I/O. Wyświetlacz powinen mięć możliwość wyświetlania napisów które mrugają. A operacje IO są raczej asynchroniczne ale pojedyncza może trwać dłużej niż pojedyncze mrugnięcie wyświetlacza czyli "zamrozi" go w przypadku użycia display_routine() i i_o_routine() jedna po drugiej w jednym przerwaniu.
więc zrobiłem
operacje I/O zasymulowałem przez
Myślałem że najprościej ustawić to TIMER2_COMP_vect jako ISR_NOBLOCK ale wtedy wyświetlacz zostaje w jednej pozycji. W którym miejscu źle myślę? Czy w przypadku wywołania przerwania w momencie obsługi innego, mam gwarancję że pierwsze zostanie dokończone ? I czy w przypadku długiej obsługi przerwania może ono zostać przerwane przez to samo? tzn czy mysze dodac cos takiego:
więc zrobiłem
ISR(TIMER0_COMP_vect) {
display_routine();
}
ISR(TIMER2_COMP_vect) {
i_o_routine();
}
operacje I/O zasymulowałem przez
_delas_us(100) //próbowałem roznych wartoci i _delay_ms
Myślałem że najprościej ustawić to TIMER2_COMP_vect jako ISR_NOBLOCK ale wtedy wyświetlacz zostaje w jednej pozycji. W którym miejscu źle myślę? Czy w przypadku wywołania przerwania w momencie obsługi innego, mam gwarancję że pierwsze zostanie dokończone ? I czy w przypadku długiej obsługi przerwania może ono zostać przerwane przez to samo? tzn czy mysze dodac cos takiego:
void i_o_routine() {
if(!lock) {
lock = 1;
do_stuff();
lock = 0;
}
}
