Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
UTN Facultad Regional Haedo - Ingeniería Electrónica - Informática I Dr. Ing. Pablo Martín Vera 1 Ejercicios Integradores 1) Se desea realizar un sistema para controlar la temperatura de los servidores en un datacenter. Cada uno de los servidores consta de un sensor de temperatura que periódicamente informa la temperatura actual del equipo en grados centígrados. El datacenter cuenta con 32 servidores numerados del 0 al 31 Por el puerto 0x400 (menos significativo) y 0x401 se reciben los siguientes datos F S T5 T4 T3 T2 T1 T0 S4 S3 S2 S1 S0 Donde: S es un entero no signado de 5 bits que indica el número de servidor. T es un número entero no signado de 6 bits que indica la temperatura medida por el sensor para el servidor indicado por el número S. S es el bit de sincronismo. Un dato se considera válido cuando dicho bit pasa de 0 a 1. F se utiliza como marca de fin, este bit se encuentra en 0 durante todo el proceso y si pasa a 1 indica que se debe finalizar el programa. Si en algún caso un servidor supera los 100 grados de temperatura se debe disparar una alarma mandando un byte con todos sus bit en 1 al puerto 0x911. Al finalizar informar: ● Un listado con el promedio de temperaturas leídas en cada servidor ordenado de mayor a menor por promedio (para ordenar utilizar una macro que ordene un vector de punteros). El listado debe mostrarse encolumnado con los títulos correspondientes y mostrar el número de servidor y el promedio de temperatura. ● Mostrar cuantas veces se disparó la alarma en total ● Mostrar los números de servidor que hicieron que se dispara la alarma (si un servidor disparó la alarma más de una vez dicho número de servidor se debe mostrar una sola vez) 2) Un edificio de oficinas cuenta con 31 pisos y desea analizar el uso de los ascensores en horario laboral. El edificio cuenta con 8 ascensores. Cada vez que alguien llama al ascensor de un piso se recibe la información por los puertos 0x400 y 0x401 con el siguiente formato. F P4 P3 P2 P1 P0 S1 S0 A2 A1 A0 0x401 0x400 Donde: A es un número entero no signado de 3 bits que contiene el número de ascensor. P es un número entero no signado de 5 bits que indica el número de piso desde el cual se llama al ascensor. S es un número entero de 2 bits que se utiliza para el sincronismo (cuando los dos bits son iguales llega un nuevo dato). Entre dato y dato vuelve al estado inicial (ambos bits distintos) F se utiliza para determinar el fin del proceso. Inicialmente está en 0 y al pasar en 1 finaliza el lote de información. UTN Facultad Regional Haedo - Ingeniería Electrónica - Informática I Dr. Ing. Pablo Martín Vera 2 Mostrar: a) Un esquema de la cantidad de veces que llamó a cada ascensor de cada piso, mostrando un listado con el siguiente formato incluyendo los títulos (utilizar una matriz): PISO A0 A1 A2 A3 A4 A5 A6 A7 0 xx xx xx xx xx xx xx xx 1 xx xx xx xx xx xx xx xx 2 xx xx xx xx xx xx xx xx . … … … … … … … … . … … … … … … … … 31 xx xx xx xx xx xx xx xx b) Determinar el / los pisos desde el cual /es se llamó mayor cantidad de veces a los ascensores (sin tomar en cuenta planta baja) c) Realizar una macro que reciba por parámetro el número de ascensor y determine la cantidad de pisos desde los cuales nunca fue llamado. d) Utilizar la macro del punto C para mostrar para cada ascensor de cuantos pisos no se lo llamó. e) Hacer una función que retorne un puntero al mayor valor de la matriz (considerar único). f) Utilizar la función del punto E para mostrar el mayor valor de la matriz. 3) Se desea realizar un sistema de monitorización de cámaras de seguridad para un museo. El establecimiento cuenta con 8 salas diferentes, cada una de ellas cuenta con un sensor de movimiento y una cámara. Por defecto el guardia de seguridad visualiza las 8 cámaras en simultáneo pero si alguno de los sensores detecta movimiento se debe mostrar solo esa cámara por 15 segundos y luego volver a la visualización simultánea. El puerto 0x600 recibe información de los sensores de movimiento con el siguiente formato: Sala indica el número de sala donde se detectó el movimiento (de 0 a 7) y S se utiliza para el sincronismo. Un dato es válido cuando ambos bits del número S son iguales. Al detectar un movimiento se debe habilitar por 15 segundos únicamente la cámara de la sala del evento (para simplificar se asume que sólo se detectará movimiento en una sala a la vez). Las cámaras son controladas por el puerto 0x700 donde cada bit habilita (1) o deshabilita (0) la cámara correspondiente, es decir el bit 0 habilita la cámara de la sala 0, el bit 1 de la sala 1 y así sucesivamente. Una vez pasados los 15 segundos debe volver a habilitar todas las cámaras (para dejar el sistema en espera 15 segundos utilizar la función usleep de la biblioteca unistd.h que recibe la cantidad de milisegundos que debe suspender la ejecución). El proceso sigue hasta que el sistema de seguridad sea apagado al comenzar el día. El aviso para apagar el sistema se recibe cuando el bit más significativo del puerto 0x400 pasa de 1 a 0 (tenga en cuenta que este puerto trabaja en forma aislada del puerto de lectura de sensores por lo tanto el sincronismo del otro puerto es irrelevante para el fin del proceso). 0x600 S Sala UTN Facultad Regional Haedo - Ingeniería Electrónica - Informática I Dr. Ing. Pablo Martín Vera 3 Al finalizar el proceso realizar lo siguiente: a. Mostrar un listado con la cantidad de movimientos detectados en cada sala ordenado por cantidad en forma descendente (ordenar mediante una macro utilizando un vector de punteros a la estructura de datos). b. Listar aquellas salas en las que se haya detectado movimiento durante más de un minuto en forma consecutiva. 4) Se desea realizar un programa que permita desde una PC controlar un robot para almacenar y recuperar muestras delicadas en un laboratorio de investigación de bacterias. Las muestras disponibles son 5 y se almacenan en contenedores numerados y organizados en filas y columnas, como se muestra en la figura. El brazo robótico por defecto se posiciona inicialmente en el casillero R que es desde donde se toman las muestras a almacenar y se ponen las recuperadas, luego dispone de dos motores uno que permite desplazarse en forma horizontal y el segundo en forma vertical, ambos pueden moverse solo de un casillero por vez. También dispone de un motor para manejar la pinza que agarra y suelta la muestra. El control de los motores se hace por el puerto 0x400 según el siguiente esquema. Donde los bits P, V, H se deben poner en 1 solo uno a la vez y habitan el motor a utilizar siendo: H el motor para el movimiento horizontal V el motor para el movimiento vertical P el motor para manejar la pinza ABD permite Abrir la pinza, Bajar o Moverse a la Derecha según el motor habilitado CSI permite Cerrar la pinza, Subir o Moverse a la Izquierda según el motor habilitado Se debe realizar el programa en lenguaje C que permita: Mediante una macro ingresar los nombres de las bacterias (máximo de 30 caracteres de largo) que se almacenan en cada uno de los 5 casilleros. Mostrar un menú al usuario que permita recuperar o almacenar una bacteria. Para ello mostrar en pantalla la matriz con los casilleros, mostrando solo los números de aquellos casilleros donde hay bacterias (de entrada están todas pero se pueden ir sacando) y mostrar un menú con las opciones R para recuperar, A para almacenar, S para salir del programa. Luego solicitar el número de casillero en el cual se desea realizar la operación. Si se selecciona un casillero no disponible, por ejemplo, si se quiere recuperar algo que no está o almacenar algo en uno ya ocupado se debe mostrar un mensaje de error. Mover el brazo robótico para posicionarse en el casillero correspondiente y guardar o recuperar la bacteria desde – hacia el casillero R. Al salir del programa mostrar un listado ordenado de mayor a menor, por cantidad de veces que se retiró cada una de las bacterias. Mostrando el nombre de la bacteria, la cantidad de veces que se retiró y el casillero donde se encuentra. Ordenar utilizando un vector de punteros. 5) Una empresa tiene un control de acceso muy restringido a distintas áreas. Para ello se desea implementar un sistema electrónico de apertura de puertas por medio de una tarjeta que solo abre la cerradura electrónica si el usuario puede acceder a dicho sector. La empresa tiene 50 empleados identificados por un número de legajo entero de 7 bits no correlativo. Hay 8 sectores restringidos en la empresa codificados del 0 al 7. Se dispone de un vector con la información de seguridad de los empleados, indicando a qué zonas de la empresa pueden acceder. El vector tiene la siguiente estructura: H S V CS I AB D P UTN Facultad Regional Haedo - Ingeniería Electrónica - Informática I Dr. Ing. Pablo Martín Vera 4 struct empleado { char NombreCompleto [51]; int legajo: int sectores[8]; //contiene un 1 para cada sector habilitado y un 0 si no está habilitado }; Por el puerto 0x400 y 0x401 se recibe el número de legajo del usuario y el número de sector de la puerta que quiere abrir: S es el bit de sincronismo y pasa de 0 a 1 cuando un dato es válido. F estará en 0 inicialmente y al finalizar el día cuando que se cierra la empresa pasa a 1 indicando el fin del proceso. Realizar un programa en C para controlar la apertura de las puertas de los distintos sectores de la empresa: A. Cargar el vector de empleados mediante la función CargaEmpleados, dicha función que ya está desarrollada en una biblioteca propia de la empresa pero no se tiene el código fuente de la misma sino que se dispone del programa objeto llamado permisos.o B. Realizar una función que reciba el vector de empleados, un número de legajo y busque si ese legajo corresponde a un empleado de la empresa. La función debe retornar un puntero a la estructura del empleado o NULL si no lo encuentra. Esta función deberá utilizarse en el punto 3. C. Realizar la rutina de control y apertura de puertas recibiendo los datos de los puertos 0x400 y 0x401 hasta que cierre la empresa. Por cada dato recibido se debe chequear si el empleado tiene permisos de acceso: Sino tiene permisos: el puerto 0x300 controla unas luces que le indican al usuario la cantidad de intentos fallidos consecutivos. Las luces son 3 y están conectadas a los 3 bits menos significativos del puerto. Al fallar una vez debe poner un 1 el bit menos significativo lo que enciende la primera luz, si falla una segunda vez encender la primera y segunda luz y si falla 3 veces debe encender las tres luces y además bloquear al empleado para que no pueda acceder a ninguna otra zona. Si tiene permisos: se debe abrir la cerradura enviando un 1 por el puerto 0x700 poniendo en 1 solo la puerta que se desea abrir, sin modificar el resto de los bits (el bit menos significativo corresponde al sector 0 y así sucesivamente). Si intenta acceder una persona con una tarjeta con un código que no corresponde a ningún empleado de la empresa: se debe disparar una alarma enviando todos los bits en 1 al puerto 0x911. D. Mediante una macro mostrar un listado de los empleados con tarjeta bloqueada y en qué sector se bloqueó. E. Indicar las instrucciones de compilación en el sistema Linux para poder utilizar la función necesaria para el punto 1 6) Se desea realizar un programa que permita desde una PC controlar una pantalla para indicar el número de caja de un banco por el cual debe ingresar el siguiente cliente. Por el puerto 0x400 se recibe un byte con el número de caja desde el cual se presiona el pulsador y los bits de sincronismos tal como se muestra en la figura. 0x400 S S caja F UTN Facultad Regional Haedo - Ingeniería Electrónica - Informática I Dr. Ing. Pablo Martín Vera 5 Hay un máximo de 8 cajas en el banco numeradas del 0 al 7. El bit S es el bit de sincronismo que pasa de 0 a 1 cada vez que un dato es válido. F esta inicialmente en 0 y se pone 1 cuando se cierran las cajas y se debe apagar la pantalla. Cada vez que se recibe un dato válido se debe enviar al display el número de caja que oprimió el pulsador. El display es de 7 segmentos y está controlado por el puerto 0x378 donde cada uno de sus bits controla un segmento (si el bit está en 1 el segmento se enciende, en 0 se apaga) según el siguiente esquema: Al finalizar el día se debe: a) Indicar aquellas cajas que no se abrieron en todo el día b) Mostrar de forma ordenada de mayor a menor el número de caja y la cantidad de clientes que atendió en el día. Para ordenar realizar una macro que ordene un vector de punteros. 7) Cada vez que el bit más significativo del port 0x400 cambia de 0 a 1, se recibe por el port 0x300 un carácter de strings finalizados con ‘\0’. Finaliza con un string = “FIN”. No se sabe cuántos strings llegarán pero no serán más de 20 y cada uno no tendrá más de 10 caracteres. a) Realizar una función a la que se le pasa la dirección de un vector de caracteres, su longitud y un string y devuelve un puntero a la dirección donde se encuentra el string dentro del vector o una dirección 0 (NULL) si no lo encuentra. b) Realizar un programa que los almacene en memoria uno a continuación de otro sin espacios vacíos. c) Utilizando la función del punto a, ingresar un nombre y mostrar la dirección del vector si se encuentra o una indicación si no está 8) Indicar que se muestra en pantalla. Justificar #include <stdio.h> struct bits { char primero: 3; char segundo: 2; unsigned char tercero: 3; }; union unido { struct bits campos; unsigned char completo; }; int main () { union unido junto; junto.completo = 973; printf ("Completo: %d ", junto.completo); printf ("\nPrimero: %d", junto.campos.primero); printf ("\nSegundo: %d", junto.campos.segundo); printf ("\nTercero: %d", junto.campos.tercero); } g f e d c b a 0x378 UTN Facultad Regional Haedo - Ingeniería Electrónica - Informática I Dr. Ing. Pablo Martín Vera 6 9) Indicar que se muestra en pantalla. Justificar #include <stdio.h> struct BITS { int A:5; char B:8; unsigned char C:1; char D:2; }; union UN { struct BITS bit; unsigned int dato; }; int main() { union UN X ; X.A = -12; X.B= X.A >>2; X.C=-1; X.D=-1; printf("\nA=%d B=%d C=%d D=%d", X.bit.A, X.bit.B, X.bit.C , X.bit.D); return 0; } 10) Indicar que se muestra en pantalla. Justificar #include <stdio.h> void func (void); //prototipo void main ( void ) { int A; for (A=0;A<5;A++) func( ); printf("\n Valor = %d" ,A ); } void func(void) { static int A=0; A++; printf("\n Valor = %d" ,A ); }
Compartir