Ejercicio 8 de la guía 5.
Registros de la impresora con interfaz para comunicarme.
Si no hay tinta, escribe en LOC_CTRL el valor LOW_INK
Justificar si usar polling o interrupciones. No race conditions. Impresiones bloqueantes.
ACLARACION: HP_LOW_INK_INT solo responde cuando no hay tinta. Además, la interrupción puede ser una falsa alarma.
ACLARACIÓN 2: Se suele devolver en el write por convención la cantidad de bytes leidos.
int contador = 5;
bool hayTinta;
char* tinta;
void terminar_impresion() {
imprimir.signal();
}
void aviso_no_tintal() {
char* status;
IN(LOC_CTRL, status);
contador--;
if (contador == 0) {
tinta_sem.signal();
} else if (status == PRINTING) {
tinta_sem.signal();
contador = 5;
hayTinta = true;
} else {
OUT(LOC_CTRL, START);
}
int driver_init() {
request_irq(HP_FINISH_INT, terminar_impresion);
request_irq(HP_LOW_INK_INT, termino_chequeo);
// FALTA COMPLETAR: Lo sube en la solución del campus.
}
int driver_write(void* buffer, size_t size) {
char* texto;
copy_from_user(texto, data, size);
OUT(LOC_TEXT_POINTER, texto);
OUT(LOC_TEXT_SIZE, len(text));
OUT(LOC_CTRL, START);
IN(LOC_CTRL, TINTA);
if (tinta == LOW_INK) {
tinta_sem.wait();
}
if (hayTinta) {
imprimir.wait();
}
// FALTA INCLUIR SEMAFOROS PARA EVITAR CONCURRENCIA
}
int driver_remove() {
// FALTA TERMINAR
}
Ejercicio de parcial en el campus.
Primero, planteamos el sensor de temperatura, que se puede pensar con tres secciones: operaciones, registros, interrupciones.