Estoy escribiendo esto sin utilizar nunca un ESP32 (o cualquier otro núcleo dual) o FreeRTOS. Desde mi conocimiento de FreeRTOS (búsqueda muy rápida), implementas los controladores de interrupción por tu cuenta, pero tienes que llamar a algunas funciones del sistema operativo desde dentro.
Por lo tanto, independientemente de la GPIO en la que ocurra la interrupción, terminará en la misma función de interrupción, porque solo hay un vector de interrupción para GPIO.
Pero el ESP32 tiene algunos registros para decirle qué interrupciones están pendientes. Y tienes registros que te dicen qué interrupción está habilitada. La combinación de esos registros le permite decidir qué pines están causando una interrupción.
Por lo tanto, en función de esto, puede hacer diferentes cosas según el GPIO que haya provocado la interrupción.
Te voy a dar una idea, no una implementación, así que lo siguiente es pseudocódigo:
if ((GPIO_InterruptPendingRegister & GPIO_InterruptEnabledRegister) == GPIO_0_Interrupt)
{
executeGPIO_0_Function();
// or
volatile GPIO_0_Flag = true;
// depends on how the peripheral handles this, usually needed
Reset_GPIO_0_PendingFlag();
}
if ((GPIO_InterruptPendingRegister & GPIO_InterruptEnabledRegister) == GPIO_1_Interrupt)
{
executeGPIO_1_Function();
// or
volatile GPIO_1_Flag = true;
// depends on how the peripheral handles this, usually needed
Reset_GPIO_1_PendingFlag();
}
etc.
De esta manera puede dividir la interrupción en múltiples funciones de ejecución. Prefiero la manera de usar las funciones, pero estoy programando en C ++ e intento evitar las variables globales.