Isso afetaria o código dentro do loop principal que depende da função millis (), uma vez que uma quantidade significativa de tempo é gasta processando os ISRs?
Para colocar uma figura para você ...
Frequência do ISR de estouro do Timer 0 sendo chamado
O código chamado pelo (padrão) vetor de interrupção de estouro do Timer 0 (TIM0_OVF_vect) é usado por millis
e micros
para ajudar a retornar seus resultados. Seu objetivo é contar estouros do Timer 0.
Para obter resultados precisos, este ISR não deve perder um estouro. O cronômetro está configurado para tick a cada 4 µs em um sistema de 16 MHz (por causa do prescaler de 64: 64 * 62,5 ns = 4000 ns
) e overflow a cada 1,024 ms (1024 µs) - porque transborda após 256 tiques ( 4 µs * 256 = 1024 µs
).
Visto que há apenas um sinalizador de estouro, se o ISR perde um estouro, então ambos os milis e micros estarão fora de 1,024 ms (ou mais, se ele perder vários estouros).
Para ter certeza de capturar esse estouro, o ISR, portanto, deve ser chamado dentro 1,024 ms (provavelmente um pouco menos por causa do tempo necessário para entrar no ISR, então diga: 1 ms).
Prioridade de interrupção
No Atmega328P (como usado em o Arduino Uno) estas são as prioridades do vetor de interrupção:
1 Reinicializar 2 Solicitação de interrupção externa 0 (pino D2) (INT0_vect) 3 Solicitação de interrupção externa 1 (pino D3) (INT1_vect) 4 Alteração de pino Solicitação de interrupção 0 (pinos D8 a D13) (PCINT0_vect) 5 pinos de troca Solicitação de interrupção 1 (pinos A0 a A5) (PCINT1_vect) 6 Solicitação de interrupção de alteração de pino 2 (pinos D0 a D7) (PCINT2_vect) 7 Interrupção de tempo limite do watchdog (WDT_vect) 8 Timer / Contador2 Compare a correspondência A (TIMER2_COMPA_vect) 9 Timer / Counter2 Compare Match B (TIMER2_COMPB_vect) 10 Timer / Counter2 Overflow (TIMER2_OVF_vect)
11 Temporizador / counter1 Captura de Eventos (TIMER1_CAPT_vect) 12 Temporizador / counter1 Comparar Combinar A (TIMER1_COMPA_vect) 13 Temporizador / counter1 Comparar Combinar B (TIMER1_COMPB_vect) 14 Temporizador / counter1 Overflow (TIMER1_OVF_vect) 15 Temporizador / Counter0 Comparar Combinar A (TIMER0_COMPA_vect) 16 Temporizador / Counter0 Compare Match B (TIMER0_COMPB_vect) 17 Timer / Counter0 Overflow (TIMER0_OVF_vect) 18 Transferência serial SPI completa (SPI_STC_vect) 19 USART Rx Complete (USART_RX_vect) 20 USART, Registro de dados vazio (USART_UDRE_vect) 21 USART, Tx ADVect_Tx) Conversão completa 21 USART, Tx ADX Completo (ADC_vect) 23 EEPROM Pronto (EE_READY_vect) 24 Comparador Analógico (ANALOG_COMP_vect) 25 Interface Serial de 2 fios (I2C) (TWI_vect) 26 Armazenar memória de programa pronta (SPM_READY_vect)
Você pode ver a partir dessa lista que TIMER0_OVF_vect é o número 17 dessa lista, então qualquer interrupção de prioridade anterior teria precedência, por exemplo, interrupções externas , interrupções de mudança de pino, os outros temporizadores (porém não SPI / Serial / ADC / I2C).
Se um estouro acabou de acontecer , você teria praticamente 2 ms de graça ( porque você tem 1 ms antes do próximo e mais 1 ms antes de precisar notá-lo). No entanto, se o estouro está prestes a acontecer , então você só tem o período de carência de 1 ms.
Menciono isso porque se você tiver um evento de interrupção externa 0 (INT0_vect) e o ISR leva 500 µs, e então o evento de interrupção externa 1 (INT1_vect) durante esse tempo (então outro ISR será atendido), então a interrupção do temporizador pode ser bloqueada por um tempo.
É por isso que todos os ISRs devem ser curtos. Não é bom o suficiente que alguns deles sejam.
Reativando interrupções
Eu recomendo fortemente contra isso. As bibliotecas não são projetadas para serem reentrantes e, uma vez que você comece a habilitar interrupções em um ISR, você pode descobrir que ele próprio é chamado novamente quando estiver no meio do caminho sendo chamado pela primeira vez. Você também pode interromper uma função de biblioteca (por exemplo, memcpy) que não foi projetada para ela.
E, claro, se você estiver reativando interrupções dentro de um ISR porque o ISR leva muito tempo: bem, essa é a situação exata em que você pode disparar este re -entrada.
Mais informações: