¿Cuál es la diferencia entre el cambio de contexto y el manejo de interrupciones?

Soy un desarrollador integrado. No he trabajado con RTOS/linux. Estaba revisando los conceptos de RTOS cuando me topé con el 'cambio de contexto'. Entiendo que cuando ocurre un cambio de contexto, todos los registros junto con PC (Contador de programa) se guardan en la pila antes de que se cargue otro subproceso en el procesador. ¿No sucede algo similar cuando ocurre una interrupción (en un controlador que no usa ningún tipo de sistema operativo)?

¿Qué tan diferentes son esos dos términos?

AFAIK, en la mayoría de los microcontroladores, el contexto se guarda cuando ocurre una interrupción en el hardware, mientras que el contexto se guarda en un RTOS en el software.
Es posible que un controlador de interrupciones no necesite guardar todo el estado del subproceso (tiene relativamente poco trabajo por hacer). Algunas ISA proporcionan registros en la sombra/banqueados (MIPS/ARM) para evitar la sobrecarga de guardar/restaurar o guardar automáticamente una cantidad limitada de estado (que es comparable a tener registros en la sombra/en bancos). (Por cierto, la extensión específica de la aplicación MIPS MultiThreading extiende los conjuntos de registros de sombra (31 GPR) en contextos de subprocesos). [Demasiado breve para una respuesta, pero una respuesta rápida].
cada contexto generalmente tiene su propia pila asignada, por lo que es más rápido cambiar a ellos que tener que guardar todos los valores de registro en la pila antes de cambiar y sacarlos después. Los controladores de interrupción en un microcontrolador a menudo tienen que hacer esto manualmente en el código, pero si usa un RTOS en el microcontrolador como uCOS-II/III de Jean C Labrosse, cada tarea/contexto tiene su propia pila y 'contexto'.
@ PaulA.Clayton, ¿puede elaborar su respuesta? No tengo idea de cómo se ejecuta un hilo, solo una comprensión de nivel superior. aunque gracias

Respuestas (2)

No hay una diferencia fundamental, es más una cuestión de grado: la cantidad de contexto que debe guardarse.

Cuando se produce un cambio de contexto de subproceso RTOS, se debe guardar todo el estado de la CPU que podría usar cualquier subproceso. Esto generalmente incluye todos los registros de la CPU, incluidos los registros de bandera o de estado, de modo que cuando se restauran, el subproceso se reanuda como si nada hubiera pasado.

Cuando ocurre una interrupción, todavía hay un cambio de contexto, pero solo se debe guardar el contexto que el controlador de interrupciones realmente necesita usar y luego restaurarlo. Si escribe su controlador de interrupciones en un lenguaje de alto nivel, esto será más o menos equivalente a un cambio de contexto de subproceso completo, porque no hay restricciones sobre qué recursos podría tocar dicho controlador de interrupciones. Sin embargo, si escribe su controlador de interrupciones en lenguaje ensamblador, puede realizar un seguimiento de exactamente qué registros toca y guardar solo esos. Esto permite que la ejecución del controlador de interrupciones sea extremadamente rápida, reduciendo su impacto en el resto del sistema y/o permitiéndole manejar interrupciones a una velocidad más alta.

Incluso cuando un controlador de interrupción está escrito en un lenguaje de alto nivel, si el controlador no llama a ningún código externo que el compilador no "conozca", el compilador puede generar un código de guardar/restaurar registro que ignora los registros que no son utilizados por el propio controlador de interrupciones. Dado que la naturaleza misma de un cambio de contexto "completo" es permitir la ejecución de código arbitrario, debe guardar/restaurar todos los registros, ya sea que el compilador sepa o no algo que realmente los use.

Tanto las interrupciones como los cambios de contexto son interrupciones. La principal diferencia está en lo que sucede después de la interrupción o el cambio de contexto.

Con una interrupción, el estado actual (o contexto) se almacena en un área temporal (generalmente, pero no siempre, la pila). El ISR luego hace lo suyo, y luego se restaura el estado y regresa la rutina de interrupción. Lo crucial aquí es que el ISR regresa exactamente donde lo dejó en el mismo hilo .

Un cambio de contexto parece una interrupción. El estado se almacena en la pila como de costumbre. Sin embargo, la ubicación de esa pila y cualquier información de estado adicional se almacena en otro lugar (en el subproceso ). A continuación, se sustituye un nuevo conjunto de datos de otro subproceso con los datos actuales y vuelve el ISR. Aquí, sin embargo, el ISR no regresa a donde lo dejó, sino que regresa a donde se interrumpió el subproceso recién cambiado la última vez que se produjo un cambio de contexto mientras se estaba ejecutando.

Es este cambio de ubicación y datos de retorno lo que, además de cuál puede ser el contenido de la ISR, distingue a una ISR de un cambio de contexto.