Logo Studenta

Integradores 2P

¡Estudia con miles de materiales!

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 ); 
}

Continuar navegando

Materiales relacionados