Está en la página 1de 8

Programacin Concurrente

Master de Computacin
Universidad de Cantabria.

Documento:

Driver AnalogIO

Alumno: Gerardo Miguel


Santander, octubre, 2008

AnalogIO Driver
El objetivo de este trabajo es disear un driver que facilite el uso de una tarjeta de
entrada y salida analgica con 8 lneas analgicas de entrada y 4 lneas analgicas de
salida, por aplicaciones concurrentes, as como el diseo de las aplicaciones
concurrentes que hacen uso de ellas.
La tarjeta AnalogIOCard.
La tarjeta AnalogIOCard permite leer el estado de 8 lneas analgicas de entrada (se
numeran de 0 a 7), y as mismo establecer la tensin de las 4 lneas analgicas de salida
(se numeran de 0 a 3). Los conversores A/D y D/A son de 12 bits de resolucin,
bipolares y su rango de operacin es de -10V a +10 V. A la tarjeta se accede a travs de
cuatro registros de 16 bits:

16
bits

Status
bits 0-2

16
bits

16
bits

16
bits

DataIn

Control

DataOut
bits 8-9

bits 0-2

bit 15

A/D
(12 bits, -10-+10V)

bit 3
Reg 0

Reg 1

Reg 2

Reg 3

D/A

D/A

D/A

D/A

AnalogIOCard

vAD0 vAD1 vAD2 vAD3 vAD4 vAD5 vAD6 vAD7

vDA0

vDA1

vDA2

vDA3

DataIn: Registro de slo lectura, que permite leer la salida de los convertidores A/D.
Slo sus 12 bits menos significativos son relevantes. La relacin que existe entre
el valor que se lee en el registro D, y la tensin analgica de la lnea que mide
vAD, es,

v + 10

4096
D = floor AD
20

DataOut: Registro de slo escritura, que permite establecer la salida de los


convertidores D/A. Slo los 12 bits menos significativos son relevantes. La
relacin que existe entre el valor que se escribe en el registro D y la tensin que
se establece en la salida del convertidor D/A vDA, es,

vDA = 10 +

20
D
4096

Status: Registro de slo lectura que permite conocer el estatus de los convertidores
A/D. El significado del valor que se lee est definido bit a bit:
Bit 15: Done. Cuando este nit toma el valor 1, significa que la convertsin A/D
se ha realizado, y en consecuencia el valor del registro DataIn es vlido. Cuando

se ordena realizar una conversin A/D (con el bit de Control), este bit se pone a
cero durante el tiempo de conversin. Durante ese tiempo el valor que se puede
leer en DataIn no es vlido.
Bits 0-2: Representan el cdigo binario de la lnea analgica cuya conversin se
ha realizado, y cuyo valor puede leerse en DataIn. La informacin de estos bits
solo son relevantes si el bit 15 es 1.
Control: Registro de slo escritura que permite controlar la operacin de los
conversores A/D y D/A. El significado del valor que se escribe est definido bit
a bit:
Bits 0-2 (A/D Select): Representan el cdigo binario que define la lnea de
entrada que se desea lee en la prxima conversin A/D.
Bit 3 (Star): La transicin de 0 a 1 de esta lnea representa el inicio de una
conversin A/D sobre la lnea que define el estado de los bits 0-2. Cuando se
inicia la conversin el bits 15 de Status pasa a ser 0, y cuando la conversin
finaliza vuelve a tomar el valor 1.
Bit 8-9 (D/A Select): Definen la lnea de salida que se establecerse por el D/A
cuando se escribe sobre el registro DataOut.
Los mtodos de acceso a estos registros se definen en la interfaz AnalogIOCard, que se
muestra en el siguiente diagrama de clases:

Interfaz AnalogIOCard: Define los mtodos de acceso a los registro de la tarjeta de


entrada/salida analgica.
Mtodos:
public status():long => Retorna en los 16 bits menos significativos del valor
long, el valor del registro Status.
public dataIn():long => Retorna en los 16 bits menos significativos del valor
long, el valor del registro DataIn donde se pueden leer el resultado de las
conversiones A/D.
public control(controlData:long) => Permite establecer los bits del registro
Control de la tarjeta, a travs de los 16 bits menos significativos del
parametri controlData que es de tipo long.
public dataOut(code:long) => Transfiere al buffer de entrada del conversor que
se haya seleccionado (bits 8-9 del registro Control) los 12 bits menos
significativos del parmetro code que es de tipo long.
public void addInterruptListener(AnalogIOListener listener) => Registra el
objeto listener a su lista de usuarios. Para que el objeto pueda ser
registrado debe implementar la interfaz AnalogIOListener, la cual le
exige que tenga definida la operacin newChange(). Cada vez que

cambia una de las lneas de entrada el objeto AnalogIOCard invoca


sobre cada listener registrado en l como usuario, la operacin
newChange().
En el siguiente diagrama de secuencias se muestra el proceso que debe seguir el driver
para leer un valor analgico de la tarjeta analogIOCard

En el siguiente diagrama de secuencia se muestra el proceso que debe seguir el driver


para establecer un valor analgico en una lnea analgica de salida de la tarjeta
AnalogIOCard.

Clase AnalogIOGUI: Representa una clase que implementa la interfaz AnalogIOCard


y que simula una tarjeta de IO analgica para ser utilizadas en este trabajo.
Cuando se crea un objeto de esta clase, se crea una ventana que permite al
operador visualizar el valor de las lneas analgicas de entrada y salida, y que
permite establecer el valor de las lneas de entrada utilizando el ratn.
Constructor AnalogIOGUI() => Constructor que crea una ventana que permite
controlar la tarjeta de IO analgica simulada.

La implementacin que se proporciona de esta clase permite establecer las tensiones de


entrada a travs de los deslizadores de la zona de la izquierda, y visualizar los valores de
salida mediante los correspondientes elementos de escala de la zona de la derecha.
Driver AnalogIODriver
El driver AnalogIODriver que se disea tiene el objeto de facilitar a futuras aplicaciones
concurrentes el acceso seguro a la tarjeta de IO analgica, esto es, leer a travs de ella
las entradas analgicas y establecer las salidas analgicas.
Class AnalogIODriver: Implementa la funcionalidad que se desea obtener para el
driver. Hay que considerar que el driver puede ser accedido por diferentes threads
clientes que se ejecutan concurrentemente, y las operaciones de IO analgicas deben ser
seguras y no interferir entre ellas.

Mtodos:
readInputLine(line:int):float => Retorna el valor en voltios que est establecida en
la lnea analgica de entrada que se especifica con el parmetro line.
setOutputLine(line:int,value:float) => Establece la tensin en voltios expresada por
el parmetro value en la lnea analgica de salida especificada con el parmetro
line.
readOutputLine(line:int):float => Retorna el valor en voltios que tiene establecida
la lnea analgica de salida especificada por el parmetro line.
awaitLower(line:int,threshold:float) => Mtodo bloqueante que suspende el thread
que lo invoca hasta que la tensin en la lnea analgica de entrada que se
especifica con el parmetro line, sea inferior al valor especificado por el
parmetro threshold .
awaitHigher(line:int,threshold:float) => Mtodo bloqueante que suspende el thread
que lo invoca hasta que la tensin en la lnea analgica de entrada que se

especifica con el parmetro line, sea superior al valor especificado por el


parmetro threshold .
generate(line:int,period:float, waveform:Vector<float>) => Mtodo no bloqueante
que inicia la generacin de la forma de onda que se especifica en el parmetro
waveform, en la lnea analgica de salida que se especifica por el parmetro line,
con el tiempo de periodo que se especifica en el parmetro period. La forma de
onda se especifica como un Vector de N valores analgicos expresador en
voltios.
waveform N 5
(0)
(1)
(2)
(3)
(4)

2.0

0.0
0.5
1.0
1,5
2.0

1.0

0.0
period/N
period

Las diferente operaciones lanzan la excepcin OutOfRangeException, si al parmetro


line se le pasa un valor fuera del rango 0..31.
Implementacion base que se suministra
En el proyecto Eclipse AnalogIOBase.zip se proporciona una versin inicial del
driver AnalogIODriver que se va a ir completando en las sucesivas prcticas.
Caracterstica de esta implementacin son:
Algunos de los mtodos tienen una implementacin inicial que slo estn
pensados para ser utilizados desde una aplicacin secuencial.
Otros mtodos tales como awaitHigher(), awaitLower() y generate(), no est
implementados.
A fin de mostrar la operatividad de este primer prototipo, se proporciona la aplicacin
cliente PruebaAnalogIOSecuencial, que tiene la siguiente funcionalidad:
Crea una instancia de AnalogIOGUI y de AnalogIODriver.
Hace que las lneas de salidas se establezcan a las tensiones -5V, 0V, +5V y
10 V.
Cuando se pasa el threshold de 5 V. de mayor a menor en la lnea de entrada
analgica 0, se muestra en la consola el estado actual de todas las entradas.

Trabajo a realizar:
Fase I: Revisin de las operaciones implementadas para su uso desde una
aplicacin concurrente.
Analizar la implementacin de los mtodos readInputLine(), setOutputLine() y
readOutputLine() e introducir los elementos de sincronizacin adecuados para que
puedan ser invocados concurrentemente de forma segura.

Fase II: Implementacin del metodo generate().


Se requiere que se implemente el mtodo generate() utilizando un thread especfico por
cada invocacin del mtodo.
Crear en AnalogIODriver un array de WaveFormGenerator que denominamos
generators, y que referencia los objetos que controla el estado de cada una de las 4 lnea
de salida. Cada elemento del array controla la forma de onda que se genera en la salida
de igual ndice, de acuerdo con el siguiente criterio:
Si un elemento no referencia ningn objeto (null en el array) la salida debe
permanecer fija en el ltimo valor que se ha establecido en ella.
Si referencia un objeto WaveFormGenerator generar la forma de onda que se
haya pasado al objeto en su creacin.
Para ejecutar esta fase, modificar el cdigo de la clase AnalogIODriver que se entrega,
de acuerdo con el diseo mostrado en el siguiente diagrama de clases:

- Declarar el array generators: WaveFormGenerator.


- Escribir el cdigo de la clase interna WaveFormGenerator.
- Escribir el cdigo Java de los mtodos setOutputLine() y generate().
Para comprobar el diseo realizado, implementar una aplicacin cliente que genere en
las cuatro salidas las siguientes formas de ondas:
Salida analgica 0: Debe establecerse a +5 V.
Salida analgica 1: Genera una seal sinusoidal con 32 puntos de 8V de amplitud y
2 segundos de periodo.
Salida analgica 2: Genera una seal en forma de diente de sierra creciente de -8 V
a +8V con 64 puntos y 4 segundos de periodo.
Salida analgica 3: Debe establecerse a -5 V fija.

Cuando pase 30 segundos las cuatro seales deben establecerse a 0, y finalizar la


aplicacin.
Fase III: Implementacin de los mtodos awaitHigher() y awaitLower utilizando
las seales de interrupcin generadas por AnalogIOCard.
En esta fase debe implementarse las funciones awaitLower() y awaitHigher(), de forma
que mltiples threads concurrentes puedan suspenderse en cada uno de mtodos
esperando a diferentes tensiones de thresold.
En el diseo de estos mtodos debe utilizarse el lock del objeto AnalogIODriver como
mecanismo de suspensin de los thread que invocan cualquiera de los mtodos que se
implementan.
La implementacin debe basarse en las interrupciones que genera la AnalogIOCard
sobre los elementos que se han declarado como listener.
Para verificar la implementacin realizada, disear un programa que cree 8 threads
concurrentes que se queden suspendidos en el driver de acuerdo con los siguientes
criterios:
Thread 1 quedan a la espera de que la entrada 0 superen el valor -2.5 V.
Thread 2 quedan a la espera de que la entrada 0 superen el valor + 2.5 V.
Thread 3 quedan a la espera de que la entrada 0 supere el valor + 5 V.
Thread 4 quedan a la espera de que la entrada 0 supere el valor +7.5V.
Thread 5 quedan a la espera de que la entrada 1 quede por debajo de 2.5V.
Thread 6 quedan a la espera de que la entrada 1 quede por debajo de -2.5V.
Thread 7 quedan a la espera de que la entrada 1 quede por debajo de -5.0V.
Thread 8 quedan a la espera de que la entrada 1 quede por debajo de -7.5.
Cada cliente debe anunciar por consola cuando queda a la espera de una condicin, y as
mismo anuncia cuando queda liberado por el driver al cumplirse la condicin esperada.

También podría gustarte