En la documentación de ARM se indica que:
El procesador admite dos modos de funcionamiento, modo de subproceso y controlador modo. El modo hilo se ingresa al restablecer y normalmente al regresar de un excepción. Cuando está en modo Hilo, el código puede ejecutarse como Privilegiado o no privilegiado.
El modo de controlador se ingresará como resultado de una excepción. Codificar en El modo de controlador siempre se ejecuta como Privilegiado, por lo tanto, el núcleo cambia automáticamente al modo Privilegiado cuando se producen excepciones.
Pero no especifica si puedo volver al modo sin privilegios dentro de un controlador de interrupciones, o si el procesador simplemente lo ignorará. No tengo un M3 a mano conmigo para probar en este momento, así que me pregunto si alguien sabe la respuesta o si es capaz de realizar una prueba.
Básicamente, mi escenario es que me gustaría poder implementar "manejadores de eventos" asíncronos desde el código de usuario que se desencadena por alguna actividad de hardware, pero quiero que se ejecuten en modo no privilegiado, la forma obvia de hacerlo es simplemente tenga un bucle como este en el modo de subproceso después de configurar el kernel:
while (true) {
__WFI();
if (event_triggered) {
run_event_handler();
}
}
Pero el inconveniente es que este código se ejecutará constantemente y se realizará la comprobación cada vez que ocurra una interrupción cualquiera , ¡incluso si no es necesario ejecutar ningún controlador de eventos!
Mientras que en lugar de eso, simplemente podría tener un diseño puramente de interrupción donde cada vez que el kernel haga algo que (sabe) activará un evento de usuario, puede generar, por ejemplo, un PendSV de baja prioridad que luego los ejecuta según sea necesario. .. pero por supuesto que luego se ejecutaría en un contexto privilegiado. Entonces, ¿puedo volver a sin privilegios aquí?