Sistemas informáticos en tiempo real Práctica 3 Manejo de interrupciones Objetivo • Aprender a utilizar las facilidades proporcionadas por el S.O. para manejar las interrupciones de teclado y timer. Práctica El objetivo de esta práctica será construir un contador de 2 dígitos que se mostrará en pantalla y cuya velocidad será programable, de forma que en el momento inicial se actualizará con un periodo de un segundo. Sin embargo cada vez que se pulse la tecla “+“ se incrementará el período en 0,1 segundo, mientras que si se pulsa la tecla “–“ se decrementará el período en 0,1 segundo. Para salir del programa se pulsará la tecla “e”. Además el contador tendrá las siguientes teclas de control: Tecla “i”: inicio del contador Tecla “s”: parada del contador Tecla “c”: continúa desde la parada Tecla “e”: salida del programa Indicaciones • • • • • Se utilizarán las rutinas Callback del Kernel ETS. Este programa será una ampliación de la práctica anterior donde se aprendió a utilizar la rutina callback de interrupción de teclado. La rutina Callback del timer se llama cada 10ms por defecto. La estructura ETS_TIMER_EVENT_RECORD la utilizamos si lo creemos necesario ya que el kernel ETS no escribe nada en ella. Debemos ser nosotros quien la escribamos si lo deseamos así. Nosotros también podemos tener nuestras propias variables globales para escribir lo que deseemos cuando se produzca esta interrupción, lo que se recomienda para esta práctica. Respecto a la pantalla, para conseguir que en cada escritura se reescriban los valores anteriores, podéis utilizar la función printf("\b") que mueve el cursor una posición a la izquierda. Si lo hacemos dos veces antes de cada escritura sobreescribiremos los valores anteriores. La manera de como escribir directamente en la memoria de vídeo lo dejaremos para posteriores prácticas. Sistemas informáticos en tiempo real Práctica 4 Manejo de interrupciones Objetivo • • Aprender a utilizar las facilidades proporcionadas por el S.O. para manejar las interrupciones de teclado y timer. Aprender la manera de hacer llamadas indirectas a funciones utilizando punteros. Práctica El objetivo de esta práctica será realizar un pequeño gestor de temporizaciones. Funcionará de forma que se podrá solicitar una temporización en numero de "tics" del sistema y nos avisará a la función que le indiquemos una vez se haya cumplido este tiempo. Cuando se solicite un tiempo determinado se realizará llamando a la función: delay_time(parametro1,parametro2); donde parámetro1 será la función a la que se llame una vez se haya cumplido esta temporización y parámetro2 será el número de tics que deben pasar antes de llamar a la función del parámetro1. Indicaciones • • • • • La rutina Callback del timer se llamará cada vez que se produzca una interrupción del timer que se produce a una frecuencia fija. Cada vez que se produce la interrupción tendremos un tic. Se tratará de contar cuantas veces se entra en esta interrupción. Se recomienda declarar dos matrices globales donde se guarden las temporizaciones solicitadas y la función a la que se debe llamar. Cada vez que se produzca una interrupción se decrementarán los tics almacenados hasta que alguno llegue a cero, entonces se hará una llamada a la función correspondiente. Una vez que se ha retornado de esta función se debe quitar de la lista para que no se vuelva a llamar. Para comprobar el gestor de temporizaciones se realizará un programa que solicite desde teclado, o bien desde la propia aplicación, varias temporizaciones, mostrando en pantalla un mensaje cuando se haya cumplido esta temporización. Téngase en cuenta que el programa no debe finalizar, por lo que lo constará de un bucle infinito, para aquellos que introduzcan el valor de la temporización desde el propio código, o finalizar tecleando una tecla concreta para los que hayan optado por recoger las temporizaciones desde el teclado. Se aconseja realizar primero el programa fijando el valor de la temporización desde el propio código y posteriormente introduciendo el valor de temporización desde el teclado si se desea completar el programa. El siguiente párrafo muestra como se utilizan las referencias indirectas a funciones en C. Es decir como llamar a una función no por el nombre sino por su dirección: Llamadas a funciones utilizando punteros a funciones (1 de 3) Llamadas a funciones utilizando punteros a funciones (2 de 3) Llamadas a funciones utilizando punteros a funciones (3 de 3)