Lección 10: Excepciones - Sistemas Empotrados - PDF
Document Details
Uploaded by ReceptiveAlliteration540
Jesús González Peñalver
Tags
Summary
This document provides an overview of exceptions and interrupts in embedded systems. It covers topics such as exception handling, interrupt handling, and different types of exceptions.
Full Transcript
Sistemas Empotrados Tema 4: Excepciones e interrupciones Lección 10: Excepciones Jesús González Peñalver Contenidos Tema 4: Excepciones e interrupciones Excepciones Introducción Gestión de excepciones Tipos de excepciones I...
Sistemas Empotrados Tema 4: Excepciones e interrupciones Lección 10: Excepciones Jesús González Peñalver Contenidos Tema 4: Excepciones e interrupciones Excepciones Introducción Gestión de excepciones Tipos de excepciones Interrupciones Introducción Regiones críticas Gestión de interrupciones no anidadas Gestión de interrupciones anidadas Gestión de interrupciones mediante un VIC Ejemplos Concepto de excepción Definición: Cualquier evento que causa la detención del flujo normal de ejecución de instrucciones de un programa Pueden suponer un cambio del modo de ejecución a un modo privilegiado Clasificación: Condiciones de error: Recuperable o no recuperable Instrucciones no definidas: Puede que no sean errores realmente (Ej.: FP en software) Data o prefetch aborts: Puede que la dirección esté fuera del mapa de memoria o que la dirección no sea accesible por el proceso (MPU) o que haya un fallo de página (MMU) Interrupciones: Interrumpen la aplicación para prestar un servicio Llamadas a sistema: Atienden peticiones de servicio de la aplicación Interrupciones: Atienden peticiones de servicio de los dispositivos Excepciones y modos de ejecución asociados Excepciones Reset Data abort FIQ IRQ Prefetch abort Software interrupt Undefined instruction Undef IRQ FIQ Abort SVC Modos de ejecución User y Registros y modos de ejecución System r0 r1 Cada modo dispone de un banco de registros propio que sustituye a parte de los registros del modo User r2 r3 De este modo se agilizan los cambios de contexto, sobre r4 todo en el caso de las Fast Interrupts r5 r6 sp: stack pointer r7 FIQ lr: link register r8 r8_fiq pc: program counter r9 r9_fiq cpsr: current program status register r10 r10_fiq spsr: saved program status register r11 r11_fiq r12 r12_fiq IRQ Supervisor Undefined Abort sp r13 r13_fiq r13_irq r13_svc r13_undef r13_abt lr r14 r14_fiq r14_irq r14_svc r14_undef r14_abt pc r15 cpsr spsr_fiq spsr_irq spsr_svc spsr_undef spsr_abt Los registros de estado (CPSR y SPSR) 31 28 7 4 0 N Z C V Reservados en ARMv4T I F T Mode Flags de condición Solo lectura Máscaras de interrupción Se pueden modificar en N = Resultado Negativo en la ALU I = 1, deshabilita las IRQ los modos Z = El resultado de la ALU es Zero F = 1, deshabilita las FIQ privilegiados C = Se ha producido aCarreo en la ALU V = Se ha producido oVerflow en la ALU Bits de modo Se pueden Modo de ejecución Solo lectura modificar en 10000 : User los modos T = 0, procesador en estado ARM 10001 : FIQ privilegiados T = 1, procesador en estado Thumb 10010 : IRQ 10011 : Supervisor Cualquier valor diferente 10111 : Abort Bits reservados No se deben modificar provocará 11011 : Undefined resultados Se leen como cero 11111 : System impredecibles La tabla de vectores Tabla de vectores Cada vector es una instrucción ejecutable, normalmente un salto al 0x00000000 Reset manejador correspondiente 0x00000004 Undefined instruction 0x00000008 Software interrupt 0x0000000C Prefetch abort El vector de las FIQ se ha situado el último para poder comenzar 0x00000010 Data abort directamente en la dirección 0x0000001C su manejador. 0x00000014 Reserved Esto, junto con que el modo FIQ tiene 0x00000018 IRQ más registros replicados, agiliza el cambio de contexto, lo que minimiza 0x0000001C FIQ la latencia de las FIQ Ejemplo de mapa de memoria con manejadores de excepción 0xffffffff Accesible mediante un salto global usando un literal pool _undef_handler 0x30008000 Accesible con los _swi_handler mecanismos rotación para 0x30000000 generar constantes de la ALU > 32 MB 0x20000000 Accesible con un salto local _irq_handler 0x00002000 0x00001000 < 4 kB Literal pool con la dirección 0x00000ffc 0x30008000 del undef handler _start 0x00000114 _fiq_handler El manejador de las FIQ sigue Fast interrupt 0x0000001c la tabla de vectores Interrupt 0x00000018 b _irq_handler Reserved 0x00000014 b. Data abort 0x00000010 b. Manejadores no Prefetch abort 0x0000000c b. implementados Software interrupt 0x00000008 mov pc, #0x30000000 Undefined instruction 0x00000004 ldr pc, [pc, #0xff0] Reset 0x00000000 b _start Salto al cargador Prioridades de las excepciones Excepciones Prioridades Bit I Bit F Reset 1 + 1 1 Data Abort 2 1 – Fast Interrupt Request 3 1 1 Interrupt Request 4 1 – Prefetch Abort 5 1 – Software Interrupt 6 1 – Undefined Instruction 6 – 1 – Las interrupciones software y las excepciones por una 1: Deshabilita instrucción no definida tienen la misma prioridad, ya que no pueden ocurrir simultáneamente –: No afecta Contenidos Tema 4: Excepciones e interrupciones Excepciones Introducción Gestión de excepciones Tipos de excepciones Interrupciones Introducción Regiones críticas Gestión de interrupciones no anidadas Gestión de interrupciones anidadas Gestión de interrupciones mediante un VIC Ejemplos Gestión de excepciones Registros en uso Registros en uso en el modo User en el modo FIQ r0 Servicio de la excepción r0 r1 r1 El procesador... r2 r2 1. Mapea el banco de registros apropiado según el r3 r3 nuevo modo r4 r4 2. Copia CPSR en SPSR_mode r5 r5 3. Modifica CPSR según el nuevo modo de ejecución r6 r6 4. Si estaba en estado Thumb (16 bits) pasa a estado r7 r7 ARM (32 bits) r8 r8_fiq 5. Deshabilita las IRQ y las FIQ (según el nuevo r9 modo) r9_fiq r10 r10_fiq 6. Almacena la dirección de retorno en LR_mode r11 r11_fiq 7. Fija PC a la dirección del vector correspondiente al r12 nuevo modo r12_fiq sp r13 r13_fiq sp lr r14 r14_fiq lr pc r15 r15 pc cpsr cpsr spsr_fiq Gestión de excepciones Registros en uso Registros en uso en el modo User en el modo FIQ r0 Servicio de la excepción r0 r1 r1 El procesador... r2 r2 1. Mapea el banco de registros apropiado según el r3 r3 nuevo modo r4 r4 2. Copia CPSR en SPSR_mode r5 r5 3. Modifica CPSR según el nuevo modo de ejecución r6 r6 4. Si estaba en estado Thumb (16 bits) pasa a estado r7 r7 ARM (32 bits) r8 r8_fiq 5. Deshabilita las IRQ y las FIQ (según el nuevo r9 modo) r9_fiq r10 r10_fiq 6. Almacena la dirección de retorno en LR_mode r11 r11_fiq 7. Fija PC a la dirección del vector correspondiente al r12 nuevo modo r12_fiq sp r13 r13_fiq sp lr r14 r14_fiq lr pc r15 r15 pc cpsr cpsr spsr_fiq Gestión de excepciones Registros en uso Registros en uso en el modo User en el modo FIQ r0 Servicio de la excepción r0 r1 r1 El procesador... r2 r2 1. Mapea el banco de registros apropiado según el r3 r3 nuevo modo r4 r4 2. Copia CPSR en SPSR_mode r5 r5 3. Modifica CPSR según el nuevo modo de ejecución r6 r6 4. Si estaba en estado Thumb (16 bits) pasa a estado r7 r7 ARM (32 bits) r8 r8_fiq 5. Deshabilita las IRQ y las FIQ (según el nuevo r9 modo) r9_fiq r10 r10_fiq 6. Almacena la dirección de retorno en LR_mode r11 r11_fiq 7. Fija PC a la dirección del vector correspondiente al r12 nuevo modo r12_fiq sp r13 r13_fiq sp lr r14 r14_fiq lr pc r15 r15 pc 10001 NZ C V Reservados en ARMv4T I F T Mode cpsr cpsr spsr_fiq Gestión de excepciones Registros en uso Registros en uso en el modo User en el modo FIQ r0 Servicio de la excepción r0 r1 r1 El procesador... r2 r2 1. Mapea el banco de registros apropiado según el r3 r3 nuevo modo r4 r4 2. Copia CPSR en SPSR_mode r5 r5 3. Modifica CPSR según el nuevo modo de ejecución r6 r6 4. Si estaba en estado Thumb (16 bits) pasa a estado r7 r7 ARM (32 bits) r8 r8_fiq 5. Deshabilita las IRQ y las FIQ (según el nuevo r9 modo) r9_fiq r10 r10_fiq 6. Almacena la dirección de retorno en LR_mode r11 r11_fiq 7. Fija PC a la dirección del vector correspondiente al r12 nuevo modo r12_fiq sp r13 r13_fiq sp lr r14 r14_fiq lr pc r15 r15 pc 0 10001 NZ C V Reservados en ARMv4T I F T Mode cpsr cpsr spsr_fiq Gestión de excepciones Registros en uso Registros en uso en el modo User en el modo FIQ r0 Servicio de la excepción r0 r1 r1 El procesador... r2 r2 1. Mapea el banco de registros apropiado según el r3 r3 nuevo modo r4 r4 2. Copia CPSR en SPSR_mode r5 r5 3. Modifica CPSR según el nuevo modo de ejecución r6 r6 4. Si estaba en estado Thumb (16 bits) pasa a estado r7 r7 ARM (32 bits) r8 r8_fiq 5. Deshabilita las IRQ y las FIQ (según el nuevo r9 modo) r9_fiq r10 r10_fiq 6. Almacena la dirección de retorno en LR_mode r11 r11_fiq 7. Fija PC a la dirección del vector correspondiente al r12 nuevo modo r12_fiq sp r13 r13_fiq sp lr r14 r14_fiq lr pc r15 r15 pc 1 1 0 10001 NZ C V Reservados en ARMv4T I F T Mode cpsr cpsr spsr_fiq Gestión de excepciones Registros en uso Registros en uso en el modo User en el modo FIQ r0 Servicio de la excepción r0 r1 r1 El procesador... r2 r2 1. Mapea el banco de registros apropiado según el r3 r3 nuevo modo r4 r4 2. Copia CPSR en SPSR_mode r5 r5 3. Modifica CPSR según el nuevo modo de ejecución r6 r6 4. Si estaba en estado Thumb (16 bits) pasa a estado r7 r7 ARM (32 bits) r8 r8_fiq 5. Deshabilita las IRQ y las FIQ (según el nuevo r9 modo) r9_fiq r10 r10_fiq 6. Almacena la dirección de retorno en LR_mode r11 r11_fiq 7. Fija PC a la dirección del vector correspondiente al r12 nuevo modo r12_fiq sp r13 r13_fiq sp lr r14 r14_fiq lr pc r15 r15 pc 1 1 0 10001 NZ C V Reservados en ARMv4T I F T Mode cpsr cpsr spsr_fiq Gestión de excepciones Registros en uso Registros en uso en el modo User en el modo FIQ r0 Servicio de la excepción r0 r1 r1 El procesador... r2 r2 1. Mapea el banco de registros apropiado según el r3 r3 nuevo modo r4 r4 2. Copia CPSR en SPSR_mode r5 r5 3. Modifica CPSR según el nuevo modo de ejecución r6 r6 4. Si estaba en estado Thumb (16 bits) pasa a estado r7 r7 ARM (32 bits) r8 r8_fiq 5. Deshabilita las IRQ y las FIQ (según el nuevo r9 modo) r9_fiq r10 r10_fiq 6. Almacena la dirección de retorno en LR_mode r11 r11_fiq 7. Fija PC a la dirección del vector correspondiente al r12 nuevo modo r12_fiq sp r13 r13_fiq sp lr r14 r14_fiq lr pc r15 0x0000001C pc 1 1 0 10001 NZ C V Reservados en ARMv4T I F T Mode cpsr cpsr spsr_fiq La tabla de manejadores de excepción (crt0.s) _start: @ Manejadores por defecto b _setup_vectors _soft_reset_handler: b. _undef_handler: @ Tabla de vectores que se copiará a la RAM b..globl _vector_table _swi_handler: _vector_table: b. ldr pc, [pc, #24] @ Soft reset _pabt_handler: ldr pc, [pc, #24] @ Undefined b. ldr pc, [pc, #24] @ SWI _dabt_handler: Se debe usar una ldr pc, [pc, #24] @ Prefetch abort b. dirección relativa. ldr pc, [pc, #24] @ Data abort _irq_handler: Todavía no hemos nop @ Reserved b. ldr pc, [pc, #24] @ IRQ _fiq_handler: remapeado la ldr pc, [pc, #24] @ FIQ b. memoria @ Copiamos las tablas de vectores y de @ Tabla de direcciones absolutas de manejadores @ manejadores al principio de la RAM.word _soft_reset_handler.globl _setup_vectors.word _undef_handler _setup_vectors:.word _swi_handler sub r8, pc, #(8+.-_vector_table).word _pabt_handler ldr r9, =_ram_base_boot.word _dabt_handler ldmia r8!, {r0-r7} Definida nop stmia r9!, {r0-r7} por el.word _irq_handler ldmia r8!, {r0-r7}.word _fiq_handler stmia r9!, {r0-r7} linker La tabla de vectores es una tabla de saltos globales a las direcciones de los manejadores Las tablas de vectores y manejadores deben copiarse al principio de la RAM antes de remapear La tabla de manejadores de excepción (crt0.s) Linker script MEMORY { ram : org = 0x00000000, len = 0x00040000 flash : org = 0x01000000, len = 0x00100000 } SECTIONS {.startup : {... } > flash.vectors : {. += 0x20 ; Reservamos espacio para la tabla de _excep_handlers =. ; vectores y la tabla de manejadores. += 0x20 ; } > ram _ram_base_boot = 0x00300000 ; Dirección de inicio de la RAM antes del remapeo.text : {... } > ram AT > flash _text_flash_start = LOADADDR(.text);.rodata : {... } > flash.data : {... } > ram AT > flash _data_flash_start = LOADADDR(.data);.bss : {... } > ram _ram_limit = ORIGIN(ram) + LENGTH(ram); _stack_size = 0x800;.stack _ram_limit - _stack_size : {... } } Acceso a la tabla de manejadores de excepción Tipos de excepción typedef enum { Prototipo para los manejadores excep_reset = 0, excep_undef, typedef void (* excep_handler_t) (void); excep_swi, excep_pabt, excep_dabt, excep_rsv, excep_irq, Tabla de manejadores excep_fiq, extern volatile excep_handler_t _excep_handlers[excep_max]; excep_max } excep_t; Fijar un manejador inline void excep_set_handler (excep_t excep, excep_handler_t handler) { _excep_handlers[excep] = handler; } Obtener un manejador inline excep_handler_t excep_get_handler (excep_t excep) { return _excep_handlers[excep]; } La dirección de retorno del manejador de una excepción Petición de la IRQ: Servicio de la IRQ: Se permite que acaben Cambio de modo, todas las etapas del cauce PC = 0x0018 LR = 0x800c LR = LR – 4 Dirección Operación 0x8000 add F D E Código de 0x8004 sub F D IRQ linkret adjust la aplicación 0x8008 mov F D 0x800c ldr F 0x0018 B (a 0xaf00) F D E Tabla de 0x001c – F D vectores 0x0020 – F 0xaf00 stmfd F D E Manejador 0xaf04 mov F D 0xaf08 ldr F Las excepciones son tratadas en el procesador como saltos con enlace (BL) Problema: Según el tipo de excepción, puede que el contenido de LR no apunte a la instrucción correcta Ejemplo: En este caso, LR apunta a la instrucción mov, en vez de a la instrucción sub Solución: El manejador deberá corregir el registro LR para que se pueda retornar a la instrucción correcta Ajuste de la dirección de retorno de la excepción Excepción Dirección Uso Reset – No definido tras un reset Apunta a la instrucción que causó la Data Abort LR – 8 excepción Fast Interrupt Request LR – 4 Dirección de retorno de la FIQ Interrupt Request LR – 4 Dirección de retorno de la IRQ Apunta a la instrucción que causó la Prefetch Abort LR – 4 excepción Apunta a la siguiente instrucción tras la Software Interrupt LR instrucción SWI Apunta a la siguiente instrucción tras la Undefined Instruction LR instrucción no definida Retorno del manejador de una excepción Antes de retornar, el manejador debe... Cambiar al modo de ejecución previo a la excepción (copiar SPSR_mode en CPSR) Mover a PC la dirección de retorno (obtenida a partir de LR_mode) Posibilidades: Corregimos el valor de LR Salvamos el contexto en la pila _irq_handler: _irq_handler: _irq_handler: sub lr, lr, #4 sub lr, lr, #4 …... stmfd sp!, {r0-r3, lr} subs pc, lr, #4... … movs pc, lr … ldmfd sp!, {r0-r3, pc}^ Retornamos cambiando de modo (copia de SPSR_irq en CPSR) Recuperamos el contexto de la pila Retorno del manejador de una excepción en C (GNU) El compilador puede realizar los ajustes anteriores por nosotros Sólo hay que indicar, al declarar la función, que se trata de un manejador de excepciones, junto con el tipo de excepción __attribute__ ((interrupt (""))) void my_handler (void) { } El valor de indica el tipo de excepción. Posibilidades: IRQ, FIQ, SWI, ABORT y UNDEF Contenidos Tema 4: Excepciones e interrupciones Excepciones Introducción Gestión de excepciones Tipos de excepciones Interrupciones Introducción Regiones críticas Gestión de interrupciones no anidadas Gestión de interrupciones anidadas Gestión de interrupciones mediante un VIC Ejemplos Reset Encendido del sistema Cargador Modo SVC, PC ← 0 _start:... Tabla de vectores 0x00000000 b _start Reset 0x00000004 Undefined instruction 0x00000008 Software interrupt 0x0000000C Prefetch abort 0x00000010 Data abort 0x00000014 Reserved 0x00000018 IRQ 0x0000001C FIQ Instrucción no definida Posibilidades Se captan 32 bits de memoria que no codifican una instrucción válida La instrucción es para un coprocesador que no está presente o no responde (ej. FP) Utilidad Permite usar instrucciones máquina en nuestro programa que puede que no estén soportadas en nuestro procesador Si no existe un coprocesador para ejecutar estas instrucciones de forma eficiente, el manejador de la excepción llamará a una subrutina que lo hará mediante software Ejemplo: Soporte de instrucciones FP sin FPU El compilador genera instrucciones para la FPU cuando encuentra operaciones FP Si el sistema cuenta con FPU, la ejecución será muy eficiente Si no, se generará una excepción, y el manejador llamará a una función que calculará el resultado correcto El programa funcionará correctamente, aunque no haya FPU, solo que la ejecución será más lenta Ejemplo: Nos inventamos la instrucción memset Fija un búfer a un valor determinado Sólo usamos operandos en registro para simplificar el ejemplo Sintaxis memset{} rd, rn, rm rd: Puntero al búffer, rn: tamaño del búfer, rm: valor Ejemplo de uso Manejador adr r4, buffer ; puntero al búfer undef_handler: ldr r5, =256 ; tamaño del búfer ldr r6, = 0 ; valor inicial stmfd sp!, {r0-r12,lr} ; salvamos el contexto mrs r0, spsr ; r0