Editando
C12 - Interrupts
(sección)
Ir a la navegación
Ir a la búsqueda
Advertencia:
no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si
inicias sesión
o
creas una cuenta
, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.
Comprobación antispam. ¡
No
rellenes esto!
= Interrupt Concepts = <br> <b>Definición</b> *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 <b>Interrupt Setup ritual</b> *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. <b>5 condiciones que han de ser true para que una interrupción sea generada</b> *Device arm *NVIC enable *Global enable *Prioridad de la itnerrupción actual ha de ser superior al nivel actual *Hardware event trigger <b>Context Switch</b><br> *Es el proceso de cambiar del main program a la rutina de la interrupción *Pasos que ocurren cuando se pasa del main program a la 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 <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 **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> *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> *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 <math> > </math>tiempo cada cuanto se ejecuta <math>\Rightarrow</math> es un problema <br> 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 <br> 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 <br>
Resumen:
Ten en cuenta que todas las contribuciones a Proyectos se consideran publicadas bajo la Creative Commons Atribución-CompartirIgual (véase
Proyectos:Derechos de autor
para más información). Si no deseas que las modifiquen sin limitaciones y las distribuyan libremente, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre.
¡No uses textos con copyright sin permiso!
Cancelar
Ayuda de edición
(se abre en una ventana nueva)
Menú de navegación
Herramientas personales
No has accedido
Discusión
Contribuciones
Crear una cuenta
Acceder
Espacios de nombres
Página
Discusión
español
Vistas
Leer
Editar
Ver historial
Más
Buscar
Navegación
Página principal
Cambios recientes
Página aleatoria
Ayuda sobre MediaWiki
Páginas especiales
Herramientas
Lo que enlaza aquí
Cambios relacionados
Información de la página