Cargar el buffer (E/S e interrupciones)

Cargar el buffer (E/S e interrupciones)

de Alejandro Barreiro Deminco -
Número de respuestas: 3
Una pregunta, en el Práctico 8 de Interrupciones EJ 5 pedían que al ingresar un dato, hay que guardar primero la linea de donde proviene el dato (1 byte) y luego el dato (1 byte)

En general lo que hago utilizando un buffer es
buffer[pcarga] = (IN(DATOS_n) << 8 ) | 0x0n

siendo n la linea

es correcto hacerlo de esta manera?

Una segunda manera que se me ocurre seria
buffer[pcarga] = 0x0n;
pcarga = (pcarga+1)%LAR_BUF;
buffer[pcarga] = IN(DATOS_n);
pcarga = (pcarga+1)%LAR_BUF;

Gracias, Saludos 
En respuesta a Alejandro Barreiro Deminco

Re: Cargar el buffer (E/S e interrupciones)

de Federico Rivero -
Hola!

Con ambas soluciones se puede resolver el problema. Hay que tener en cuenta que para el primer caso, el arreglo buffer debe ser de 16 bits, y en el segundo de 8. De todos modos, la correctitud de la solución depende obviamente de cómo utilices esa información guardada.

Saludos,
Federico
En respuesta a Federico Rivero

Re: Cargar el buffer (E/S e interrupciones)

de Alejandro Barreiro Deminco -

Hola, 

Con respecto a eso ultimo que me dijiste que la correctitud de la solución depende de como use esa información guardada tenia la siguiente duda:

Use un buffer de 2 bytes (short int buffer[LAR_BUFFER])

Y en general guarde los datos asi:

buffer[pcarga] = (IN(DATOS_n) << 8 ) | 0x0n

Osea en el byte mas significativo el dato y en el byte menos significativo el numero de linea

El problema pide "Al ingresar un dato (1 byte) por la línea n (0..3) se trasmite a la salida el numero n (1 byte) y luego el dato ingresado (1 byte)."


Queria saber si esta es la forma correcta de hacer eso:
char nro = buffer[pdescarga] & 0x00FF;
char dato = buffer[pdescarga] & 0xFF00;
OUT(DATO_S, nro);
OUT(DATO_S, dato);

Sobre todo la duda es si la mascara que hice se asigna de forma correcta a la variable char de 1 byte. Y si no como podria ser?


Gracias!!

En respuesta a Alejandro Barreiro Deminco

Re: Cargar el buffer (E/S e interrupciones)

de Federico Rivero -

Hay un problemita con esas asignaciones y es el siguiente: El char como bien sabés ocupa 8 bits, y las variables que estás utilizando a la derecha son de 16 bits. C te permite hacer esto, pero luego achica el resultado, guardando únicamente los últimos 8 bits. Para el primera caso funciona bien, porque los gbits que querés conservar son los últimos 8. Para el segundo caso, a la variable dato se le asignará el valor 0. Deberías hacer un shift a la derecha de 8 lugares para que la asignación sea correcta:

char dato = (buffer[pdescarga] & 0xFF00) >> 8;

Saludos!