Por ejemplo, en s3c2440, borra solo las posiciones de bits del SRCPND correspondientes a las establecidas en uno en los datos. Las posiciones de bit correspondientes a las que se establecen en 0 en los datos permanecen como están.
Por ejemplo, en s3c2440, borra solo las posiciones de bits del SRCPND correspondientes a las establecidas en uno en los datos. Las posiciones de bit correspondientes a las que se establecen en 0 en los datos permanecen como están.
Esta es una característica extremadamente útil. El objetivo principal es poder modificar los bits individuales del registro con una operación atómica (no interrumpible) en lugar de una operación de lectura-modificación-escritura. Esto es en realidad bastante común para las banderas de interrupción.
La idea general de los indicadores de interrupción es que el hardware establece el indicador cuando se produce la interrupción, y luego el software la borra después de entregar el evento. El evento para establecer la bandera puede ocurrir en cualquier momento, incluso durante la ejecución de un ISR y durante una instrucción que accede al registro de la bandera.
Supongamos que su registro de bandera comienza a las 00000000. Se produce un evento de hardware que establece un bit. Diga, bit 2. Entonces, el registro se lee como 00000100. Ahora, se produce otra interrupción y establece otro bit. Diga, bit 3. Ahora el registro se lee como 00001100.
Ahora digamos que el ISR para manejar la primera interrupción intenta borrar el bit correspondiente. Si el registro admite la eliminación atómica, entonces la CPU puede ejecutar una sola escritura atómica de 00000100 para borrar el bit. El registro ahora lee 00001000. Genial.
Ahora, supongamos que la CPU no admite esto, y el software tiene que hacer una operación de lectura-modificación-escritura. Digamos que el registro de bandera es 00001100. Para borrar el bit 2, el software lee el registro de bandera en un registro de propósito general, borra el bit y luego lo escribe de nuevo. Entonces leerá 00001100 en un registro y borrará el bit. En este punto, el registro de bandera sigue siendo 00001100 y el registro de propósito general contiene 00001000. Luego, la CPU escribe el valor del registro de nuevo en el registro de bandera. En este punto, el registro de bandera lee 00001000. Hasta ahora todo bien. Entonces, ¿cuál es el problema?
Bueno, supongamos que se produce una interrupción de hardware DESPUÉS de que se lea el registro del indicador, pero ANTES de que se escriba de nuevo. Digamos que el registro de bandera es 00001100. Para borrar el bit 2, el software lee el registro de bandera en un registro de propósito general, borra el bit y luego lo escribe de nuevo. Entonces leerá 00001100 en un registro y borrará el bit. En este punto, el registro de indicador sigue siendo 00001100 y el registro de propósito general contiene 00001000. Ahora suponga que el controlador de interrupción establece el bit 6, por lo que el registro de indicador se convierte en 01001100. Luego, la CPU vuelve a escribir el valor del registro en el registro de indicador. En este punto, el registro de indicador lee 00001000. El indicador de que el conjunto de hardware se ha restablecido y que el evento de interrupción se ha perdido.
Este tipo de registro probablemente se implementaría físicamente como un conjunto de latches SR, o un flip flop con un poco de lógica (quizás D = (Q & ~ (WE & data)) | set). Lecturas leería la salida de los pestillos. Las señales de interrupción se conectarían a las entradas de 'conjunto', y las escrituras en el registro conducirían las entradas de 'reinicio'.
Los registros que realizan operaciones lógicas en el acceso de escritura son una cosa común, pero los ves más a menudo en los controladores de interrupción.
Esto básicamente permite la modificación atómica de varios bits; sin este mecanismo, tendría que generar una instrucción de lectura, una instrucción de borrado de bits y una instrucción de escritura, introduciendo una condición de carrera en la que los bits establecidos por el controlador después de leer el registro se borran en escritura, sin que la CPU haya visto nunca que Se establecieron, perdiendo así interrupciones.
Lea otras preguntas en las etiquetas arm embedded interrupts