Wątek przeniesiony 2018-11-08 11:17 z Inne języki programowania przez Marooned.

avr - tryb uśpienia a przerwanie od asynchronicznego timera

0

Witam

Na bazie Atmega8 buduję zegarek taktowany poprzez zewnętrzny kwarc 32.768kHz co daje mi przerwanie co sekundę.
W dokumentacji pisze że przerwanie od przepełnienia tego asynchronicznego timera to jest w stanie wybudzić procek z trybu power save co mi doskonale odpowiada ponieważ buduję układ który powinien przełączyć na zasilanie z baterii jeśli nie ma sieci (wówczas wygasić wyświetlacz ale nie zaprzestać odmierzania czasu). Dokumentacja również mówi o tym że jak pojawi się to przerwanie to procek skoczy do procedury jego obsługi. Zastanawiam się co by było gdybym w tej obsłudze dał rozkaz "idź spać" - czy nie byłoby sytuacji że procek się wybudzi i będzie chciał robić najpierw przerwanie od początku podczas gdy jeszcze de facto nie wyszedł z poprzedniego ponieważ to właśnie w przerwaniu mieliśmy rozkaz "idź spać"...?

Inaczej : czy w momencie pojawienia się kolejnego przerwania od timer2 procek będzie czekał na wykonanie poprzedniego w całości czy też może zawiesi obsługę poprzedniego (bo jeszcze się nie skończyło) i ponownie rozpocznie jego wykonywanie od początku (co oczywiście grozi przepełnieniem stosu) ?
Czy procek ma szansę wybudzić się w chwili gdy poprzednie przerwanie się nie zakończyło (inaczej czy na czas obsługi przerwania od timer2 blokowana jest flaga przerwań globalnych?).

1

Strona 15 dokumentacji:

When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are disabled.
The user software can write logic one to the I-bit to enable nested interrupts. All enabled
interrupts can then interrupt the current interrupt routine. The I-bit is automatically set when a
Return from Interrupt instruction – RETI – is executed.

Po wywołaniu przerwania, bit przerwań jest zerowany. Instrukcja reti czyli po ostatniej klamerce:

ISR(*_vect){
...
}

następuje ponowne ustawienie rejestru przerwań. Dodatkowo jest napisane, że można ustawić przerwania wewnątrz tworząc zagnieżdżone przerwania.

ISR(*_vect){
...
sei();
...
}

W tym wypadku stos zostanie przepełniony przy dostatecznej ilości przerwań.

1 użytkowników online, w tym zalogowanych: 0, gości: 1