DORMIR o ocupado en espera. ¿Cuál atendería una interrupción más rápido?

Estoy programando un microcontrolador PIC para dar servicio a dos eventos a través de interrupciones en un entorno muy limitado en el tiempo.

Los microcontroladores PIC permiten un modo SLEEP que activa la PCU ante cualquier interrupción externa (INTn), pero tiene un retraso de activación que depende del modo de oscilador seleccionado.

Quiero saber qué opción comenzaría a atender las interrupciones más rápido. Un bucle principal como este:

//CPU never goes to sleep, keeps executing a jump
void main(){
    while(1){}
}

o un bucle principal como este:

//CPU goes to sleep (idle), waits for INTn interrupts.
void main(){
    while(1){
     asm SLEEP;
    }
}

Despertar del modo inactivo parece tomar 2 ciclos de acuerdo con PIC18F4XK22, mientras que una instrucción de salto (de un ciclo while infinito puede tomar más tiempo y puede o no ser interrumpible a la mitad de la ejecución del salto.

Respuestas (1)

Tú mismo lo dijiste, despertarse del sueño incurre en algún retraso, dependiendo del oscilador. El retraso será relativamente pequeño para los osciladores RC y mucho más largo para los osciladores de cristal.

El segundo método usa menos energía, suponiendo que pueda dormir lo suficiente en promedio para que la corriente reducida sea significativa.

El sueño inactivo parece despertarse en ~2 ciclos de reloj. Si las instrucciones de salto no se pueden interrumpir a la mitad (no lo sé), la suspensión inactiva podría ser una mejor opción. El consumo de energía, no es un problema.
@NeonMan: agregue esa información sobre 2-clock-wake a su pregunta. Tal vez incluya una sub-búsqueda sobre el salto no interrumpible.
También agregue esa parte sobre "Consumo de energía, no es un problema". Predigo que obtendrá un acuerdo casi universal para mantener la cosa despierta. Ingrese 10 NOPinstrucciones (o cien) si desea un 90 (o 99) por ciento de posibilidades de detectar la interrupción sin que una JMPinstrucción lo moleste.
@OlinLathrop interesante. ¿Puedes agregar detalles sobre por qué un cristal tomaría más tiempo? Me imagino que el RC solo se toma el tiempo que tarda en cargar la tapa. Ignorando los ciclos del chip para salir del sueño.
Las interrupciones se pueden atender entre instrucciones. Si ocurre una solicitud de interrupción mientras se ejecuta una instrucción, la instrucción debe ejecutarse hasta completarse antes de que se pueda atender la interrupción. Creo que la pregunta que realmente le preocupa es cuál es la latencia de interrupción mínima/máxima para PIC18F.