Logo Studenta

Ejercicio_10_MACROS_PUNTERO

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

// Ejercicio 10 de puertos CON MACROS y PUNTEROS
#include <stdio.h>
#include<stdlib.h>
#include "sim10.c" 
//#include<sys/io.h>
#define N 8
#define PUERTO 0x400
#define LeePort(Y) Y=inb(PUERTO); // macro para leer del puerto
/*#define LISTAR(VP,TAM) \
 { int i; \
			 printf("Molinete\t Personas\n"); \
 				for(i=0;i<TAM;i++) \
 				 printf("%d\t\t%d\n",i, *(VP + i)); \
 }*/
 
 
 
#define LISTAR(VP,TAM) \
 { int i; \
 int *P;\
			 printf("Molinete\t Personas\n"); \
 				for(P=VP,i=0; i<TAM ; P++,i++) \
 				 printf("%d\t\t%d\n",i,*P); \
 }
//void Listar(int[], int); //Función para mostrar la información de los molinetes.
struct CB
{
 unsigned int S:1;
 unsigned int M:3;
 unsigned int :3;
 unsigned int F:1;
}; //Esta estructura es la del byte que se recibe en el PUERTO.
union Un
{
 struct CB dato;
 unsigned char byte; //Se genera este byte para guardar lo leído en el puerto y luego se analizan la información por separado.
};
int main()
{
 union Un U;
 int personas[8]={0};
 int fin=0;
 
 ioperm(PUERTO,1,1);
 while(!fin)
 {
 do
 {
 //U.byte=inb(PUERTO);
 LeePort(U.byte)
 }while( U.dato.S==0);
 
 if(U.dato.F==1)
 fin=1;
 else
 {
 personas[U.dato.M]++;
 
 do
 {
		//U.byte=inb(PUERTO);
	 LeePort(U.byte)	
	}while(U.dato.S==1); /*Se espera a que el bit de sincronismo pase a cero (0) nuevamente. Sino, se analiza el mismo dato más de una vez, 
	 como si una persona pasara muchas veces , en vez de una vez:			 S=0 No hay datos.
			 S=1 Nuevo dato.
			 S=0 Cambio de bit de sincronismo.
			 S=1 Nuevo dato.
			 */
 }
 }
 LISTAR(personas,N) // invocacion de la MACRO
 //Listar(personas,N); // llamada a funcion
 ioperm(PUERTO,1,0);
 
 //Fin del programa.
	printf("\n\n\n\t\t FIN DEL PROGRAMA.\n\n");
	system("pause"); // Esto no va en Linux.
	return 0;
}
////////////////////////////////////////////////////////////////////////////
/*void Listar(int VP[], int TAM)
{
 int i;
 printf("Molinete\t Personas\n");
 
 for(i=0;i<TAM;i++)
 { 
 printf("%d\t\t%d\n",i,VP[i]);
 } 
}*/