Professional Documents
Culture Documents
Modulo 11 Diapo
Modulo 11 Diapo
28/09/2018
Un problema simple
Se requiere realizar una implementación de un software para un sistema embebido que encienda y
apague un led a intervalos de 500 ms. ¿Cómo lo implementarı́a? ¿Cómo lo representarı́a?
Diagrama de Flujo
Un problema simple
Se requiere realizar una implementación de un software para un sistema embebido que encienda y
apague un led a intervalos de 500 ms. ¿Cómo lo implementarı́a? ¿Cómo lo representarı́a?
Esta representación puede leerse como: en el estado 0 se tendrá una salida 0, la transición al
estado 1 (que producirá la salida 1) se dará cuando se produzca la entrada x.
Máquina de Mealy: en este modelo la actualización de las salidas se produce durante la
transición de estados.
Aquı́, a partir del estado 0, cuando se produzca la entrada x se producirá la salida y al-
canzándose el estado 1.
Ejemplo
Se requiere diseñar un sistema digital que determine la presencia de la secuencia 110. El sistema
tendrá una entrada en cada ciclo de reloj y deberá producir una salida que representa la identificación
del valor anterior (1 en caso que se lo haya detectado o 0 en caso contrario) .
Ejemplo
Se requiere diseñar un sistema digital que determine la presencia de la secuencia 110. El sistema
tendrá una entrada en cada ciclo de reloj y deberá producir una salida que representa la identificación
del valor anterior (1 en caso que se lo haya detectado o 0 en caso contrario) .
Ejemplo
Se requiere diseñar un sistema digital que determine la presencia de la secuencia 110. El sistema
tendrá una entrada en cada ciclo de reloj y deberá producir una salida que representa la identificación
del valor anterior (1 en caso que se lo haya detectado o 0 en caso contrario) .
Estos modelos pueden utilizarse (directamente o con variantes) para la implementación de aplica-
ciones para sistemas embebidos.
Permiten describir el software desde la perspectiva de un modelo. Indicando su funcionamiento
más que su implementación.
Denotan el mecanismo de funcionamiento de un modo claro, que permite el trabajo en grupos
y el intercambio de ideas.
Ejemplo de implementación
Se desea implementar una aplicación para un sistema embebido que proceses paquetes de datos
recibidos a través de una interfaz serie. El protocolo se ha implementado utilizando 5 bytes.
Donde:
b0: primer byte, valor constante igual a 0x0B.
b1 y b2: es la carga útil de información en cada paquete. En el caso de aplicación el b1
está asociado a un número de led (0 - 4) y b2 representa el estado del mismo (0 o 1).
b3: suma de comprobación en 8 bits de todos los valores del paquete recibidos hasta el mo-
mento.
b4: valor constante igual a 0xB0
La implementación debe lograrse de tal modo que, en caso de recibirse un byte erróneo, debe
reiniciar el procesamiento.
package.h
package.c
package.c
Conclusiones
La implementación presentada verifica la estructura de los paquetes entrando en sincronismo
de modo automático e indica la presencia de un conjunto de datos válidos.
En esta implementación la carga útil de cada paquete es pequeña, podrı́a utilizarse un paquete
de datos de mayor tamaño definiendo un estado que almacene los valores en un arreglo. Este
serı́a un campo de la estructura pkgData.
Yakindu SCT
Es una herramienta para el desarrollo de diagramas de estado con diferentes tipos de licencia-
miento (gratuita para uso no comercial).
Entre las funcionalidades que incorpora permite verificar el modelo, simularlo y generar código
fuente en lenguaje C, C++ y Java.
Para comenzar a trabajar con esta herramienta el primer paso es instalar el pluggin en Eclipse.
Para esto, dentro de Eclipse, seleccionar Help/Install new software y desde allı́ agregar
como nuevo repositorio http://updates.yakindu.org/sct/releases/.
Hecho esto, es posible agregar a un proyecto un nuevo diagrama de estados
(File/New/Other... - YAKINDU SCT/Statechart Model)
Diseño
El primer paso en el diseño es es definir los estados. En nuestro caso, solo tendremos dos estados:
Led apagado
Led encendido
Los estados pueden tener comportamiento, el cuál está dado por reacciones. Las reacciones no
solo se asocian a estados sino que además pueden estar asociadas a transiciones. La diferencia es
que mientras que una transición está asociada necesariamente a una reacción, un estado puede
tener un comportamiento definido por varias reacciones.
La sintaxis utilizada por Yakindu para la definición de reacciones es:
Una reacción puede incluir un trigger que dispara la ejecución de la misma. Este puede ser
una palabra clave o un evento.
Es posible indicar en una reacción un condición (guard), de indicarse es necesario que la
condición sea verdadera al momento de producirse la reacción.
El tercer elemento effect constituye una acción. Puede indicarse una operación o múltiples
separadas por el carácter ‘,’.
Diseño
Una reacción puede ser producida a partir de un evento. Si este es el caso, el evento debe definirse
como tal. Posteriormente podrá ser invocado como una función en el momento que corresponda
desde el código fuente de la aplicación.
Otras alternativas para disparar una reacción son ciertas palabras claves definidas como parte de
los diagramas de estados:
after: dispara una reacción luego de pasado un perı́odo de tiempo
every: dispara una reacción a intervalos regulares de tiempo
always, oncycle: dispara una reacción por cada ciclo de ejecución de la máquina de estados.
entry: dispara la ejecución de una reacción al momento de ingresar a una máquina o estado.
exit: de modo análogo al anterior, dispara una reacción al salir de una máquina o estado.
Las unidades de tiempo reconocidas son s, ms, ns y us.
Diseño
Volviendo a nuestro caso de estudio, al ingresar al estado “Led Apagado” deberı́a apagarse el led,
mientras que deberı́a operarse de modo análogo al ingresar al estado “Led Encendido”.
Las operaciones requeridas para apagar y encender el led deben definirse como operaciones en
Yakindu, siendo necesario agregar su definición en la interfase del diagrama. Por ejemplo:
operation ledOn()
operation ledOff()
Las operaciones son implementadas como funciones, pudiendo tomar argumentos y retornar va-
lores. Los tipos de datos reconocidos son integer, real, boolean, string y void. De esto son
declaraciones de operaciones válidas:
Eventos
El siguiente paso es definir los eventos que, en este caso particular, producirán las transiciones entre
estados. Al igual que las operaciones estos deben definirse.
Los eventos pueden ser de dos tipos:
Eventos internos: que se producen solo en el ámbito de la máquina de estados.
Eventos externos: son estı́mulos que se producen desde el exterior a la máquina de estados.
Estos, a su vez, pueden ser de dos tipos:
Eventos de salida (out event): se producen desde la máquina de estados hacia el exterior.
Al igual que las operaciones, los eventos pueden tener valores asociados. Si este es el caso, en su
definición, debe indicarse su tipo. El valor puede ser accedido a través de la función valueof.
Simulación
Una vez definido el evento al que reaccionará nuestra máquina de estados, nuestro modelo ha
sido completado. Entre las posibilidades ofrecidas por Yakindu está la simulación. Para iniciar
esta perspectiva y comenzar la simulación deberemos seleccionar, del menú contextual asociado al
archivo que representa el modelo en el proyecto la opción Run as/Statechart Simulation.
Esto se realiza agregando al proyecto un ‘generador’ de código que forma parte del pluggin de Yakin-
du. Para esto, con la carpeta donde se almacenó el archivo que representa el modelo seleccionada,
debemos seleccionar File/New/Other... - Yakindu SCT/Code Generator Model.
Debido a que en esta carpeta habrá por lo menos un header, debe incluirse en el path de búsqueda
de headers en el makefile del proyecto.
Por defecto se generará el código fuente asociado al modelo, sin embargo puede ser necesario en
algunos casos forzar la generación del mismo. Para esto deberemos seleccionar del menú contextual
del archivo asociado al generador de código fuente la opción Generate Code Artifacts.
sysUtils.c
main.c
Ejemplo 2.0
Consideremos ahora la siguiente modificación: en vez de alterarse el estado del led al presionar el
botón, deseamos que parpadee a intervalos regulares de 250 ms (esté encendido 250 ms y apagado
durante el mismo tiempo).
Ejemplo 2.0
sysUtils.c
main.c (1/2)
# define NOF_TIMERS \
( sizeof ( L ed O nO f fT im e Ev e nt s )/ sizeof ( sc_boolean ))
void l e d O n O f f If a c e _ l e d O n (
const LedOnOff * handle ){
ledOn (0);
}
main.c (2/2)
void l e d O n O f f I f a c e _ l e d O f f (
const LedOnOff * handle ){
ledOff (0);
}
while (1){
__WFI ();
if ( getSysTickEv ()){
rstSysTickEv ();
UpdateTimers ( ticks , NOF_TIMERS );
for ( i = 0; i < NOF_TIMERS ; i ++){
if ( IsPendEvent ( ticks , NOF_TIMERS , ticks [ i ]. evid )){
l e d O n O f f _ r a i s e T i m e E v e n t (& estados , ticks [ i ]. evid );
MarkAsAttEvent ( ticks , NOF_TIMERS , ticks [ i ]. evid );
}
}
}
le dOn Off_ run Cy c le (& estados );
}
return 0;
}
Ejemplo 3.0
El objetivo ahora es que el led0 (color azul rgb) parpadee 4 veces, a intervalos de 250 ms. Al
presionar una tecla, parpadee 4 veces el led 3 a intervalos de 250 ms. El ciclo debe volver a
comenzar con el led0 al presionar una tecla.
Si bien es posible implementar la solución utilizando estados de la misma jerarquı́a, una solución más
comprensible podrı́a lograrse utilizando estados compuestos. Los estados compuestos son estados
que contienen diagramas de estados. Como tales, tendrán un punto de entrada y pueden tener un
estado final.
El control de la cantidad de veces que se enciende un led puede realizarse utilizando una variable
interna y reacciones con condiciones asociadas.
Ejemplo 3.0
Fin Módulo 11