Taller de Sistemas Operativos
Proyecto
Objetivo
Aplicar los conceptos aprendidos en clase para el desarrollo de un
controlador para un dispositivo de caracteres sencillo.
El buffer circular
Un buffer es una región de memoria que se utiliza para almacenar datos.
Generalmente, puede ser accedido indicando la posición del dato que se
intenta leer o escribir. Por ejemplo:
En un buffer circular, sus posiciones extremas son contiguas. Es decir,
el elemento siguiente del último es el primero. (Es conveniente notar la
dificultad de distinguir el primer y último elemento de un buffer circular.)
Cómo utilizar el buffer circular
Primero, se debe declarar la variable de tipo RBuffer que contendrá los datos
a almacenar:
rbuffer_t bufcirc;
Para crear y destruir una instancia del TAD tenemos las funciones:
- rbuffer_t rbuffer_create(unsigned int size)
- void rbuffer_destroy(rbuffer_t buf)
Las funciones proyectoras y modificadoras del ring buffer son:
- bool rbuffer_is_empty(rbuffer_t buf): indica si el buffer está vacío.
- bool rbuffer_is_full(rbuffer_t buf): indica si el buffer está lleno.
- bool rbuffer_insert(rbuffer_t buf, byte data): función de escritura.
- bool rbuffer_remove(rbuffer_t buf, byte *data): función de lectura.
El código está disponible para ser bajado.
Consigna
Implementar un controlador para un dispositivo "fifo" que duerma al proceso
consumidor cuando el buffer esté vacío y lo despierte cuando haya datos
disponibles. Se debe aplicar una política análoga para el productor.
Recomendaciones
- Seguir los lineamientos propuestos en el documento CodingStyle que acompaña
al código del núcleo de Linux.
- Modularizar la implementación del controlador.