Entonces Aunque el GIE esta en 0 los registros de los flags pueden cambiar y como bien dices podría producirse en una interrupción más de una función. Lo cual que el GIE se ponga en 0 no implica que bloquee cualquier cambio en los registros flags.
Exacto, los flags pueden ponerse a 1 tranquilamente que no va a saltar de nuevo al vector de interrupcion (0x04).
Cuando tenes unicamente 1 solo vector de interrupcion como es el caso, la unica forma de crear una especie de prioridad es poniendo el if que queremos que tenga prioridad primero.
De esa forma si decimos que flag1 deberia ejecutarse primero, probemos varios escenarios:
1- flag 1 y 2 no se activan.
2- flag 1 se activa y 2 no.
3- flag 2 se activa y el 1 no.
4- flag 1 y 2 se activan
5- flag 1 se activa, y flag 2 se activa mientras se ejecuta flag 1
6- flag 2 se activa y flag 1 se activa mientras entra a la interrupcion
7- flag 2 se activa y flag 1 se activa mientras ejecuta flag 2
1- No se activa ninguna , por lo tanto no entra a la interrupcion
2- Entra , ejecut flag1 y sale
3- Entra, ejecuta flag2 y sale
4- Entra, ejecuta flag1 y luego flag2, cumpliendo la prioridad
5- Entra , ejecuta flag 1 y luego flag2 cumpliendo la prioridad
6- Entra , ejecuta flag1 y luego flag2 cumpliendo la prioridad, y se podria tomar como que fue "simultaneo" el activar flag1 y flag2
7- Entra , ejecuta flag2, sale y ejecuta flag1, que si te pones a pensar es correcto, por que flag1 se activo mucho tiempo despues.
Porque como bien dices existe la posibilidad de que el flag 2 haya ejecutado la interrupción pero en un tiempo muy pequeño se ejecuta el flag 1. Si nuestro programa consiste en 2 leds que se encienden indicando el orden en que los flags se han puesto en uno.
El programa fallara porque si nosotros en la dirección de interrupción tenemos:
void interrupt funcion(void){
if(flag1)
if(flag2)
}
primero se ejecutara el if(flag1) y despues (flag2) y no respetando el orden que queríamos.
Existe alguna solución para esto?
No estas equivocado. Si flag2 se esta ejecutando, ya flag1 paso. Lo cual se terminaria la interrupcion, saldria y al estar activo todavia flag1 entraria de nuevo.
Si vos decis que flag2 dispara la accion de interrupcion y luego mientras salta al vector de interrupcion y ejecuta algun codigo antes de comenzar a preguntar por los if, flag1 se activa, entonces se considera como que se activaron simultaneamente. Es decir tenes un "margen" en que es imposible diferenciar el tiempo entre ambas para saber cual fue primero.
A medida que avanza la tecnologia. PIC18 -> PIC24/dsPIC -> PIC32
Esta posibilidad disminuye por que las cosas se hacen por hardware pero siempre esta, ya que por ejemplo podrian tardar 12 ciclos de reloj en un micro ARM para entrar y hacer el salto al vector correspondiente. Los PIC18 como decia tiene una funcion de guardado automatico de registros, por lo cual no tenes instrucciones antes de esos if. A lo sumo un salto como maximo.