En el BRAZO de la documentación se establece que:
El procesador es compatible con dos modos de funcionamiento, modo de Subproceso y el Controlador modo. El hilo se entra en el modo de restablecer y, normalmente, sobre el retorno de un excepción. Cuando en modo de Subproceso, el código puede ser ejecutado como Privilegiada o sin Privilegios.
Controlador de modo de ser introducido como resultado de una excepción. Código Controlador de modo siempre se ejecuta como un Privilegiado, por lo tanto, el núcleo cambiar automáticamente a modo Privilegiado cuando se producen excepciones.
Pero no especifica si puedo volver a el modo sin privilegios dentro de un controlador de interrupción, o si el procesador va a ignorar eso. No tengo un M3 mano conmigo a prueba en el momento así que me estoy preguntando si alguien sabe la respuesta o es capaz de poner a prueba?
Básicamente, mi situación es que me gustaría ser capaz de implementar asincrónico "manejadores de eventos" desde el código de usuario que son accionados por un poco de actividad del hardware, pero quiero que estos se ejecute en el modo sin privilegios, la manera obvia de hacerlo es tener un bucle como este en 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 ejecuta constantemente y hacer la comprobación cada vez que cualquier interrupción ocurre, incluso si no hay ningún controlador de eventos que realmente necesita para ejecutar!
Mientras que en su lugar yo podría simplemente tener una puramente interrumpir impulsada por el diseño, donde cada vez que el kernel haga algo (que se sepa) va a desencadenar un suceso de usuario, se puede plantear, por ejemplo, una baja prioridad PendSV que, a continuación, ejecuta cuando es necesario... pero, por supuesto, que luego se ejecutan en un contexto privilegiado. Así que puedo volver a privilegios aquí?