PDF de programación - Procesamiento multitarea (primera parte)

Imágen de pdf Procesamiento multitarea (primera parte)

Procesamiento multitarea (primera parte)gráfica de visualizaciones

Actualizado el 21 de Marzo del 2018 (Publicado el 16 de Octubre del 2017)
585 visualizaciones desde el 16 de Octubre del 2017
161,6 KB
13 paginas
Creado hace 14a (15/07/2009)
Dto. Técnico EduDevices www.edudevices.com.ar

Procesamiento multitarea (primera parte)

Por el Ing. Gabriel Dubatti (www.ingdubatti.com.ar )

Introducción
Este artículo muestra distintas formas de realizar procesamiento multitarea en la familia
68HC908 y cómo realizar un pequeño "sistema operativo" para separar el manejo de
entrada/salida del procesamiento y comunicarlos por medio de mensajes.
Para trabajar con ejemplos concretos, presento a continuación dos tareas, su código, su diagrama
de estados y el código para ejecutar la misma tarea, esta vez mediante el diagrama de estados:
Tarea 1:
Consideremos, a modo de ejemplo, una cerradura electrónica para una puerta que mediante un
teclado permite el ingreso de una clave de 4 dígitos. Si la clave ingresada tiene el valor correcto,
el programa activa la cerradura durante 3 segundos y en caso de ingresar una combinación
inválida, hace sonar una sirena durante 1 segundo.
Lo cual se traduce en el siguiente código en formato MacAsm, asumiendo que al leerse una
tecla desde la interrupción de timer se copia su código (1..10) en la variable "teclado" y que en
cada décima de segundo se decrementa el contenido de la variable "timedecimas" hasta llegar a
0:
Código de la tarea 1:
while(1){
;lee 4 digitos.
;mientras lee, verifica que la clave sea correcta.
;si detecta un error, sigue leyendo para no sonar la alarma antes de tiempo
bsr EsperarTecla
if( a != #CLAVE1 ){
bra error_esperar2
}
bsr EsperarTecla
if( a != #CLAVE2 ){
bra error_esperar3
}
bsr EsperarTecla
if( a != #CLAVE3 ){
bra error_esperar4
}
bsr EsperarTecla
if( a != #CLAVE4 ){
bra error

Ing. Daniel Di Lella - Dedicated Field Application Engineer
e-mail: [email protected]

Dto. Técnico EduDevices www.edudevices.com.ar

}
bsr CerraduraON ;clave correcta: abrir la puerta durante 3 segundos
mov #!30,timedecimas
do{ ;espera a que pasen 3 segundos
}while( timedecimas != 0 )
bsr CerraduraOFF
continue ;vuelve a iterar (espera nueva clave)

error_esperar2: ;clave incorrecta: completar los 4 digitos
bsr EsperarTecla
error_esperar3:
bsr EsperarTecla
error_esperar4:
bsr EsperarTecla
error:
bsr SirenaON ;suena la sirena durante 1 segundo
mov #!10,timedecimas
do{ ;espera a que pase 1 segundo
}while( timedecimas != 0 )
bsr SirenaOFF
}

EsperarTecla:
do{ ;espera a leer una tecla desde interrupcion
lda teclado
}while( a == 0 )
clr teclado ;anula la tecla recibida para esperar proxima
rts ;retorna A= tecla presionada

;Tamaño del código= 63 bytes

Ing. Daniel Di Lella - Dedicated Field Application Engineer
e-mail: [email protected]

Dto. Técnico EduDevices www.edudevices.com.ar

El programa puede representarse mediante el siguiente diagrama de estados:

Diagrama de estados de la tarea 1:

El diagrama consta de:

• Estados: representados por bloques de color.

Cada estado corresponde a cada uno de los puntos en los que el programa está esperando

alguna condición para continuar ejecutando (en este caso: los amarillos esperan por el
teclado y los verdes por tiempo).

• Transiciones: representadas por flechas que van desde el estado 'origen' donde se inicia
la transición al nuevo estado donde se dirige ('destino').
Las transiciones se producen al recibirse la condición esperada en el estado 'origen'.

Sólo puede ejecutarse código antes de ingresar al nuevo estado de espera (en este
caso: se indica la condición esperada mediante texto azul y el código a ejecutar mediante
texto negro luego de una barra separadora).

• Estado de inicio y numeración: el estado de inicio se indica con un pequeño triángulo y

la numeración (totalmente arbitraria) de los estados permite indicar en una variable
numérica el estado donde se encuentra el programa.

Ing. Daniel Di Lella - Dedicated Field Application Engineer
e-mail: [email protected]

Dto. Técnico EduDevices www.edudevices.com.ar

Código de la tarea 1 (por diagrama de estados):
clr estadoactual ;empezar en el estado 0: "esperar clave 1"
while(1){
ldx estadoactual ;esta variable determina que se está esperando
switch( X ){
;estados que esperan por tiempo
case 4: ;4: esperar t (cerradura)
case 8: ;8: esperar t (sirena)
lda timedecimas
if( a == 0 ){ ;fin de la espera?
if( X == #4 ){
bsr CerraduraOFF
}else{
bsr SirenaOFF
}
clr estadoactual ;pasa al estado 0: "esperar clave 1"
}
break

;el resto de los estados esperan por teclado
default:
lda teclado ;expansión de la función "EsperarTecla"
if( a == 0 ){
break ;espera a que se lea una tecla
}
clr teclado ;anula la tecla recibida para esperar proxima

switch( X ){
case 0: ;0: esperar clave 1
if( a == #CLAVE1 ){
bra siguiente_est ;pasa al estado 1: "esperar clave 2"
}
mov #5,estadoactual ;pasa al estado 5: "ERROR esperar 2"
break

case 1: ;1: esperar clave 2
if( a == #CLAVE2 ){
bra siguiente_est ;pasa al estado 2: "esperar clave 3"
}
mov #6,estadoactual ;pasa al estado 6: "ERROR esperar 3"
break
case 2: ;2: esperar clave 3

Ing. Daniel Di Lella - Dedicated Field Application Engineer
e-mail: [email protected]

Dto. Técnico EduDevices www.edudevices.com.ar

if( a == #CLAVE3 ){
bra siguiente_est ;pasa al estado 3: "esperar clave 4"
}
mov #7,estadoactual ;pasa al estado 7: "ERROR esperar 4"
break

case 3: ;3: esperar clave 4
if( a == #CLAVE4 ){
bsr CerraduraON ;clave correcta: abrir la puerta
mov #!30,timedecimas ;programa esperar 3 segundos
bra siguiente_est ;pasa al estado 4: "esperar t (cerradura)"
}
bsr SirenaON ;clave incorrecta: sonar alarma
mov #!10,timedecimas ;programa esperar 1 segundo
mov #8,estadoactual ;pasa al estado 8: "esperar t (sirena)"
break

case 5: ;5: ERROR esperar clave 2
case 6: ;6: ERROR esperar clave 3
bra siguiente_est ;pasa al estado 6/7: "esperar clave 3/4"

case 7: ;7: ERROR esperar clave 4
bsr SirenaON ;clave incorrecta: sonar alarma
mov #!10,timedecimas ;programa esperar 1 segundo
;pasa al estado 8: "esperar t (sirena)"
siguiente_est:
inc estadoactual ;pasa al estado "estadoactual+1"
break
}
}
}

;Tamaño del código= 112 bytes

Tarea 2:
En este caso, recibimos caracteres por la puerta serie. Si recibimos "SI": encendemos una
lámpara, si recibimos "NO": la apagamos. Otras combinaciones dan error y son ignoradas hasta
recibir un "<enter>".
Lo cual se traduce en el siguiente código en formato MacAsm, asumiendo que al recibirse un
caracter desde la interrupción del SCI se copia en la variable "caracter":

Ing. Daniel Di Lella - Dedicated Field Application Engineer
e-mail: [email protected]

Dto. Técnico EduDevices www.edudevices.com.ar

do{

Código de la tarea 2:
while(1){
;esperar primero (ignora ENTER)

bsr EsperarCar
}while( a == #ENTER )
if( a == #'S' ){
bsr EsperarCar
if( a == #'I' ){
bsr LamparaON ;"SI" = lampara ON
continue
}
}else if( a == #'N' ){
bsr EsperarCar
if( a == #'O' ){
bsr LamparaOFF ;"NO" = lampara OFF
continue
}
}
;ERROR: esperar ENTER

bsr EsperarCar
}while( a != #ENTER )
}

do{

EsperarCar:
do{
lda caracter
}while( a == 0 )
clr caracter
rts

;Tamaño del código= 50 bytes

Ing. Daniel Di Lella - Dedicated Field Application Engineer
e-mail: [email protected]

Dto. Técnico EduDevices
  • Links de descarga
http://lwp-l.com/pdf7195

Comentarios de: Procesamiento multitarea (primera parte) (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad