Practico7 , ejercicio 5

Practico7 , ejercicio 5

de Rocio Bernadet Sebben -
Número de respuestas: 4

 Hola, buen día! Estuve viendo este ejercicio y me pareció bastante similar al que se da en openfing en el teorico (adjunto a continuacion), a diferencia de que en este caso hay 4 líneas de entrada y  el bit menos significativo  de  EST_CONT indica si hay un dato. Tengo dos dudas que creo que son lo que hacen distinto al ejercicio con el visto en openfing: 

1) la letra dice: Se debe cumplir que al ingresar un dato (1 byte) por la línea n (0..3) se transmite a la salida el número n (1 byte) y luego el dato ingresado (1 byte).

O sea primero en intEntrada() debería  hacer un out(dirc, indice) (cuando corresponda) y luego a out(direc,dato), o el out(direc, dato) lo hago en intSalida()?

2)El concentrador deberá aceptar los bytes de entrada y guardarlos en un buffer  EN CASO DE QUE EL CANAL DE SALIDA ESTE SIENDO UTILIZADO, hasta un máximo de MAX_BUFFER bytes. En caso de que el buffer esté lleno se descartarán los caracteres recibidos.

En el ejercicio de openfing, los va cargando siempre en el buffer en intEntrada y descarga en intSalida, podría aplicar esto en este ejercicio? o por la condición de arriba seria incorrecto? Dado que tendría que controlar muchas mas cosas en ese caso


Adjunto WhatsApp Image 2021-10-08 at 10.14.48 (3).jpeg
En respuesta a Rocio Bernadet Sebben

Re: Practico7 , ejercicio 5

de Federico Rivero -
Hola!

1) la letra dice: Se debe cumplir que al ingresar un dato (1 byte) por la línea n (0..3) se transmite a la salida el número n (1 byte) y luego el dato ingresado (1 byte).

O sea primero en intEntrada() debería hacer un out(dirc, indice) (cuando corresponda) y luego a out(direc,dato), o el out(direc, dato) lo hago en intSalida()?


La repuesta es 'depende' :). Lo importante a entender es la secuencia de eventos para mandar algo por la salida, uno manda un byte por la línea de salida y eventualmente se llama a la interrupción intSalida() para avisar que el dato se mandó. Pero si no se mandó nada por la salida, la interrupción intSalida() no se va a llamar nunca!  La deducción de eso es que los envíos no pueden estar únicamente en intSalida(), porque en ese caso nunca llegarías a mandar nada.

Entonces, hay que ir recordando si hay un byte siendo envíado o no. Si al recibir algo por intEntrada() no hay ningún byte siendo enviado, lo tenés que mandar en intEntrada() porque intSalida() no se va a invocar. Por el contrario, si en el momento en que recibís algo por intEntrada(), ya hay un byte siendo transferido por la salida, no lo podés enviar ahí, y tenés que esperar a mandarlo en intSalida(), cuando ese byte termine de ser transmitido.

2) El concentrador deberá aceptar los bytes de entrada y guardarlos en un buffer EN CASO DE QUE EL CANAL DE SALIDA ESTE SIENDO UTILIZADO, hasta un máximo de MAX_BUFFER bytes. En caso de que el buffer esté lleno se descartarán los caracteres recibidos.

En el ejercicio de openfing, los va cargando siempre en el buffer en intEntrada y descarga en intSalida, podría aplicar esto en este ejercicio? o por la condición de arriba seria incorrecto? Dado que tendría que controlar muchas mas cosas en ese caso

No sé si entendí bien la pregunta. Lo que sí veo es que en la solución que adjuntás se realizan OUTs tanto en intEntrada() como en intSalida() , por lo cual no me queda claro la distinción que hacés. De todos modos mirando la solución, el ejercicio parece ser muy muy similar, faltaría la parte de mandar el número de puerto por la salida (pensá cómo hacerlo aprovechando el código que tenés.

Saludos!
Federico
En respuesta a Federico Rivero

Re: Practico7 , ejercicio 5

de Rocio Bernadet Sebben -
Muchas gracias profe!! en la pregunta 2 me refería porque dice que se cargan valores en el buffer en caso de que el canal de salida este siendo utilizado, pero en el ejercicio de openfing lo hace siempre independientemente de si se esta utilizando o no, o capaz estoy entendiendo mal la letra. Pero supongo que si puedo ir cargando los valores en el buffer y descargarlos como el ej de teorico.
Saludos!
En respuesta a Rocio Bernadet Sebben

Re: Practico7 , ejercicio 5

de Federico Rivero -
Ah, ahora entendí la pregunta. El ejercicio de teórico es verdad que siemore guarda en el buffer, pero si no se está enviando nada (variable salida_no_mande), saca el dato en la misma función intEntrada(). Eso a efectos prácticos es como no usar el buffer. De todos modos, esa parte de la ketra no pretende poner restricciones al respecto de cómo usar el buffer, sino explicar que en caso de no poder mandar, se deben recordar hasta MAX_BUFFER bytes.

Saludos,
Federico