Manejo de Periféricos Lenguaje de Programación C Envío y lectura de datos de un puerto de E/S. Operaciones a nivel de bits (máscaras). Manejo de Interrupciones. Envío y lectura de datos de un puerto de E/S Directiva del preprocesador #include <dos.h> Funciones de envío de datos void outport (unsigned portid, unsigned value); void outportb (unsigned portid, unsigned char value); //envío de 2 bytes //envío de 1 byte Funciones de lectura de datos unsigned inport (unsigned portid); unsigned char inportb (unsigned portid); //lectura de 2 bytes //lectura de 1 byte portid: dirección del puerto de E/S 1. Envío y Lectura de datos de un puerto de E/S 1 Operaciones a nivel de bits Máscaras Dada una secuencia de bits, a veces, es necesario leer o modificar el valor de un bit en concreto (o varios bits). Para esta tarea, se utilizan operaciones lógicas adecuadas que toman como primer operando la secuencia de bits y como segundo una secuencia predeterminada, denominada “máscara”. 2. Operaciones a nivel de bits. MASCARAS Ejemplos de máscara Ejemplo 1. Ejemplo 2. Dada una secuencia de 4 bits, Dada una secuencia de 4 bits, forzar el 1er bit a cero, forzar el 2º bit a uno, dejando el resto sin modificar. dejando el resto sin modificar. b3 b2 b1 b0 & (AND) 1 1 1 0 (máscara) b3 b2 b1 0 Para leer el valor de un bit en concreto, se puede usar la operación AND y una máscara con todos sus bits a 0, excepto el bit que ocupa la posicion que quiero leer. b3 b2 b1 b0 | (OR) 0 0 1 0 (máscara) b3 b2 1 b0 Para leer el valor de un bit en concreto, se puede usar la operación OR y una máscara con todos sus bits a 1, excepto el bit que ocupa la posicion que quiero leer. 2. Operaciones a nivel de bits. MASCARAS 2 Manejo de Interrupciones (I) Definir la estructura básica de una función en “C” que trabaja como ISR (Rutina de Servicio de Interrupción). (Paso 1) Instalación de la ISR al iniciar el programa principal: Paso 2: Instalar el puntero a la función, que hará la atención de interrupción, en el vector correspondiente. Paso 3: Habilitar la línea de IRQ correspondiente. Desinstalación de la ISR antes de finalizar el programa principal (Paso 4) #include <dos.h> void interrupt rutina_interrupcion(){ //acciones a realizar } // Paso 1 void main (void){ setvect (num_vector, rutina_interrupcion); // Paso 2 // en este punto se activa la línea de interrupción. Paso 3 // Cuerpo del programa principal setvect (num_vector, 0); // Paso 4 } 3. Manejo de Interrupciones Manejo de Interrupciones (II) Para interceptar una rutina de interrupción ya existente: Paso 1: Declarar un puntero para guardar el vector original. Paso 2: Definir el prototipo de la nueva ISR. Paso 3: Guardar el contenido original del vector. Paso 4: Instalar la nueva ISR. Paso 5: Restaurar el contenido original del vector. Paso 6: En el cuerpo de la función de la nueva ISR invocar a la ISR original. #include <dos.h> void interrupt (*original_isr)(void); void interrupt nueva_isr(void); void main(void){ original_isr = getvect(num_vector); setvect (num_vector, nueva_isr); //Cuerpo del programa principal. setvect (num_vector, original_isr); } // Paso 1 // Paso 2 // Paso 3 // Paso 4 // Paso 5 3. Manejo de Interrupciones 3 Manejo de Interrupciones (III) void interrupt nueva_isr(){ //Cuerpo de la nueva ISR. original_isr(); } // Paso 6 nueva_isr(){ …. original_isr(); Num_vector *nueva_isr ….. } original_isr(){ Tabla vectores Interrupción …. } 3. Manejo de Interrupciones 4