/*------------------------------------------------------------------- ** ** Soluciones del examen de Programación de Sistemas y Dispositivos ** Curso 2024-25, Primera Convocatoria, 20 de diciembre de 2024 ** **-----------------------------------------------------------------*/ /*------------------------------------------------------------------- ** Ejercicio 1 **-----------------------------------------------------------------*/ a, válida b, inválida c, inválida d, válida /*------------------------------------------------------------------- ** Ejercicio 2 **-----------------------------------------------------------------*/ Para que pueda generar interrupciones debe conectarse al puerto G Podría conectarse a PG5 o a PG4 (no existe ningún dispositivo conectado al interfaz IDE) En caso de usar el PG5: PG5 = EINT5, EXINT5 = a flanco de bajada PCONG = 0xFDFF; PUPG = 0x10; EXTINT = 0x22200220; En caso de usar el PG4: PG4 = EINT4, EXINT4 = a flanco de bajada PCONG = 0xF7FF; PUPG = 0x20; EXTINT = 0x22020220; /*------------------------------------------------------------------- ** Ejercicio 3 **-----------------------------------------------------------------*/ ULCON0 = (0 << 6) | (5 << 3) | (0 << 2) | (3); // normal (no infrarojos), paridad par, 1 bit de stop, 8 bits de datos UBRDIV0 = 416; // 9600 baudios asumiendo 64MHz /*------------------------------------------------------------------- ** Ejercicio 4 **-----------------------------------------------------------------*/ INTMSK |= BIT_TIMER0; // Enmascara la interrupción por fin del timer TCON &= ~(1<<0); // Stop timer /*------------------------------------------------------------------- ** Ejercicio 5 **-----------------------------------------------------------------*/ 300 ms /*------------------------------------------------------------------- ** Ejercicio 6 **-----------------------------------------------------------------*/ 170.65625 /*------------------------------------------------------------------- ** Ejercicio 7 **-----------------------------------------------------------------*/ create_task( Task, 100 ); timer0_open_ms( scheduler, 1, TIMER_INTERVAL ); /*------------------------------------------------------------------- ** Ejercicio 8 **-----------------------------------------------------------------*/ OS_EVENT *semaforo; /* Declara el semáforo */ void main( void ) { ... semaforo = OSMutexCreate( 1 ); /* Crea el semaforo mutex */ ... } void Task1( void *id ) { INT8U err; OSMutexPend( semaforo, 0, &err ); counterGlobal++; OSMutexPost( semaforo ); OSTimeDly( 5 ); } void Task2( void *id ) { INT8U err; OSMutexPend( uart0Sem, 0, &err ); counterGlobal++; OSMutexPost( uart0Sem ); OSTimeDly( 5 ); } /*------------------------------------------------------------------- ** Ejercicio 9 **-----------------------------------------------------------------*/ #include #include #include #include void isr_timer0( void ) __attribute__ ((interrupt ("IRQ"))); volatile uint8 n, b; void segs_putchar_dimming( uint8 number, uint8 brightness ) { if( brightness ) { n = number; b = brightness; timer0_open_tick( isr_timer0, 5000 ); } else { timer0_close(); segs_off(); } } void isr_timer0( void ) { static uint8 slot = 99; if( ++slot > 99 ) { slot = 0; segs_putchar( n ); } else if( slot >= b ) segs_off(); I_ISPC = BIT_TIMER0; }