En algunos kernels de RT, si se quiere enviar a un semáforo o bandera desde un ISR, se necesita llamar a una versión especial del método, en lugar de la normal llamada desde una tarea normal. Ejemplos:
xSemaphoreGiveFromISR()
en lugar dexSemaphoreGive()
en FreeRTOSisr_PostSem()
en lugar deCoPostSem()
en CoOS.
Sin embargo, hay otros núcleos en los que esto no es necesario. Por ejemplo:
OSSemPost()
en uC/OS pueden ser llamados tanto desde tareas como desde ISRs.release()
en mbed-rtos, puede ser llamado desde Threads e ISRs.semGive()
en VxWorks parece que se puede llamar desde un ISR según los documentos, y a primera vista no existe ningún método especial para los ISR.
¿Por qué hay que crear versiones especiales? Entiendo que la publicación de un semáforo o bandera puede hacer que se despierte una tarea bloqueada de mayor prioridad. Y es por eso que el planificador es más probable que se ejecute cuando se llama a la llamada de retorno de salida de la ISR (me refiero a esas funciones necesarias para ser llamadas cuando se quiere usar código del kernel dentro de la ISR, como portEXIT_SWITCHING_ISR()
en FreeRTOS, o OSIntExit
en uC/OS). Entonces, ¿por qué el método especial post además de la llamada ISRexit?