Informática Industrial (II) 3º Ingeniería Técnica Industrial (Especialidad en Electrónica). E. U. Politécnica. Universidad de Sevilla. 3-mayo Práctica STR2: Entorno de desarrollo para un SOTR (Sistema Operativo de Tiempo Real). Autor: Claudio Amaya Rodríguez. Esta práctica introduce las características del Embedded Visual C++ (EVC++ 4.0), el entorno de desarrollo que usaremos para el sistema operativo Windows CE.Net. Un segundo objetivo es mostrar cómo funcionan los mecanismos básicos para crear y controlar varios hilos de ejecución (threads) en un sistema multitarea. Qué se explicará en el laboratorio: Instalación y funcionamiento del software necesario para realizar aplicaciones con EVC++ 4.0: o El entorno de desarrollo. o Los SDKs (Software Development Kits). o Descarga y prueba de programas. Estructura básica de un programa de aplicación. Control de tiempos: la función Sleep. Threads y funciones de control de threads. Contenido: 1. Qué hay que hacer? Desarrollo de la práctica... 1 2. P.2: Cómo emitir un pitido por el altavoz del PC... 2 Cómo funciona el altavoz de un PC... 2 3. P.3: Cómo usar las funciones de tiempo de Windows CE.... 4 4. P.4: Cómo crear y usar hilos de ejecución (threads) en Windows CE.... 4 Apéndice A. Registros internos del timer 8254... 5 1. Qué hay que hacer? Desarrollo de la práctica. Para realizar la práctica hay que completar los siguientes pasos: P.1. Instalar y probar el software de EVC++. P.2. Realizar un programa que lea una frecuencia por teclado y emita un pitido por el altavoz del PC a esa frecuencia. La frecuencia de entrada puede tener un valor entre 100 y 20000 (Hz). Cualquier valor fuera de este rango hace que el altavoz del PC se apague. P.3. Modificar el programa anterior para que pida un segundo parámetro: el número de pitidos (entre 1 y 10). Una vez leído, dará el número de pitidos a la frecuencia indicada. Cada pitido durará ¼ de segundo. La separación entre dos pitidos consecutivos es de 1 segundo. P.4. Modificar el programa anterior para que pueda pedir los siguientes parámetros sin dejar de pitar. 1
2. P.1: Instalando Embedded Visual C++ 4.0. Qué software se necesita para usar Embedded Visual C++ 4.2? El software se debe instalar en el siguiente orden: embedded Visual C++ 4.0. Pasos para descargarlo (son 229.551 KB): o ir a http://www.microsoft.com/downloads o Introducir en el campo KeyWords la cadena embedded Visual C++ 4.0 y pulsar el boton Go. o Pulsar el enlace titulado embedded Visual C++ 4.0 El número de clave aparece al final de la página. Es TRT7H-KD36T-FRH8D- 6QH8P-VFJHQ. embedded Visual C++ 4.0 SP3 (Service Pack 3). Pasos para descargarlo (son 59.126 KB): o ir a http://www.microsoft.com/downloads o Introducir en el campo KeyWords la cadena embedded Visual C++ 4.0 SP3 y pulsar el boton Go. o Pulsar el enlace titulado embedded Visual C++ 4.0 SP3. Instalar al menos un Software Development Kit (SDK). El que vamos a usar en prácticas se puede descargar desde icaro.eii.us.es. o Otros SDKs populares se pueden descargar desde http://msdn.microsoft.com/mobility/downloads/sdks/default.aspx. Cómo comprobar que la instalación ha sido correcta? Para comprobar que se ha instalado correctamente el software debemos comprobar: Que funcionan las comunicaciones y la ejecución remota en una máquina target emulada. Que funciona la ejecución en una maquina target real (en el laboratorio:pendiente de la instalación del laboratorio). 3. P.2: Cómo emitir un pitido por el altavoz del PC. Los pasos para hacer el programa del punto P.2. son los siguientes: 1.- Pedir por consola la frecuencia, en hertzios, del pitido. 2.- Si se da un 0, apagar el altavoz. 3.- Si se da un número entre 100 y 20.000: 4.- Encender el altavoz con un pitido a la frecuencia dada. 5.- Volver al paso 1. Algunas funciones útiles: o printf Imprime texto por pantalla. o scanf Lee datos por consola. o OutPortB(unsigned int NroPuerto, unsigned char Dato) Escribe Dato en el puerto de E/S indicado en NroPuerto. o unsigned char InPortB(unsigned int NroPuerto) Lee el dato del puerto de E/S indicado en NroPuerto. Cómo funciona el altavoz de un PC El hardware del altavoz de un PC tiene el siguiente esquema: 2
Fig. 1. El altavoz puede recibir una señal cuadrada (secuencia de 0 s y 1 s) de dos fuentes diferentes. Estas fuentes se seleccionan mediante un multiplexor controlado por el bit 1 del puerto 0x61. Cuando se selecciona la fuente 0, la señal entregada al altavoz es el valor instantáneo del bit 0 del puerto 0x61. Variando con rapidez el valor de este bit podemos conseguir un tren de ondas cuadradas que excite al altavoz. Sin embargo este sistema requiere de mucha atención por parte de la CPU, así que usaremos la fuente 1. Al seleccionarla, la señal entregada al altavoz proviene de la salida del contador 2 del integrado 8254 del PC. Programando convenientemente este contador podemos generar un tren de pulsos cuadrados de la frecuencia que queramos, y de forma que no requiera de la CPU para la generación. El 8254 tiene una base de tiempos consistente en un reloj de exactamente 1193180 Hz. Cada uno de los contadores tiene un registro de 16 bits. Cuando se quiere usar un contador, se le da un valor escribiendo en ese registro. En cada tick de reloj del 8254 cada contador se decrementa en 1. Cuando llega a 0, se realiza una acción que depende de la configuración que tenga cada contador. Dicha acción puede ser la activación de una interrupción o el cambio de estado de una línea. En nuestro caso nos interesará que la salida del contador sea una onda cuadrada, con lo que usaremos el modo 3 de operación (ver apéndices). La frecuencia que se oirá en el altavoz será 1193180 / valor_inicial_contador. Para encender el altavoz habrá que poner a 1 los bits 0 y 1 del registro 0x61 que controla el multiplexor de la figura. En ese momento, el altavoz reproduce la señal cuadrada que hubiera en la salida 2 del contador. Por tanto, antes de activar el multiplexor deberemos poner un dato válido en dicho contador. Para apagar el altavoz, pondremos a 0 los bits 0 y 1 del puerto 0x61. NOTA: sólo debemos modificar los bits 0 y 1 del puerto 0x61. El resto de bits de este puerto no deben modificarse. Para reproducir, en el altavoz del PC, un pitido a una frecuencia dada, se tiene que seguir los siguientes pasos: Calcular ValorInicialContador a partir de la frecuencia requerida. Escribir en el puerto 0x61 de forma que seleccionemos la entrada 1 del multiplexor de la figura anterior. Escribir en el registro de control del timer (0x43) con la palabra de control del canal 2 (0xb6). El significado de esta palabra es el siguiente: 3
o Programamos el canal 2. o La cuenta inicial (16 bits) se hace en dos escrituras de 8 bits. Primero el byte menos significativo (LSB), después el más (MSB). o Modo 3: genera una onda cuadrada con un periodo igual al número de ciclos que se cargue en la cuenta inicial. o Cuenta binaria. Cargar la cuenta inicial en el registros de datos del canal 2 del timer (0x42). Primero se carga la parte baja del número de 16 bits, y después la parte alta. A partir de la segunda escritura, el timer comenzará a funcionar. Para apagar el altavoz: Escribir en el puerto 0x61 de forma que se pongan a 0 los dos primeros bits (bit 0 y 1). 4. P.3: Cómo usar las funciones de tiempo de Windows CE. Las modificaciones más importantes en el programa anterior, P.2, para conseguir el programa P.3 tienen que ver con cómo realizar tiempos de espera en Windows CE. Es necesario esperar intervalos de ¼ de segundo, y de ¾ de segundo. La forma más fácil de hacerlo es usando la función Sleep: void Sleep(DWORD dwmilliseconds ); Sleep suspende la ejecución del programa durante el número de milisegundos especificado en dwmilliseconds. 5. P.4: Cómo crear y usar hilos de ejecución (threads) en Windows CE. La forma más fácil de que podamos pitar al mismo tiempo que leemos de la consola es dividiendo la ejecución de nuestro programa en dos threads o hilos de ejecución. Cada thread se ejecuta simultáneamente en el computador, de forma que cada uno de ellos se encargará en exclusiva de realizar las operaciones que necesitamos: 1.- Leer de la consola. 2.- Pitar. Los pasos para hacer el programa del punto P.4. pueden ser los siguientes: Thread1.1.- Pedir por consola la frecuencia, en hertzios, del pitido, y el número de pitidos. Thread1.2.- Si se da un 0, le decimos a Thread2 que apague el altavoz. Thread1.3. - Si se da un número entre 100 y 20.000: Thread1.4.- Creamos el Thread2 y le pasamos la frecuencia a la que tiene que pitar y el número de pitidos. Thread1.5.- Volver al paso Thread1.1. Qué pasos tiene que dar el Thread2? Las funciones más importantes para crear y manejar un thread son: CreateThread o La función inicial del thread. TerminateThread. SuspendeThread. ResumeThread. Todos los threads de un mismo programa pueden compartir variables globales, pero no locales. 4
Apéndice A. Registros internos del timer 8254. 8253/8254 PIT - Programmable Interval Timer Port 40h, 8253 Counter 0 Time of Day Clock (normally mode 3) Port 41h, 8253 Counter 1 RAM Refresh Counter (normally mode 2) Port 42h, 8253 Counter 2 Cassette and Speaker Functions Port 43h, 8253 Mode Control Register, data format: 7 6 5 4 3 2 1 0 Mode Control Register +---- 0=16 binary counter, 1=4 decade BCD counter +-+-+----- counter mode bits +-+---------- read/write/latch format bits +-+------------- counter select bits (also 8254 read back command) 76 Counter Select 00 select counter 0 01 select counter 1 10 select counter 2 11 read back command (8254 only, illegal on 8253, see below) 54 Read/Write/Latch Format 00 latch present counter value 01 read/write of MSB only 10 read/write of LSB only 11 read/write LSB, followed by write of MSB 321 Counter Mode 5