Taller opcional 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 bufcirc;
Para inicializar esta variable, se debe llamar a la función RB_init, cuyo
prototipo es el siguiente:
Las funciones para acceder al ring buffer son:
- RB_is_empty(RBuffer *): indica si el buffer está vacío.
- RB_is_full(RBuffer *): indica si el buffer está lleno.
- RB_write(RBuffer *, unsigned char*, int): función de escritura.
- RB_read(RBuffer *, unsigned char *, int): función de lectura.
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álogo 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.