Diferencia entre revisiones de «C12 - Interrupts»
Ir a la navegación
Ir a la búsqueda
| Línea 29: | Línea 29: | ||
<b>Context Switch</b><br> | <b>Context Switch</b><br> | ||
*Es el proceso de cambiar del main program a la rutina de la interrupción | *Es el proceso de cambiar del main program a la rutina de la interrupción | ||
*Que pasa cuando ocurre una interrupción? | |||
*1.- Acaba la instrucción que está procesando | **1.- Acaba la instrucción que está procesando | ||
*2.- Se suspende la ejecución del programa main | **2.- Se suspende la ejecución del programa main | ||
**Guarda en la posición en en la que se ha quedado | ***Guarda en la posición en en la que se ha quedado | ||
**Se guarda R0, R1, R2, R3, R12, R14 (LR), R25 (PC) y PSR y se hace un push a la pila | ***Se guarda R0, R1, R2, R3, R12, R14 (LR), R25 (PC) y PSR y se hace un push a la pila | ||
*3.- Se pone un "special code" en el LR (Link Register) LR = 0xFFFFFFF9 <math>\Leftarrow</math> | **3.- Se pone un "special code" en el LR (Link Register) LR = 0xFFFFFFF9 <math>\Leftarrow</math> Este patrón indica que estamos ejecutando una ISR | ||
*4.- En el registro IPSR se guarda el número de la interrupción | **4.- En el registro IPSR se guarda el número de la interrupción | ||
*5.- En PC se carga la dirección de la ISR. La dirección de la ISR se llama <b>vector</b> | **5.- En PC se carga la dirección de la ISR. La dirección de la ISR se llama <b>vector</b> | ||
<b>Volver del ISR al main thread</b><br> | <b>Volver del ISR al main thread</b><br> | ||
Al final del | *Al final del Interrupt Service Routine hay la instrucción BXLR | ||
*Ésta hace un pop de la pila (donde había guardado el estado de ejecución del main thread) | |||
<b>Good Practices</b><br> | <b>Good Practices</b><br> | ||
*Acknowledge - Acordarse de siempre hacer un clear del trigger flag | *Acknowledge - Acordarse de siempre hacer un clear del trigger flag | ||
*Hacer que la interrupción sea lo más corta posible para asegurarnos que se pueda dar servicio a todas las interrupciones | *Hacer que la interrupción sea lo más corta posible para asegurarnos que se pueda dar servicio a todas las interrupciones | ||
*No deben haber delay loops | *No deben haber delay loops | ||
*Hay que tener en cuenta cada | *Hay que tener en cuenta cada cuanto se ejecuta una interrupción y el tiempo que le lleva. Si el tiempo que le lleva es <math> > </math>tiempo cada cuanto se ejecuta <math>\Rightarrow</math> es un problema | ||
<br> | <br> | ||
Las interrupciones son mas apropiadas que otros sistemas de sincronización | Las interrupciones son mas apropiadas que otros sistemas de sincronización | ||
| Línea 57: | Línea 58: | ||
**Cuando se diseña una interrupción es importante saber que device activó el flag de trigger y hacer clear de ese flag | **Cuando se diseña una interrupción es importante saber que device activó el flag de trigger y hacer clear de ese flag | ||
<br> | <br> | ||
= Inter-thread Communication and Synchronization = | = Inter-thread Communication and Synchronization = | ||
<br> | <br> | ||
<br> | <br> | ||
Revisión del 15:15 7 abr 2015
Interrupt Concepts
Definición
- Es cuando se suspende temporalmente la ejecución del programa para ejecutar una subrutina
- Cuando acaba la interrupción se vuelve a reanudar la ejecución donde se habia quedado
- La interrupción se "dispara" (trigger) a través de una acción del hardware
Interrupt Setup ritual
- Arm/Disarm
- Arm - Permite al hardware hacer trigger a la interrupción
- Disarm - Deshabilita la función de trigger
- Cada interrupción tiene un bit de arm/disarm
- Enable NVIC (Nested Vectored Interrupt Controller)
- Es un módulo que controla todas las interrupciones. Se activa el NVIC específico para el device que usaremos
- Para deshabilitar hacemos un set al bit PRIMASK
- En C hay las funciones EnableInterrupts() y Disable Interrupts() para activar/desactivar las interrupciones
- Global enable bit I
- Este bit se activa haciendo un clear. Este bit activa y desactiva todas las interrupciones
- Si el bit es 1 muchas de las interrupciones no están permitidas, estan disable
- Priority
- No se si se refiere a la prioridad del device al thread principal o a que puede haber varias devices por interrupción y cada una tiene una prioridad
- El registro BASEPRI controla la prioridad de las interrupciones
- Trigger - Es un evento asincrono. Es el encargado de activar el device que activa la interrupción. En el registro RIS hay un bit que nos indica que ha habido un trigger.
5 condiciones que han de ser true para que una interrupción sea generada
- Device arm
- NVIC enable
- Global enable
- Prioridad de la itnerrupción actual ha de ser superior al nivel actual
- Hardware event trigger
Context Switch
- Es el proceso de cambiar del main program a la rutina de la interrupción
- Que pasa cuando ocurre una interrupción?
- 1.- Acaba la instrucción que está procesando
- 2.- Se suspende la ejecución del programa main
- Guarda en la posición en en la que se ha quedado
- Se guarda R0, R1, R2, R3, R12, R14 (LR), R25 (PC) y PSR y se hace un push a la pila
- 3.- Se pone un "special code" en el LR (Link Register) LR = 0xFFFFFFF9 Este patrón indica que estamos ejecutando una ISR
- 4.- En el registro IPSR se guarda el número de la interrupción
- 5.- En PC se carga la dirección de la ISR. La dirección de la ISR se llama vector
Volver del ISR al main thread
- Al final del Interrupt Service Routine hay la instrucción BXLR
- Ésta hace un pop de la pila (donde había guardado el estado de ejecución del main thread)
Good Practices
- Acknowledge - Acordarse de siempre hacer un clear del trigger flag
- Hacer que la interrupción sea lo más corta posible para asegurarnos que se pueda dar servicio a todas las interrupciones
- No deben haber delay loops
- Hay que tener en cuenta cada cuanto se ejecuta una interrupción y el tiempo que le lleva. Si el tiempo que le lleva es tiempo cada cuanto se ejecuta es un problema
Las interrupciones son mas apropiadas que otros sistemas de sincronización
- Cuando el tiempo en que ocurre el evento es variable y la estructura I/O es compleja
- Cuando los diferentes devices tienen diferentes velocidades de sincronización
- Cuando es necesario desarrollar un sistema de real-time
- Cuando tiene que ver con eventos importantes del sistema
Aspectos esenciales que debe tener el µC para usar interrupciones
- La interrupción debe tener una conexión separada al procesador para cada device
- El µC debe poder determinar de que device vino la interrupción
- El µC tiene que poder hacer acknowledge (poder hacer clear al flag de trigger)
- Cuando se diseña una interrupción es importante saber que device activó el flag de trigger y hacer clear de ese flag
Inter-thread Communication and Synchronization