105
BESA MICRO-EDITION, ARQUITECTURA DE SISTEMAS MULTIAGENTE PARA MICROCONTROLADORES T.G. 0505 DAVID MAGIN FLOREZ RUBIO GUILLERMO ANDRES RODRÍGUEZ CANTOR JUAN MANUEL ORTIZ GÓMEZ PONTIFICIA UNIVERSIDAD JAVERIANA FACULTAD DE INGENIERIA CARRERA DE INGENIERIA ELECTRÓNICA BOGOTÁ 2005

BESA MICRO-EDITION, ARQUITECTURA DE SISTEMAS … · besa micro-edition, arquitectura de sistemas multiagente para microcontroladores t.g. 0505 david magin florez rubio guillermo andres

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

  • BESA MICRO-EDITION, ARQUITECTURA DE SISTEMAS MULTIAGENTE PARA

    MICROCONTROLADORES

    T.G. 0505

    DAVID MAGIN FLOREZ RUBIO

    GUILLERMO ANDRES RODRÍGUEZ CANTOR

    JUAN MANUEL ORTIZ GÓMEZ

    PONTIFICIA UNIVERSIDAD JAVERIANA

    FACULTAD DE INGENIERIA

    CARRERA DE INGENIERIA ELECTRÓNICA

    BOGOTÁ

    2005

  • BESA MICRO-EDITION, ARQUITECTURA DE SISTEMAS MULTIAGENTE PARA

    MICROCONTROLADORES

    T.G. 0505

    DAVID MAGIN FLOREZ RUBIO

    GUILLERMO ANDRES RODRÍGUEZ CANTOR

    JUAN MANUEL ORTIZ GÓMEZ

    Informe Final

    Director

    ENRIQUE GONZALEZ

    Ingeniero Eléctrico

    PONTIFICIA UNIVERSIDAD JAVERIANA

    FACULTAD DE INGENIERIA

    CARRERA DE INGENIERIA ELECTRÓNICA

    BOGOTÁ

    2005

    ii

  • TABLA DE CONTENIDO

    INTRODUCCIÓN 1

    1. OBJETIVOS 3

    1.1. OBJETIVO GENERAL 3 1.2. OBJETIVOS ESPECÍFICOS 3

    2. MARCO TEÓRICO 5

    2.1. SISTEMAS MULTI-AGENTE 5 Aplicaciones 5

    2.2. ARQUITECTURA BESA DE SISTEMAS MULTI-AGENTE 6 2.2.1. DEFINICIÓN DE AGENTE 6

    Estructura de un Agente (Canal – Comportamiento – Estado) 7 Definición de Contenedor 8

    2.2.2. REQUERIMIENTOS DE BESA 9 Necesidades de Sincronización 9 Necesidades de Concurrencia 10 Comunicación entre Agentes 10

    2.3. SISTEMAS OPERATIVOS 11 2.3.1. SISTEMAS OPERATIVOS EN TIEMPO REAL 12 2.3.2. PLANIFICACIÓN 13 2.3.3. MECANISMOS DE SINCRONIZACIÓN 15

    Semáforos 16 Mensajes 17

    2.3.4. MANEJO DE MEMORIA 18

    3. DESARROLLO 21

    3.1. REQUERIMIENTOS DE BESA 21 3.2. SELECCIÓN DEL RTOS Y DE LA FAMILIA DE MICROCONTROLADORES 21 3.2.1. BÚSQUEDA Y SELECCIÓN DEL RTOS 21 3.2.2. SELECCIÓN DE LA FAMILIA DE MICROCONTROLADORES 24 3.2.3. APROPIACIÓN DEL RTOS 26

    Gestión de Memoria 26 Pruebas Realizadas 26

    3.3. CONSTRUCCIÓN DEL MODELO BESA-ME 27 3.3.1. DESCRIPCIÓN GENERAL 27 3.3.2. NIVEL AGENTE 28

    Estructuras Asociadas a la Identificación del Agente 29 Construcción del Canal 30 Construcción del Comportamiento 32 El Estado 33 Simulación del envío de un Evento al Canal y ejecución de sus Comportamientos 34

    3.3.3. NIVEL SISTEMA 34 Creación del Contenedor 35 El Administrador Local en BESA-ME 37 Envío de Eventos BESA desde Interrupciones 37 Comunicación entre Agentes 39

    iii

  • 3.4. PROTOCOLO DE COMUNICACIÓN EXTERNA 40 3.4.1. PROTOCOLO DE COMUNICACIÓN A NIVEL BYTE 40

    Selección del Protocolo de Comunicación a Nivel Byte 40 Introducción al Funcionamiento del Protocolo I2C 41 Implementación del Protocolo de Comunicación a Nivel Byte 43

    3.4.2. PROTOCOLO DE COMUNICACIÓN A NIVEL TRAMA 46 Trama Evento BESA 46 Trama Acknowledge BESA 47 Secuencia de Comunicación del Protocolo a Nivel Trama 48

    4. PRUEBAS Y ANÁLISIS DE RESULTADOS 61

    4.1. PROTOCOLO DE PRUEBAS 61 4.1.1. IDENTIFICACIÓN DE VARIABLES 61

    Variables Independientes 61 Variables Intervinientes 63 Variables Dependientes 63

    4.1.2. PRUEBAS A REALIZAR 64 Pruebas de Capacidad 64 Pruebas de Comunicación 64 Pruebas de Interrupciones 65

    4.2. ANÁLISIS DE LOS RESULTADOS OBTENIDOS 65 4.2.1. PRUEBAS DE CAPACIDAD 65

    Tamaño del Stack 66 Cantidad de Agentes por Contenedor 66 Cantidad de Comportamientos 68 Cantidad de Guardas 69 Cantidad de Puertos 69 Síntesis de Resultados Obtenidos 70

    4.2.2. PRUEBAS DE COMUNICACIÓN 70 Envíos de Eventos por el Canal de Comunicación 71 Tiempos de Respuesta a Eventos 74 Tipos de Errores en la Comunicación Externa 77

    4.2.3. PRUEBAS DE INTERRUPCIONES 81

    5. CONCLUSIONES 87

    6. BIBLIOGRAFIA 91

    7. ANEXOS 93

    ANEXO A. MANUAL DEL USUARIO. 93 ANEXO B. CODIGO DE PROGRAMACION. 94

    iv

  • INDICE DE FIGURAS

    Figura 1. Arquitectura interna de un agente. Tomado del artículo BESA.5 7 Figura 2. Modelo del nivel de sistema BESA. Tomado de BESA.5 9 Figura 3. Modelo de Agente en BESA-ME 29 Figura 4. Estructuras asociadas al Agente 29 Figura 5. Estructura asociada al canal. 30 Figura 6. Estructura asociada a los Puerto y a las Guardas. 31 Figura 7. Estructura del Mensaje recibido por el Comportamiento. 31 Figura 8. Estructura asociada al Comportamiento. 33 Figura 9. Nivel Sistema en BESA-ME con el servicio de comunicación entre contenedores. El

    administrador local se encarga del manejo de los eventos. 35 Figura 10. Estructura asociada Contenedor. 36 Figura 11. Estructura de los buffer de Transmisión y de Recepción para la comunicación entre

    contenedores. 36 Figura 12. BESA_DATA, Estructura en la que almacenan los datos de usuario. 37 Figura 13. BESA_EVENT, Estructura en la que se almacena el tipo de evento y el

    BESA_DATA. 37 Figura 14. ISR_BESA_EVENT, Estructura en la que se almacena un BESA_EVENT cuando

    quiere ser enviado desde una rutina de interrupción. 38 Figura 15. Diagrama de bloques del tratamiento de eventos desde una rutina de

    interrupción. 38 Figura 16. Formato de tramas utilizadas para la comunicación entre Contenedores. 46 Figura 17. Tipos de respuesta acknowledge en BESA-ME. Ejemplo del envío de un agente X a

    un agente Z ubicados en distintos contenedores. 49 Figura 18. Señales START, no Acknowledge Hardware y STOP. 54 Figura 19. Señales presentes durante la comunicación exitosa desde un contenedor hacia otro

    contenedor. Tamaño máximo de Datos igual a 6. DataSize igual a 8. 55 Figura 20. Envío y recepción de eventos al bus I2C por medio de interrupciones. 56 Figura 21. Diagrama de flujo de la comunicación entre agentes en BESA-ME. 60 Figura 22. Envíos exitoso para diferentes frecuencias de envío y tamaño de cola igual a

    uno. 73 Figura 23. Envíos exitoso para diferentes frecuencias de envío y tamaño de cola igual a

    dos. 73 Figura 24. Envíos exitoso para diferentes frecuencias de envío y tamaño de cola igual a

    tres. 74 Figura 25. Tiempos de atención a eventos periódicos de envíos externos, desde los

    comportamientos. 75

    v

  • Figura 26. Tiempos de atención a eventos periódicos de envíos locales, desde los comportamientos. 76

    Figura 27. Envíos exitosos vs periodo de envío, para dos agentes ubicados en distintos contenedores. Cada punto representa un grupo de 100 envíos 77

    Figura 28. Porcentaje de causas de error para un xDelayTime de 2ms. 78 Figura 29. Porcentaje de causas de error para un xDelayTime de 11ms. 78 Figura 30. Porcentaje de causas de error para un xDelayTime de 14ms. 78 Figura 31. Porcentaje de causas de error para un xDelayTime de 20ms. 79 Figura 32. Envíos exitosos vs periodo de envío, para 2 agentes productores y un

    consumidor. 80 Figura 33. Porcentaje de Causas de error para un xDelayTime de 3 ms. 80 Figura 34. Porcentaje de Causas de error para un xDelayTime de 10 ms. 81 Figura 35. Porcentaje de Causas de error para un xDelayTime de 14 ms. 81 Figura 36. Envíos generados desde interrupciones periódicas. 83 Figura 37. Distribución de los agentes y sus respectivos comportamientos para la aplicación

    de demostración. 85 Figura 38. Distribución de los agentes según los recursos físicos disponibles. 86

    vi

  • INDICE DE TABLAS

    Tabla 1. Comparación de los recursos de memoria entre PIC18F452 y PIC18F8720. 25 Tabla 2. Descripción de los bytes de la trama Event BESA para un Data Size de

    tamaño N. 47 Tabla 3. Descripción de los bytes de la trama Ack BESA. Constante para cualquier tamaño

    de datos. 48 Tabla 4. Valores de los Stacks. 66 Tabla 5. Tiempos de Respuesta para distintas cantidades de Agentes en un Contenedor.

    Todos los tiempos en milisegundos. 67 Tabla 6. Tiempos de Respuesta para distintas cantidades de Comportamientos en un

    Contenedor. 68 Tabla 7. Cantidad máxima de Guardas en un contenedor 69 Tabla 8. Tiempos de respuesta a eventos con distintas cantidades de Puertos 69 Tabla 9. Envíos de Eventos por el puerto I2C con diferentes tamaños de colas y periodos de

    envío. 71 Tabla 10. Tiempos de respuesta a un envío remoto por I2C. 74 Tabla 11. Tiempos de atención a los envíos externos de eventos generados

    periódicamente. 75 Tabla 12. Tiempos de atención a los envíos locales de eventos generados

    periódicamente. 76 Tabla 13. Promedio de Envíos exitosos y fallidos generados desde una rutina de interrupción

    a un agente local. 82

    vii

  • INTRODUCCIÓN

    En la cotidianidad se puede observar que para la solución eficiente de problemas complejos,

    resulta conveniente dividirlos en tareas más simples que puedan ejecutarse por separado. Un

    buen resultado depende de la coordinación entre ellas. Éste mismo concepto puede ser llevado a

    la industria, donde el avance de la tecnología plantea nuevos retos que requieren soluciones

    rápidas y efectivas.

    Existe un modelo que abstrae el concepto de tareas distribuidas y que propone un esquema para

    la construcción de sistemas complejos. Éste modelo es conocido como Sistema Multi-Agente

    (SMA).

    A partir de los desarrollos sobre SMA publicados por Jiming Liu, se puede obtener una visión

    general del origen y justificación de este modelo. Sus desarrollos respondían a la pregunta de

    por qué tener múltiples individuos afirmando: “por la misma razón que organizaciones como las

    conformadas por abejas y hormigas están formadas por grupos de individuos nacidos con una

    labor específica, los individuos se comunican entre sí, para entre todos, lograr un objetivo

    común”1. De esta forma, se muestra la existencia de entidades (individuos) especializadas para

    el desarrollo de determinadas labores y como a través de estas entidades, es posible distribuir

    las tareas, disminuyendo la carga para cada uno de ellos y mejorando el resultado final.

    Los SMA no sólo son una tecnología muy prometedora, también están emergiendo como una

    nueva manera del pensamiento: un paradigma conceptual para analizar problemas y para el

    diseño de sistemas; un medio para manejar la complejidad, distribución e interactividad, y

    quizás una nueva perspectiva en las ciencias de la computación y la inteligencia artificial2.

    El diseño de aplicaciones desde el concepto SMA presenta algunas dificultades tales como la falta

    de herramientas para su desarrollo y su reducido uso industrial. Para darle solución a lo anterior

    hemos desarrollado una herramienta de programación de alto nivel que facilita la distribución de

    tareas y su aplicación en un entorno hardware, con la característica de permitir al diseñador

    modificarlas en una forma eficiente, así como realizar labores de mantenimiento o actualización

    del sistema (escalabilidad). Dado el extendido uso de los microcontroladores para aplicaciones

    industriales y de investigación, la implementación de la herramienta se ha realizado sobre estos

    dispositivos.

    1 LIU, Jiming. “Multi – Agent Robotic Systems”. CRC Press, Boca Ratón, Fl. 2001 2 Robocup Federation, “RoboCup Home Page”. http://www. robocup.org.

    1

  • Debido al enfoque Multi-Agente de la herramienta que fue implementada, este libro comienza

    con un resumen de las generalidades y aplicaciones de los SMA. En el capítulo siguiente se

    describe BESA, la arquitectura de SMA desarrollada en la Pontificia Universidad Javeriana, con

    base en la cual se ha desarrollado la herramienta descrita en este trabajo y que da origen a su

    nombre BESA Micro Edition (BESA-ME). Una vez identificadas las necesidades de este modelo de

    SMA y su aplicación a microcontroladores, se muestra la necesidad de usar un Sistema

    Operativo que las soporte, por lo cual continuamos con un capítulo donde se explican las

    características generales y se describen más a fondo los Sistemas Operativos de tipo Tiempo

    Real (RTOS por sus siglas en inglés). Luego, en el desarrollo, se sintetizan lo requerimientos de

    ejecución de la arquitectura BESA, con base en estos se explica como se seleccionó el RTOS para

    soportar el modelo y como fue construido el modelo BESA adaptado a las características de un

    micro-controlador y a un ambiente distribuido de dos microcontroladores. Por último, se

    exponen las pruebas y sus resultados, con los cuales se evaluaron las características de

    capacidad y velocidad de la herramienta aplicada a una plataforma hardware específica.

    BESA-ME es entonces una herramienta innovadora, económica y de gran facilidad de aplicación,

    diseñada con posibilidades de ser actualizada a medida que los microcontroladores evolucionen.

    2

  • 1. OBJETIVOS

    1.1. Objetivo General

    Desarrollar una plataforma de software que implemente el modelo BESA para una familia de

    microcontroladores, permitiendo la creación de aplicaciones con enfoque Multi-Agente.

    1.2. Objetivos Específicos

    1. Seleccionar e implementar para una familia de microcontroladores, un sistema operativo ya

    existente que posea las características de un RTOS y proporcione los servicios básicos de un

    ambiente multitarea requeridos por el modelo BESA.

    2. Diseñar e implementar una plataforma de software basada en el modelo BESA que funcione

    sobre el RTOS seleccionado e implementado y que soporte la creación de aplicaciones con

    enfoque Multi-Agente.

    3. Desarrollar el servicio de comunicación entre agentes de dos microcontroladores de la misma

    familia adecuado para el modelo BESA.

    3

  • 4

  • 2. MARCO TEÓRICO

    En este marco teórico se muestra un resumen de las generalidades y aplicaciones de los

    Sistemas Multi-Agente. Con base en esto se describe el modelo abstracto de SMA planteado por

    la arquitectura BESA. Dadas las características que plantea este modelo y su aplicación a

    microcontroladores, se muestra la necesidad de usar un Sistema Operativo Tiempo Real, sobre

    el cual se profundiza también.

    2.1. Sistemas Multi-agente

    Un Sistema Multi-Agente (SMA) es un sistema computacional con características de autonomía,

    es decir, capaz de ejecutar ciertas tareas dentro de un entorno determinado y modificarlo, según

    la función especifica para la cual fue diseñado. Las funciones que puede realizar están definidas

    por un conjunto de instrucciones que pueden ser ejecutadas o no. La arquitectura del sistema

    determina la forma de comunicación entre agentes y la administración de los recursos3.

    En la estandarización de estas arquitecturas de SMA, la fundación FIPA (Foundation for

    Intelligent Physics Agents) ha creado ciertas directrices. Propone una plataforma de software

    que contiene la definición de un lenguaje de comunicación entre agentes y los elementos básicos

    para la construcción del sistema4.

    Aplicaciones

    Actualmente los Agentes y los sistemas multiagente son una de las tecnologías más prominentes

    y atractivas de la ingeniería y la informática. Las tecnologías, métodos y teorías de sistemas

    multiagentes están contribuyendo en diversos dominios de aplicación, tales como: recuperación

    de información, diseño de interfases de usuario, robótica, juegos de computador, educación,

    ambientes de entretenimiento, manejo y administración de proyectos, simulación social, realidad

    virtual, etc.

    En la solución de muchos de estos problemas se emplean mecanismos de control de software y

    de hardware, como algoritmos computacionales y máquinas dedicadas que utilizan

    microcontroladores y DSP.

    3 WEISS, Gerhard. “Multiagent systems: A modern approach to Distributed Artificial Intelligence”.

    Masachussets, U.S.A 1999. 4 Foundation For Intelligent Physical Agents, http://www.fipa.org, Noviembre 5 del 2004.

    5

    http://www.fipa.org/

  • 2.2. Arquitectura BESA de Sistemas Multi-Agente

    BESA es una arquitectura para la construcción de Sistemas Multi-Agente, que implementa tres

    conceptos principales en su modelo abstracto de SMA5, de los cuales se desprende la sigla

    BESA:

    • Behavior – Oriented: Los agentes se descomponen modularmente en entidades más

    simples, las cuales poseen ciertos comportamientos con una semántica asociada entre

    ellos, que permite la cooperación. Un agente está compuesto por un conjunto de

    comportamientos concurrentes.

    • Event – Driven: Los eventos que desencadenan la ejecución de comportamientos son

    señales que pueden ser percibidas o usadas por los agentes y esta ejecución depende de un

    mecanismo selector que evalúa el estado actual de la entidad y el estado de comunicación

    asociado a la detección del evento.

    • Social – Based: El sistema se crea sobre una organización social de agentes, compuesta

    en un conjunto de organizaciones de más bajo nivel, que conservan la estructura de un

    agente y cuyos últimos eslabones son los agentes individuales.

    2.2.1. Definición de Agente

    Un agente es la unidad abstracta fundamental a partir de la cual se conforma el sistema Multi-

    Agente BESA. A nivel social es la unidad más simple que sirve como base para construir

    cualquier nivel superior. Su arquitectura interna determina la estructura del sistema, los

    mecanismos de interacción entre los mismos agentes y el tratamiento dado a los eventos con el

    fin de obtener una respuesta.

    Los agentes responden a eventos provenientes del entorno o de una tarea en ejecución. Así

    como el agente puede percibir eventos provenientes del entorno, también puede modificarlo.

    Para esto, cada evento que se defina en el sistema debe tener un tratamiento asociado, de

    manera que cuando el agente lo perciba ejecute un procedimiento y se obtenga un resultado.

    Un agente debe además poder comunicarse con los demás agentes del sistema, pues es

    fundamental la interacción entre ellos para lograr el objetivo esperado a través de la ejecución

    concurrente de las tareas, el intercambio de eventos y la respuesta dada a los mismos.

    5 GONZALEZ, Enrique, AVILA, Jamir, BUSTACARA, César. “BESA” Bogotá, Colombia. 2003.

    6

  • Estructura de un Agente (Canal – Comportamiento – Estado)

    La arquitectura interna de los agentes integra cuatro elementos importantes: una composición

    modular de comportamientos, un canal compuesto por un buzón de recepción y un mecanismo

    selector de eventos y un estado.

    Figura 1. Arquitectura interna de un agente. Tomado del artículo BESA.5

    El canal y el comportamiento son las dos tareas por las cuales está compuesto un agente como

    mínimo. En el canal se reciben los eventos; para cada tipo de evento debe existir un puerto al

    cual se asigna el evento recibido para ser transferido a los comportamientos asociados. Allí se

    almacenan y se ejecutan los procedimientos relacionados a cada evento.

    Como se observa en la figura 1, el canal está formado por un buzón de entrada, donde se

    reciben los eventos direccionados al agente. Mediante un mecanismo selector basado en

    guardas los eventos que se reciben se transfieren al puerto correspondiente. Los puertos al

    igual que el buzón de entrada son colas, que permiten almacenar varios eventos de un mismo

    tipo en un puerto específico.

    La política implementada para el despacho de los eventos es FIFO (First in – First out), razón por

    la cual por cada tipo de evento asignado a un agente, debe existir un puerto asociado, con el fin

    de evitar el bloqueo entre eventos y que no se ejecuten los procedimientos relacionados en el

    momento adecuado.

    7

  • El evento almacenado en el puerto sólo se transfiere al comportamiento correspondiente cuando

    se comprueba una condición booleana, que se puede ver afectada por el mismo evento o por

    una variable que influye en la condición, disparando la guarda.

    Los comportamientos son tareas que pueden ejecutarse en paralelo y deben estar asociados con

    la guarda asociada al tipo de evento. Cada comportamiento tiene una cola para recibir eventos

    provenientes de los puertos del canal; cuando llega el evento, el comportamiento ejecuta

    automáticamente la función de tratamiento correspondiente.

    Un sistema multitarea permite que varios procesos sean ejecutados al mismo tiempo,

    compartiendo uno o más procesadores. BESA tiene la característica de ser una arquitectura

    multitarea ya que debe coordinar concurrentemente el uso del canal de comunicación y la

    ejecución de los comportamientos de los agentes en tiempo real. Tener más de un

    comportamiento en la arquitectura de un agente permite el paralelismo en el sistema, es decir,

    la ejecución de diferentes procedimientos en tiempo real, como respuesta a eventos que pueden

    ser concurrentes o no.

    Dentro de la arquitectura del agente existe un espacio denominado Estado (State) reservado

    para guardar información acerca del contexto del agente, del entorno, de los demás agentes y

    del sistema en general, según el tipo de información que el usuario final requiera. El estado

    puede ser accedido desde las funciones de tratamiento que se ejecutan en el comportamiento;

    puede ser leído y modificado según se requiera, por lo que debe ser protegido para que sólo

    pueda ser accedido por una tarea a la vez.

    Definición de Contenedor

    Un conjunto de agentes reunidos da origen a un nivel social más abstracto conocido como

    sistema. En BESA un sistema está formado por contenedores, que pueden funcionar en

    diferentes máquinas físicas o virtuales.

    Un contenedor es un espacio de ejecución donde los agentes habitan. Estos están manejados

    por un administrador local que es el encargado de la gestión del ciclo de vida de los agentes y de

    permitir la comunicación con agentes de otros contenedores.

    8

  • Figura 2. Modelo del nivel de sistema BESA. Tomado de BESA.5

    Los agentes pertenecientes a un mismo contenedor interactúan directamente, a diferencia de los

    agentes ubicados en distintos contenedores, los cuales se comunican entre si a través de un

    único puerto compatible con FIPA, el cual recibe la comunicación y las consultas de otros

    sistemas externos. (Ver Figura 2).

    2.2.2. Requerimientos de BESA

    Necesidades de Sincronización

    En la construcción del modelo de implementación (BESA-ME, BESA-Micro Edition) surge la

    necesidad de proteger estructuras y variables que pueden ser accedidas por varias tareas al

    mismo tiempo. Si una tarea accede a determinada variable y está utilizando la información

    contenida en ésta, ninguna otra tarea debe acceder a la misma variable hasta que no sea

    liberada por la tarea anterior. En el peor de los casos el acceso simultáneo por más de una

    tarea a una variable podría causar que ésta sea modificada mientras está siendo accedida y

    generar un error en la información o en la ejecución.

    Para evitar que esto suceda es necesario contar con algún mecanismo de señalización que

    proteja la variable a la que se accede y la información contenida en ella, de manera que en los

    casos críticos en los que se requiera, sólo una tarea pueda acceder la variable a la vez.

    La utilización de semáforos es seguramente la solución más adecuada para solucionar los

    problemas de sincronización. Cuando se va a acceder a una variable crítica, se baja el

    semáforo, cuando se libera la variable se sube el semáforo y otra tarea puede accederla.

    9

  • Necesidades de Concurrencia

    Debido a que el modelo abstracto de BESA plantea la ejecución de los comportamientos en

    paralelo, se requiere que la arquitectura BESA sea una arquitectura multitarea, creando cada

    comportamiento y cada canal como una tarea del sistema operativo, lo que permite su ejecución

    concurrente por parte del planificador del RTOS.

    Cada agente puede tener más de un comportamiento, y a cada comportamiento le son

    asignados eventos con sus respectivas funciones de tratamiento; las funciones deben ser

    ejecutadas entonces simultáneamente para responder a los eventos en tiempo real a medida

    que se vayan presentando. Puede ser útil entonces, el manejo de prioridades para asegurar la

    ejecución de ciertos comportamientos críticos que requieran una acción inmediata, teniendo

    presente que se debe evitar la inanición de las tareas de menor prioridad.

    El hecho de que el canal sea una tarea que se ejecute paralelamente con los comportamientos,

    asegura al máximo la recepción de los eventos que le sean dirigidos y su reenvío a los

    comportamientos correspondientes.

    Comunicación entre Agentes

    BESA plantea un servicio de directorios que facilita la comunicación entre los agentes. El

    servicio tiene dos secciones principales: una de páginas blancas donde es posible ubicar los

    agentes por una identificación dada en el momento de la creación; y otra de páginas amarillas

    donde se puede localizar a un grupo de agentes que tengan ciertas características en común,

    según su especialidad. Cada contenedor tiene su propio servicio de directorios.

    La comunicación entre agentes se puede dar de dos maneras diferentes: entre agentes del

    mismo contenedor o entre agentes de contenedores distintos.

    Comunicación entre Agentes del Mismo Contenedor

    Cuando un agente quiere comunicarse con otro, recurre entonces al servicio de directorios para

    poder localizar el destinatario, ya sea por su identificación o por su especialidad. Si los agentes

    pertenecen al mismo contenedor, la comunicación es directa, envían información de uno a otro,

    sin que el administrador local del contenedor intervenga.

    Comunicación entre Agentes de Distintos Contenedores

    El agente acude al servicio de directorios para localizar al agente con el que se quiere comunicar.

    Una vez localizado, la comunicación se realiza a través del puerto serial al que todos los

    contenedores pueden acceder, el cual se encarga de transmitir y recibir la información

    proveniente de otro contenedor y entregarla al agente correspondiente.

    10

  • Los contenedores deben tener en su servicio de directorios la información correspondiente a los

    agentes existentes en los demás contenedores. Si un agente es creado o destruido, el

    administrador local del contenedor debe informar a todos los otros contenedores del sistema,

    con el fin de que sea actualizado su servicio de directorios. Lo mismo debe hacerse en el

    arranque del sistema para que cada contenedor conozca a de la existencia de otros

    contenedores y agentes6.

    2.3. Sistemas Operativos

    Los Sistemas Operativos (SO) son uno de los más grandes logros en el desarrollo de software y

    constituyen uno de los más complejos programas. La búsqueda por lograr una administración

    eficiente y segura de los recursos de un computador ha llevado al desarrollo de los conceptos de

    proceso, gestión de memoria, seguridad y protección de la información, planificación y gestión

    de recursos, y estructura de sistema7.

    El concepto de proceso es uno de lo grandes logros en el desarrollo de SO. Se define como la

    mínima unidad de actividad; está caracterizada por una ejecución secuencial, por un estado

    actual y por estar asociada a un conjunto de recursos. Está compuesto por una o más unidades

    de trabajo conocidas como hilos, estos incluyen un contexto propio y áreas de datos propias, a

    partir de las cuales se logran establecer bifurcaciones a subrutinas, es decir, son

    interrumpibles y permiten que los procesos cedan y retomen el control del procesador (control

    expropiativo), utilizando así, la técnica de multi-hilos para ejecutar varias tareas independientes

    (multiproceso)8.

    Para la administración del paso de ejecución de un proceso a otro y sus implicaciones existen

    varios algoritmos de planificación. Esta administración parte de 5 posibles estados de los

    procesos: Nuevo, Listo, Ejecutándose, Bloqueado y Terminado, según los cuales se deben tomar

    las acciones determinadas por el algoritmo de planificación.

    En la actualidad el estándar POSIX, define la interfaz que los sistemas operativos deben ofrecer

    a las aplicaciones, así como la semántica de los servicios ofrecidos por esta interfaz.

    6 GONZALEZ, Enrique, AVILA, Jamir, BUSTACARA, César. “BESA” Bogotá, Colombia. 2003. 7 STALLINGS, William. “Sistemas Operativos”. Prentice Hall. Madrid, España. 2001. 8 STALLINGS, William. “Sistemas Operativos”. Prentice Hall. Madrid, España. 2001.

    11

  • 2.3.1. Sistemas Operativos en Tiempo Real

    Cuando un sistema computacional requiere dar respuesta a determinados dispositivos en tiempo

    real, aspectos como la administración eficiente de la memoria y el aumento en la eficiencia de

    utilización de la CPU se hacen secundarios, tal es el caso de las plataformas robóticas y mallas

    de control industrial. Esta necesidad ya ha sido detectada por empresas diseñadoras de

    microcontroladores usados en aplicaciones de tiempo real y ha sido superada mediante el

    desarrollo de sistemas operativos para estos dispositivos, son conocidos como sistemas

    operativos en tiempo real (RTOS, siglas en inglés).

    Los Sistemas Operativos Tiempo Real son diseñados para administrar la respuesta a sucesos o

    eventos, de tal forma que se respeten ciertos rangos de tiempo de respuesta, los cuales, en el

    caso de ser críticos para el sistema, requieren atención inmediata. En todo caso el RTOS es

    determinista, en consecuencia permite que el usuario prediga los tiempos de respuesta que el

    RTOS proporcionará al sistema informático que administra. Estos eventos, normalmente se

    producen en el entorno del sistema; estos llegan como interrupciones al procesador, ya sean por

    software o hardware. Los RTOS deben atender ráfagas de miles de interrupciones que activan

    diferentes procesos. Para no perder ningún suceso recibido, el RTOS debe trabajar con la

    técnica multiproceso, la cual ejecuta los procesos independientemente unos de otros, pero en

    ciertas aplicaciones se deben tener estrategias para asignar prioridad a los procesos y

    ejecutarlos según su importancia, lo cual se logra con una planificación expropiativa basada en

    prioridades.

    Algunas de las características más importantes de los RTOS son9:

    - La gestión de dispositivos críticos en tiempo.

    - Sofisticadas estrategias para la gestión de interrupciones.

    - Eficiente almacenamiento de E/S.

    - Permiten acceso desde los programas de usuario a los vectores de interrupción para

    prestar servicio a los sucesos.

    Otras áreas críticas en los RTOS son el determinismo, la sensibilidad, el control del usuario, la

    gran fiabilidad y la tolerancia a los fallos.10

    Entre éste tipo de SO se encuentran muchas versiones comerciales de alto costo como URTX,

    RTX, QNX, útiles para dispositivos de alto desempeño como los microprocesadores 80X86 y

    9 MILENKOVICH, Milan. “Sistemas Operativos: Conceptos y Diseño”. Mc. Graw Hill, Madrid, España. 1998. 10 STALLINGS, William. “Sistemas Operativos”. Prentice Hall. Madrid, España. 2001.

    12

  • algunos de libre distribución como SALVOTM y la migración del SO MartOS al MC6833211.

    SALVOTM, con versiones para microcontroladores Microchip, TI y Motorola entre otros, soporta

    multiproceso y en su versión de libre distribución soporta hasta tres tareas simultáneas12.

    2.3.2. Planificación

    El planificador es un conjunto de políticas y mecanismos incorporados al Sistema Operativo que

    gobiernan el orden en que se ejecutan las tareas en un sistema multiprogramado. El objetivo

    primario de la planificación es optimizar el rendimiento del sistema de acuerdo con los criterios

    considerados más importantes por los diseñadores. Existen 3 clases de planificadores, los

    cuales se clasifican según la frecuencia con la que es invocado por el procesador; estas son

    planificaciones a largo, mediano y corto plazo; este último es el único que se implementa en los

    RTOS.

    El planificador a corto plazo, también conocido como distribuidor (Dispacher), es el que toma

    decisiones con una mayor frecuencia y detalle sobre la tarea que se ejecutará a continuación. Su

    principal objetivo es maximizar el rendimiento del sistema de acuerdo con un conjunto de

    criterios elegidos. El planificador a corto plazo debe ser ejecutado por lo tanto, cada vez que

    una tarea se detenga (bloqueo), o cada vez que un suceso (interno o externo) ocurra. Éste es el

    tipo de planificador que soportan los sistemas RTOS, ya que el tiempo de ejecución es el criterio

    más importante a tener en cuenta. La suspensión, la terminación o aborto de una tarea en

    ejecución, son también sucesos que pueden necesitar la llamada al planificador a corto plazo.13

    Los algoritmos o mecanismos de planificación se pueden dividir en dos grandes grupos,

    expropiativos y no expropiativos. La no expropiación implica que cuando una tarea de mayor

    prioridad aparece, la tarea actual en ejecución no se ve obligada a ceder la propiedad del

    procesador, sino hasta que éste termine su ejecución. Con planificación expropiativa una tarea

    en ejecución puede ser sustituida por una tarea de mayor prioridad en cualquier instante, lo que

    implica entonces una mayor carga de trabajo para el planificador pero un menor tiempo de

    respuesta a los eventos críticos. Las características que deben cumplir los RTOS son apoyadas

    por el uso de planificación expropiativa.

    Round Robin (RR), planificación por turno rotatorio o también conocida como fracciones de

    tiempo, presenta una apropiación del reloj de modo que se genera periódicamente una

    interrupción indicando que la tarea que se encuentra en ejecución tiene que ser colocada en la

    11 CASTO GUTIÉRREZ, Alberto, “Migración de un Sistema Operativo De Tiempo Real, MaRTE OS, a un

    microcontrolador”, http://marte.unican.es/alberto_slides.ppt, Septiembre 5 de 2004. 12 SALVOTM, http://www.pumpkinc.com, Febrero 15 de 2004. 13 MILENKOVICH, Milan. “Sistemas Operativos: Conceptos y Diseño”. Mc. Graw Hill, Madrid, España. 1998.

    13

    http://marte.unican.es/alberto_slides.ppthttp://www.pumpkinc.com/

  • cola de listas y se selecciona la siguiente, según un FIFO. El criterio de diseño es el tiempo de

    duración de los cuantos (fracciones de tiempo) que se va a usar. Si el cuanto es muy pequeño,

    las tareas cortas tendrán que pasar varias veces por el sistema antes de ser finalizados,

    generando una sobrecarga en la gestión de recursos. Si el cuanto es muy grande, RR se

    degenera en un simple FIFO donde las tareas cortas tienen que esperar mucho tiempo.

    Existen otros algoritmos de planificación que presentan una serie de características más

    complejas, impidiendo así cumplir con los criterios necesarios para la implementación de un

    RTOS. Algunos de estos son SRT (Shortest Remaining Time), para el cual la tarea con menor

    tiempo esperado de ejecución será la más prioritaria; Realimentación el cual presenta un

    mecanismo dinámico de colas y prioridades. Cada cola representa un nivel de prioridad, y el más

    alto es el de las tareas más nuevas. Una vez una tarea vuelve a su estado de Lista, luego de su

    primera ejecución, es colocado en la segunda cola de menor prioridad. Después de cada

    ejecución, la tarea Lista es degradada al nivel inmediatamente inferior de prioridad. Cada una de

    estas colas funciona con la filosofía de FIFO, menos la última, que funciona con el mecanismo de

    RR por no poder descender más; Planificación de colas multi-nivel (MLQ, Multiple-Level Queues),

    el cual clasifica la carga de trabajo de acuerdo con sus características y mantiene colas de tareas

    separadas servidas por diferentes planificadores. Una posible separación sería programas

    interactivos, tareas del sistema y trabajos de lotes (simuladores). Estas asociaciones no son de

    gran utilidad, para sistemas en tiempo real, por lo que no se suele implementar esta disciplina

    en RTOS.

    Un criterio más que debe cumplir un RTOS en el que se desee implementar en un sistema Multi-

    Agente es el “tiempo de respuesta”, es decir, cualquier opción que presente una reducción en el

    tiempo de procesamiento y de decisión, debe aparecer en las posibilidades de adopción para

    éste proyecto. La no utilización de planificadores a largo y mediano plazo es una decisión

    evidente para cumplir con los parámetros necesarios, ya que el tiempo de procesamiento

    requerido por cada uno de ellos, implica retardos indeseables. Por esta misma razón, los

    algoritmos de planificación que requieren de cálculos complejos son desechados de las

    posibilidades de implementación, como los son SPN (Shortest Process Next), SRT (Shortest

    Remaining Time), Mayor Tasa De Respuesta y Colas Multi-Nivel, métodos descritos

    anteriormente.

    “La planificación dinámica del mejor resultado es el método utilizado en la mayoría de los

    sistemas en tiempo real comercializados en la actualidad. Cuando llega una tarea, el sistema le

    asigna una prioridad en función de sus características. Normalmente, se emplea alguna forma

    de planificación por plazos, como puede ser la de primero el plazo más próximo. En general, las

    tareas son aperiódicas, por lo que no es posible un análisis estático de planificación. Con este

    tipo de planificación, no se sabe si se va a cumplir una restricción de tiempo hasta que vence el

    14

  • plazo o la tarea termina. Esta es la mayor desventaja de esta forma de planificación. Su

    ventaja está en la facilidad de implementación.”

    El uso de múltiples colas, cada una de ellas de distintas prioridades (diferente al mecanismo de

    Colas Multi-Nivel), recorridas con el mecanismo de turno rotatorio, se presenta como la mejor

    opción de implementación para los requerimientos de BESA, ya que la característica de Event –

    Driven requiere de una selección de tareas basada en prioridades, y de rotación equitativa,

    además, su fácil implementación garantiza una rápida ejecución del planificador, evitando de

    esta forma la inanición de procesos14.

    2.3.3. Mecanismos de sincronización

    Los sistemas operativos de tipo tiempo real (RTOS) soporten la concurrencia de tareas. Esta

    característica tiene varios niveles de complejidad dependiendo el tipo de relación que tienen

    entre sí las tareas que requieren el uso del procesador, así: estas tareas pueden ser

    independientes y no conocer la existencia de las otras (competencia), tener conocimiento

    indirecto de las otras tareas (cooperación por compartimiento) o tener conocimiento directo de

    las otras tareas (cooperación por comunicación). Las anteriores relaciones llevan a situaciones

    de competencia y de cooperación que deben ser soportadas por el sistema operativo o tenidas

    en cuenta por el programador.

    Para que un sistema soporte la concurrencia sincronizada de tareas, en éste se deben realizar

    dos acciones fundamentales: la Administración de recursos globales y la Gestión óptima de los

    recursos. Para llevarlas a cabo se han diseñado los mecanismos de sincronización. Estos

    permiten solucionar los tres problemas principales de la sincronización entre tareas: la exclusión

    mutua, el inter-bloqueo y la inanición de las tareas.

    El problema de la exclusión mutua se da cuando un recurso puede ser usado por una sola tarea

    y no puede compartir su tiempo con otras hasta que la tarea salga de la sección de programa

    que lo usa, estos recursos son llamados recursos críticos y la región del programa que los usa

    son llamadas regiones críticas. El sistema operativo junto con otros servicios se deben encargar

    de que sólo una tarea opere en su sección crítica a la vez. Por otro lado el inter-bloqueo se

    presenta cuando dos tareas (o más) esperan la liberación de un recurso compartido, y a s vez,

    esta espera retiene la liberación de otro recurso. Por último la inanición de una tarea se da

    cuando el SO le concede el uso de un recurso a determinadas tareas periódicamente y se impide

    que alguna o algunas tareas determinadas vuelvan a tomar el control del procesador, por

    ejemplo por ser de baja prioridad.

    14 MILENKOVICH, Milan. “Sistemas Operativos: Conceptos y Diseño”. Mc. Graw Hill, Madrid, España. 1998.

    15

  • Los problemas de sincronización que aparecen por la concurrencia de tareas son

    fundamentalmente los mismos tanto para un sistema monoprocesador, donde se intercalan las

    tareas, como para un sistema multiprocesador, donde también hay superposición

    (simultaneidad) en la ejecución de tareas.

    Las soluciones a los anteriores problemas se pueden agrupar en tres tipos:

    • Por software, estas son implementadas en el código de programa de usuario. Los

    Algoritmos de Dekker y de Peterson ofrecen una solución de éste tipo15.

    • Desde sistema operativo, a través de funcionalidades como los semáforos y los

    mensajes.

    • Por Hardware, como, por ejemplo, el uso de inhabilitación por interrupciones.

    El primer tipo es propenso a errores y a generar sobrecarga en el sistema. Las soluciones por

    Hardware usan instrucciones de máquina por lo que no son soluciones generales. Estos

    problemas no se presentan en las soluciones implementadas como servicios del sistema

    operativo o del lenguaje de programación, por esto y otras ventajas adicionales, se han

    convertido en las estrategias de sincronización de más éxito. Dado que cubren las necesidades

    de facilidad de programación y portabilidad, necesarias para el desarrollo del proyecto, serán las

    óptimas para cumplir los objetivos planteados. Explicamos su funcionamiento básico a

    continuación.

    Semáforos

    El principio de los semáforos es la cooperación entre las tareas por medio de la generación de

    señales y usados como mecanismos de sincronización permiten que se cumpla la exclusión

    mutua entre tareas y evitan el interbloqueo. Los semáforos son variables que se modifican a

    través de dos tipos de señales, una señal que indica que una tarea está esperando un resultado

    y que llamaremos down y una señal que indica que se ha producido el resultado la cual

    llamaremos up con la cual el semáforo debe “dejar pasar” una de las tareas que se encontraban

    “esperando” en ese semáforo.

    La variable semáforo puede iniciar en un valor no negativo y se debe disminuir en una unidad

    cuando haya down y aumentar cuando se produzca up. Si al llegar un down el valor del

    semáforo se hace negativo entonces la tarea que generó el down se bloquea ya que dicho valor

    indica que no hay resultados disponibles para la tarea que los solicita. Ahora, cuando se

    produce una señal up hacia cierto semáforo, significa que se produjo un resultado de interés

    para las tareas que hayan estado esperando o para las que van a llegar a esperar, por lo cual se

    incrementa en una unidad el valor del semáforo respectivo.

    15 STALLINGS, William. “Sistemas Operativos”. Prentice Hall. Madrid, España. 2001.

    16

  • Para decidir a cual de las tareas que produjeron un down en determinado semáforo se le debe

    dar el control del procesador cuando ocurra el siguiente up (debido a la liberación de un recurso,

    por ejemplo) se ha encontrado que la política más equitativa es FIFO, esta decisión es

    independiente del mecanismo de planificación del sistema operativo. FIFO es la política para

    semáforos más apropiada para el RTOS a implementar ya que disminuirá el riesgo de inanición

    de una tarea en el acceso a un recurso. Una vez una tarea haya solicitado acceso al semáforo

    ninguna tarea de más prioridad podrá quitárselo.

    Los semáforos permiten solucionar el problema de la exclusión mutua, mediante identificadores

    que avisen con una señal down cuando se entra en la sección crítica de un programa. Sin

    embargo, el éxito del uso de semáforos depende de su correcto manejo, debido a que la falta del

    uso de alguna de estas dos señales puede llegar a bloquear el sistema.

    Mensajes

    El paso de mensajes entre procesos permite que las tareas cooperantes se sincronicen y que a

    su vez intercambien información. El servicio de mensajería es útil en sistemas distribuidos, en

    sistemas multiprocesador y monoprocesador de memoria compartida. Por lo cual será de gran

    utilidad para la comunicación entre agentes.

    Por un lado tenemos el intercambio de información. Para intercambiar información se necesita

    al menos un sencillo protocolo de comunicación que permita la sincronización de los mensajes.

    El esquema más sencillo consiste en el uso de las primitivas send y receive. Con estas primitivas

    se pueden generar distintas configuraciones: bloqueo de la tarea tras generar send hasta que

    reciba una respuesta, o no bloqueo, bloqueo tras generar receive hasta encontrar un mensaje o

    no bloqueo. Según el tipo de sistema a desarrollar existen diferentes técnicas para solucionar

    problemas como la pérdida de los mensajes o el bloqueo indefinido de las tareas al esperar un

    mensaje que nunca llega.

    Para enviar y recibir mensajes hacia y desde la tarea correcta se usa el direccionamiento directo

    e indirecto, para cada primitiva. La primitiva send con direccionamiento directo requiere tener

    identificadores para cada tarea, el cual debe ser enviado al llamar la primitiva. En el caso de

    direccionamiento indirecto los mensajes se envían a una estructura de datos formada por colas

    (denominada buzón), en las cuales se almacena temporalmente la información hasta que un

    receptor la lee, es análogo a un arreglo de buzones donde cada uno ha sido creado para

    establecer distintos tipos de relaciones entre las tareas. Estas relaciones pueden ser de un

    emisor a un receptor (comunicación punto a punto), de un emisor a muchos receptores o de

    muchos emisores a un receptor, para éste último caso el buzón es denominado puerto.

    17

  • La primitiva receive con direccionamiento directo requiere que cada tarea tenga conocimiento

    anticipado sobre qué tarea o tareas le enviarán información, pero para los casos en que es

    imposible predecir de qué tareas se va a recibir un mensaje en cada instante, se usa el

    direccionamiento implícito, en éste, al ejecutar la primitiva receive, la tarea receptora espera el

    identificador de la tarea que da origen al mensaje, proveniente de la ejecución de un send.

    Cuando sucede un envío con exitosa recepción, el sistema puede realizar una copia del mensaje

    en una cola o buzón, o simplemente transferir el apuntador a la información, lo cual la

    convertiría en memoria compartida. Cuando se realiza copia del mensaje se asegura que no se

    modificará indeseablemente el contenido de la información, sin embargo, éste método es lento,

    ya que a medida que crece el tamaño de la información crece el tiempo de transferencia,

    además utiliza más memoria para la creación de los buzones pero evita usar recursos adicionales

    para proteger la información. El traslado del apuntador utiliza eficientemente la memoria, pero

    se debe tener cuidado (usando los mecanismos adecuados) para no modificar los mensajes

    originales en casos indeseados.

    Cuando se quiere minimizar la carga de procesamiento y minimizar el coste de almacenamiento,

    requerimientos de este proyecto, se usa un formato de mensajes de tamaño corto y fijo apoyado

    en una organización de memoria por ejemplo pool de buffers, concepto que se ampliará en la

    sección 2.3.4. En el formato del mensaje se incluye algunas veces información sobre la prioridad

    del mensaje, para soportar el caso en el que no se desee tomar los mensajes de un buzón con

    política FIFO. Por otro lado el paso de mensajes permite la sincronización respecto a los recursos

    del sistema, es decir, soporta la exclusión mutua16.

    2.3.4. Manejo de memoria

    Dadas las características de memoria de los microcontroladores actuales, se necesita una

    estrategia para el manejo de memoria que no consuma muchos recursos del dispositivo y que no

    sobre cargue el procesador. La estrategia más sencilla es definir cuales son los tamaños de

    palabra más útiles para el sistema operativo y crear arreglos de buffers de estos tamaños, y

    solicitarlos al sistema a medida que se vayan necesitando.

    La anterior estrategia es conocida como pool of buffers. Presenta la ventaja de requerir mínimo

    sobre costo en el uso del procesador ya que elimina la búsqueda de espacios de memoria libres

    al dejarlos de tamaño fijo. Sin embargo puede llegar a ser ineficiente el uso de la memoria

    cuando se reserva un espacio mayor al máximo de los buffers necesario o se usa menos espacio

    que el menor de los reservados. Además, el programador debe ser muy cuidadoso de liberar los

    16 MILENKOVICH, Milan. “Sistemas Operativos: Conceptos y Diseño”. Mc. Graw Hill, Madrid, España. 1998.

    18

  • semáforos de protección una vez han sido usados los buffers, para permitir la posterior

    reutilización de los mismos.

    19

  • 20

  • 3. DESARROLLO

    Se comenzó por analizar los requerimientos de la arquitectura BESA; con base en estos se

    explica como se seleccionó el RTOS para soportar la construcción y aplicación del modelo. Se

    adaptó el modelo BESA a las características de un micro-controlador, luego se diseño y aplicó

    un protocolo de comunicación para la extensión del modelo a un ambiente distribuido que usa

    dos microcontroladores.

    3.1. Requerimientos de BESA

    En el capítulo 2 se describieron las características de Concurrencia, Sincronización y

    Comunicación entre tareas como los principales requerimientos del modelo BESA. Como se

    mostró en el aparte de sistemas operativos, estas características son soportadas por los RTOS

    actuales, pero adicional a estos requerimientos surge uno nuevo, ya que al ser implementado

    sobre un microcontrolador se hace crítica la capacidad de memoria del hardware. En

    consecuencia es indispensable tener en cuenta que el modelo se pueda implementar sobre las

    condiciones de memoria del dispositivo seleccionado.

    3.2. Selección del RTOS y de la Familia de Microcontroladores

    Se realizó una investigación sobre el funcionamiento de un RTOS en un micro controlador

    desarrollando un kernel básico sobre un PIC18F452. Luego se buscaron los RTOS disponibles en

    el mercado, buscando que tuvieran las características necesarias para implementar el modelo

    BESA. Teniendo en cuenta criterios de bajo costo y facilidad de adaptación a nuestras

    necesidades se seleccionó el RTOS freeRTOS y se estudiaron los posibles microcontroladores

    sobre los cuales desarrollar la aplicación.

    3.2.1. Búsqueda y Selección del RTOS

    El Sistema Operativo necesario para la implementación de BESA debe ser como primera medida

    de tiempo real, ya que se requiere dar respuesta a los eventos con la mayor rapidez posible y de

    manera simultánea. Por esta razón el planificador debe dar tiempo de procesamiento a todas las

    tareas que lo requieran, y contar con la característica de expropiación para permitir que tareas

    de mayor prioridad tomen el control del procesador cuando lo necesiten. Además el SO debe

    brindar un mecanismo para la creación y eliminación de tareas, y la posibilidad de suspenderlas

    y reactivarlas, ya sea a una o a todas simultáneamente, en cualquier instante del

    procesamiento.

    21

  • El RTOS debe brindar la posibilidad de utilizar Semáforos, mecanismo seleccionado como la

    mejor opción para solucionar los problemas de Sincronización, ya que permite el uso adecuado

    de los espacios de memoria compartida a los que varias tareas (canal, comportamientos y otras)

    pueden acceder, como el estado y los buffers utilizados para las transmisiones de un contenedor

    a otro.

    Un motivo por el cual una tarea puede llegar a bloquearse, es el envío no exitoso de un mensaje

    a otra tarea; esta razón trae consigo la necesidad de un servicio de transmisión de mensajes

    entre tareas, que permita la acumulación de mensajes cuando el planificador no permita su

    inmediata recepción por tener bloqueada la tarea destino. Esto se logra por medio de colas tipo

    buzón, en las cuales se puedan almacenar temporalmente eventos que serán atendidos una vez

    la tarea destino sea desbloqueada y pueda recibir y dar tratamiento a los eventos enviados.

    La búsqueda de un sistema operativo arrojó como resultados varios RTOS de libre distribución

    desarrollados por distintas organizaciones y versiones de demostración de algunas empresas. De

    todos estos destacamos aquí dos de los más sobresalientes y que más se acomodaban a

    nuestras necesidades, SALVOTM y freeRTOSTM.

    SALVOTM, del grupo PumpkincTM, fue diseñado expresamente para sistema embebidos, cuyas

    aplicaciones típicas usan entre 1 y 2K bytes de ROM, y entre 50 y 100 bytes de RAM. Cumple

    con el criterio de multitarea cooperativa, servicio de eventos, bloqueo y suspensión de tareas, y

    con muchos otros aspectos necesarios descritos anteriormente para el desarrollo del proyecto.

    SALVOTM puede implementar en una gran cantidad de dispositivos, como son:

    • Familia 8051 y derivados.

    • ARClite microRISC.

    • ARM® ARM7TDMI®

    • Atmel® AVR® y MegaAVR™

    • Motorola M68HC11

    • TI's MSP430 Microcontriolador de baja potencia

    • Microchip PIC12|14000|16|17|18 PICmicro® MCUs

    • TI's TMS320C2000 DSPs

    Sin embargo, la versión demo de SALVOTM que puede ser adquirida libremente permite crear

    únicamente 3 tareas como máximo, lo que impediría en gran parte un buen aprovechamiento

    del mismo17. La adquisición de la versión completa implica una inversión económica que no está

    contemplada en el proyecto, razón de peso para desistir de este RTOS.

    17 SALVOTM, http://www.pumpkinc.com, Febrero 15 de 2004.

    22

    http://www.pumpkinc.com/

  • FreeRTOSTM ofrece bajo consumo memoria RAM puesto que ha sido desarrollado específicamente

    para aplicaciones con sistemas embebidos (microcontroladores). Presenta además tres modelos

    posibles de asignación de memoria para la implementación de las aplicaciones. Utiliza un tipo de

    planificación expropiativa que implementa colas por cada nivel de prioridad, recorridas cíclica y

    equitativamente según el mecanismo FIFO; también ofrece un sistema de sincronización por

    medio de semáforos binarios.

    FreeRTOSTM es de libre distribución, es de fácil implementación y entendimiento gracias a que se

    puede acceder libremente a su documentación. FreeRTOSTM también puede ser implementado

    en una gran variedad de dispositivos18:

    • LPC2106, LPC2124 and LPC2129 (ARM7). Incluye código para el manejo de I2C. Renesas

    H8S2329 (Hitachi H8/S) con un demo de EDK2329.

    • Atmel AT91SAM7 o las familias (AT91SAM7S32, AT91SAM7S64, AT91SAM7S128,

    AT91SAM7S256). Incluye código para el manejo de USB para IAR Kickstart.

    • AT91FR40008 con demo de ATEB40X .

    • MSP430 con manejador de LCD.

    • HCS12 (MC9S12C32)

    • Cygnal 8051 / 8052

    • Microchip PICMicro (PIC18)

    • Atmel AVR (MegaAVR) con código de demostración STK500.

    • RDC8822 Microcontroller (AMD clon embebido del 186) con demo para Flashlite 186

    SBC.

    • PC [corre con FreeDOS u otro DOS]

    FreeRTOSv2.6.0 ofrece todas las características necesarias para la correcta implementación de

    la arquitectura BESA, así como servicios que facilitaron las pruebas ejecutadas en el transcurso

    del proyecto. Los códigos y la documentación pueden ser descargados de Internet y traen

    adjunto tres programas de demostración que sirven para familiarizarse con el RTOS, sirviendo

    de punto de partida para nuevas aplicaciones. Se puede observar que este sistema operativo

    tiene más oportunidades de migración a otros procesadores que los ofrecidos por SALVOTM, y por

    consiguiente mayores aplicaciones posibles para el futuro de BESA-ME. Además cuenta con un

    foro en la red donde es posible aclarar dudas y compartir inconvenientes y soluciones junto con

    los demás usuarios y los desarrolladores del RTOS. Todas estas características llevaron a tomar

    la decisión de implementar FreeRTOSTM como sistema operativo soporte a la plataforma BESA-

    ME desarrollada.

    18 FreeRTOSTM, www.freertos.org. Mayo 25 de 2005.

    23

    http://www.freertos.org/

  • 3.2.2. Selección de la Familia de Microcontroladores

    La familia de microcontroladores fue escogida con los siguientes criterios:

    • Debe ser soportada por el RTOS escogido. (freeRTOSTM)

    • Se analizó que tuviera la memoria suficiente para soportar el RTOS seleccionado y dejar

    libre la memoria necesaria para el código BESA-ME.

    • El tercer criterio fue que ofreciera un módulo para la comunicación con otros dispositivos

    microcontroladores, para permitir que agentes de distintos contenedores pueden

    interactuar.

    • Para la generación de interrupciones interpretadas como eventos en el contesto BESA-

    ME y la interacción con otros dispositivos hardware como respuesta a estos, se observó

    que ofreciera un número de puertos y periféricos considerable.

    • Finalmente se tuvo en cuenta la familia de microcontroladores más usados en el

    contexto académico de los proyectos desarrollados en la Carrera de Ingeniería

    Electrónica de la Pontificia Universidad Javeriana, en el cual se desarrolla BESA-ME.

    Cualquiera de los sistemas embebidos que se desee implementar en la práctica, presentará

    como criterio más crítico, la limitación de los recursos físicos. En éste caso, los requerimientos

    de BESA indican que el recurso más limitado es el de memoria, pues esta arquitectura requiere

    del uso constante de buzones para la recepción y envío de mensajes. Además, es necesaria la

    asignación dinámica de segmentos de memoria que serán utilizados y reutilizados según la

    aplicación implementada. El stack requerido por las tareas para guardar su información cuando

    se produce un cambio de contexto, y las estructuras propias de BESA implican también un

    espacio de memoria. El continuo manejo de colas, (tanto para planificación de tareas, como

    para los comportamientos y eventos del sistema) que serán modificadas y leídas por distintas

    tareas (las colas son memoria compartida), implica también el manejo de semáforos, que

    también consumen memoria, para la correcta sincronización en el acceso a los espacios de

    memoria que lo necesiten. Todos estos aspectos demuestran porque el aprovechamiento de la

    memoria al máximo es un aspecto crítico del presente proyecto.

    De esta forma, los criterios de selección del microcontrolador para el proyecto, están ligados con

    la selección del RTOS freeRTOS. Este RTOS presenta demostraciones específicas para el

    microcontrolador PIC18F452 de microchip. Además, la universidad posee el hardware necesario

    para la programación de estos dispositivos (ICD2 – In Circuit Debbuger), así como el software

    de simulación y de programación (MPLAB). Adicionalmente, la plataforma ROBOCOOP19 que

    sería un ambiente óptimo para la aplicación de BESA-ME usa el microcontrolador PIC18F452.

    19 ROBOCOOP Es un proyecto de robótica distribuida, desarrollado en la Pontificia Universidad Javeriana.

    24

  • El PIC18F452 se acomoda fácilmente a las necesidades de la arquitectura BESA gracias al

    soporte que presta el sistema operativo a este dispositivo. Sin embargo, no fue el

    microcontrolador usado para finalizar el desarrollo de BESA-ME.

    Luego de realizar la construcción del Nivel Agente, expuesto más adelante, se encontró que la

    capacidad de memoria del PIC18F452 sólo permitía la creación de 1 agente y 2

    comportamientos, razón por la cual se decidió realizar una migración de freeRTOSTM a otro

    microcontrolador de la misma familia pero con más capacidad de memoria. Se escogió el

    PIC18F8720, por las características que se muestran en la Tabla 1.

    Para lograr esto fue necesario modificar el archivo p18f8720.lkr que viene incluido en los

    archivos del compilador mcc18 de Microchip para el lenguaje de programación C. Estas

    modificaciones fueron necesarias debido a que el manejo de memoria que hace freeRTOSTM

    requiere que se defina un gran bloque de memoria sobre el cual se separan los bytes de RAM a

    medida que se solicitan (ver anexo C).

    PIC18F452 20 PIC18F8720 21

    Memoria de Programa (Bytes) 32K 128K

    Memoria de Programa (Instrucciones) 16384 65536

    Memoria de Datos (Bytes) 1536 3840

    Memoria de Datos EEPROM (Bytes) 256 1024

    Fuentes de Interrupciones 18 18

    Tabla 1. Comparación de los recursos de memoria entre PIC18F452 y PIC18F8720.

    Realizando esta migración de freeRTOS se demostró parte de la fácil implementación de la

    arquitectura BESA-ME en una gran variedad de microcontroladores, ya que a Nivel de Agente la

    migración sólo depende de que el RTOS, la capa inferior de la arquitectura, sea portada al

    dispositivo deseado. Esta familia de microcontroladores está siendo usada además en los

    proyectos de investigación del grupo SIRPP

    22 de la Pontificia Universidad Javeriana. De esta

    forma, la plataforma BESA-ME será la base de futuras aplicaciones tanto para SIRP como para

    aquellos estudiantes que deseen enfocar el desarrollo de sus proyectos por medio de sistemas

    Multi-Agente.

    20 MICROCHIP, PIC18FXX2 Data Sheet, Microchip Technology Inc 2002. 21 MICROCHIP, PIC18F6520/8520/6620/8620/6720/8720 Data Sheet, Microchip Technology Inc 2002. 22 SIRP, Sistemas inteligentes, Robótica y Percepción. Grupo de Investigación de la Facultad de Ingeniería

    Electrónica, Pontifica Universidad Javeriana.

    25

  • 3.2.3. Apropiación del RTOS

    FreeRTOSTM presenta tres programas de demostración que son descargados junto con el sistema

    operativo. Cada uno de estos demos presenta características distintas con el fin de que el

    usuario se acomode a distintos aspectos del sistema. El circuito inicial creado para la realización

    de las pruebas se basó completamente en las necesidades de dichos demos.

    Gestión de Memoria

    FreeRTOSTM presenta tres esquemas para el manejo de memoria. La asignación estática de

    espacios de memoria se presenta como opción para sistemas en la cuales no se creará ni se

    eliminarán dinámicamente tareas, colas o semáforos; de tal forma que esta distribución se

    realiza sólo una vez en el sistema. El segundo esquema de planeación, asigna espacios de

    memoria que luego podrán ser liberados, sin embargo puede llegar a se ineficiente en su

    funcionamiento, si los tamaños asignados en la creación de diversas variables son distintos,

    presentando indeseablemente segmentación de memoria. Y por último, el tercer esquema

    maneja dinámicamente la asignación de la memoria RAM, pero se sugiere que sea utilizado

    aplicaciones con computadores de escritorio, ya que requiere de mucho más procesamiento.

    BESA-ME utilizará entonces el primer modelo de manejo de memoria, ya que no requiere la

    liberación dinámica de espacios, puesto que las tareas creadas inicialmente, no serán destruidas

    nunca. Además es el esquema de más fácil aplicación, y el que mejor se desempeña en

    dispositivos microcontroladores.

    Pruebas Realizadas

    Luego de confirmar el correcto funcionamiento del RTOS, se procedió a realizar la primera

    aproximación de las tareas necesarias para la implementación de los requerimientos de BESA.

    Para esto se realizaron las siguientes pruebas:

    1. Una tarea envía a otra un dato, éste dato es puesto en una cola compartida de tamaño

    1. La tarea que envía el dato (productora) se duerme durante un tiempo prudencial

    para poder apreciar fácilmente el suceso (aproximadamente 500ms). Cuando la tarea

    consumidora recibe el dato, lo muestra en el respectivo LED del puerto B, configurado

    como salida. Cuando el productor se despierta, incrementa el valor anterior, y manda un

    nuevo dato, para que el consumidor lo muestre.

    2. Ahora, aparece una tercera tarea que envía con una frecuencia menor, a la misma cola

    un dato negativo, de tal forma que cada vez que llega un dato el consumidor

    decrementa en uno el orden de muestra de los LEDs. En esta segunda prueba, las

    tareas funcionan perfectamente, no se pierden datos ni se alteran los mismos.

    26

  • 3. En la tercera prueba, una cuarta tarea aparece como productora, introduciendo un valor

    constante de 2 que se suma al valor acumulado, dando la apariencia de un salto en la

    secuencia de los LED. En esta última prueba todos los productores presentan la misma

    prioridad, y el consumidor tiene una prioridad de cero. Con estas características, el

    sistema no funciona correctamente, se pierden datos. Sin embargo aumentando el

    tamaño de la cola N (N = Número de productores), el sistema regresa a la normalidad.

    Cuando el consumidor tiene mayor prioridad, ningún dato se pierde, aun cuando la cola

    sea de tamaño unitario.

    Una vez identificadas a plenitud las características de los métodos de envió y recepción de

    mensajes por medio de colas, la creación y bloqueo de tareas con las primitivas del RTOS, se

    procedió a la construcción del modelo abstracto de BESA.

    3.3. Construcción del Modelo BESA-ME

    Diseñado para ser implementado en un microcontrolador, en el modelo BESA-ME se modificaron

    algunos servicios originales del modelo abstracto planteado por BESA, con el objetivo de ahorrar

    memoria y mejorar velocidad de respuesta, pero conservando siempre la esencia de la

    arquitectura.

    3.3.1. Descripción General

    Dentro de las características que fueron modificadas se encuentran las condiciones booleanas,

    que se presentan en el mecanismo selector de guardas. Las condiciones booleanas ya no se

    verificarán para la activación de los comportamientos asociados. Para éste proyecto, no son de

    vital importancia. Su ausencia permitirá la reducción de gran parte el tiempo de filtrado de los

    eventos en los puertos, y la minimización del uso de memoria para la ubicación de los eventos

    que llegan a los puertos.

    Igualmente el servicio de directorio de agentes, fue simplificado eliminando la sección de

    páginas amarillas. En consecuencia, el usuario puede hacer envíos a un agente sólo si conoce el

    nombre del agente, el cual es llamado alias en el contexto BESA-ME.

    Los eventos recibidos por un agente, son almacenados directamente en una cola FIFO (tipo

    buzón) de eventos entrantes, propia del canal de cada agente. Se decidió recibir estos eventos

    por recopia y no por apuntador para garantizar la seguridad de la información pero en

    detrimento de la velocidad de respuesta a los eventos. Estos eventos son ubicados en los

    puertos correspondientes según el tipo de evento al que pertenezca. Existen tantos puertos

    como tipos de eventos declarados inicialmente. Cuando un evento llega a un puerto, se crea un

    27

  • mensaje especial para ser enviado a los correspondientes comportamientos. Éste mensaje

    contiene el apuntador a la función que se debe ejecutar, y el dato proveniente del evento BESA

    inicial. Cuando el mensaje llega a la cola de recepción del comportamiento, éste se desbloquea,

    e invoca a la función correspondiente mandándole como parámetro el dato asociado a evento

    BESA. Esta función asociada, es la que el usuario final podrá programar directamente. En las

    funciones asociadas también se pueden presentar envíos de datos a otros agentes, ya sean del

    mismo contenedor o de otro.

    En el modelo abstracto de BESA, a nivel social, existen agentes mediadores que pueden servir

    como despachadores de eventos entrantes al contenedor, para distribuirlo a los agentes

    destinatarios. Un agente mediador puede servir también para manejar mecanismos de

    cooperación y asignación de tareas.

    Sin embargo, el modelo de implementación BESA – ME no contiene en su sistema agentes

    mediadores ya que la distribución de eventos, se realiza directamente a través del servicio de

    envíos dentro del contenedor cuando son originados por otro agente, o desde una tarea

    adaptador, encargada de recibir los eventos desde otro contenedor o desde las rutinas de

    interrupción del microcontrolador, con el objetivo de repartirlos adecuadamente. Por tal razón en

    lugar del nivel social, en BESA-ME hablaremos de nivel sistema.

    Otra característica importante es que, tras analizar el concepto de contenedor de BESA, como el

    espacio donde habitan y cumplen sus ciclos de vida los agentes, hemos decidido abstraer cada

    microcontrolador como un contenedor. El contenedor debe ser visto como el medio de

    interacción local de los agentes.

    Las estructuras y funciones de cada uno de los componentes del sistema BESA-ME se describirán

    a continuación separadas en dos niveles: El nivel agente en el cual no existe el contenedor y el

    nivel sistema donde inician las interacciones entre agentes.

    3.3.2. Nivel Agente

    La implementación del modelo de agente BESA-ME, requiere de mínimo dos tareas para cumplir

    con el modelo BESA, estas son: la tarea encargada de cumplir las funcionalidades del canal y la

    que ejecuta cada comportamiento. En el caso más sencillo de agente se debe tener mínimo un

    comportamiento. Además, ligados a la creación del agente, deben existir mecanismos de

    identificación para ser usados por las tareas canal y comportamiento.

    Estas tareas son re-entrantes, en consecuencia, el mismo código es usado cada vez que se crea

    un agente o un comportamiento adicional, lo cual reduce la cantidad de memoria de programa

    28

  • usada al escalar el sistema. En la Figura 3 se muestra la estructura implementada del agente,

    que se explica a continuación.

    Behavior_1

    Behavior_2

    Guard_1

    Guard_X

    Port_

    1

    Guard_1

    Guard_Z

    Port_

    M

    Guard_2

    Guard_1

    Guard_Y

    Por

    t_2 Guard_2

    Guard_2

    Events

    AGENT

    Estado

    Buzón

    CHANNEL

    Beh_1

    Beh_2

    Beh_N

    Behavior_N

    Action_1

    Action_2

    Action_N

    Figura 3. Modelo de Agente en BESA-ME

    Estructuras Asociadas a la Identificación del Agente

    El agente esta constituido por sus dos tareas básicas (Canal y Comportamiento) y por dos

    estructuras que permiten que el agente acceda a la información del sistema y que el sistema

    obtenga información de él, estas estructuras son:

    Figura 4. Estructuras asociadas al Agente

    Estructura Agente (stAgentBESA): Contiene datos como el estado del agente, el apuntador a la

    estructura del canal asociado a dicho agente, una lista de los comportamientos que se

    29

  • encuentran asociados a dicho agente, y por último una estructura stAgentHandler que contiene a

    su vez el Alias y el AgentID, el cual para el caso de BESA-ME no es usado, ya que basta con el

    Alias para identificar al agente, sin embargo éste se deja allí para futuras aplicaciones. También

    está contenido aquí el apuntador a la cola de recepción del canal para la recepción de eventos.

    Podemos ver entonces que con el conocimiento del Alias, se puede acceder a toda la información

    relacionada con el agente. En la Figura 4 se observa el código con el que fue implementada.

    Construcción del Canal

    El canal es el encargado de recibir los eventos provenientes del entorno o de otros agentes, para

    luego asociarlos al puerto correspondiente, de esta forma el dato es enviado a los

    comportamientos indicados por la guarda asociada al puerto. Para esto, el canal debe contar,

    como mínimo, con un buzón de entrada (cola de recepción), un puerto por cada tipo de evento y

    una guarda que asocie el evento a un comportamiento.

    Estructura Canal (stChannelBESA): Contiene un apuntador a la cola de recepción del canal

    (xQueueRxChannel), un arreglo de apuntadores a los diferentes puertos que lo comprenden

    (apChannelPorts) y una variable para indicar el número de puertos (número de eventos) que

    tiene el canal (NumPortChannel). En la Figura 5 se observa el código con el que fue

    implementada.

    Figura 5. Estructura asociada al canal.

    El tamaño del arreglo de apuntadores está definido por el máximo número de puertos que el

    usuario haya establecido para el canal. Nótese que no se maneja un sistema de colas de

    almacenamiento de eventos retenidos, debido a que no se implementaron las condiciones

    booleanas de las guardas.

    Estructura Puerto: (stPortBESA) Cada puerto contiene una constante que indica el tipo de evento

    al que corresponde (xEventType), una variable que indica el número de asociaciones definidas

    para el tipo de evento (NumBindGuards) y un arreglo de apuntadores a guardas que contienen

    la información necesaria de cada asociación del puerto (apBindGuard).

    Estructura Guarda: (stGuardBESA) Tiene un apuntador a la función de tratamiento asociada al

    tipo de evento que debe ejecutarse en el comportamiento (*ActionFunction) y un apuntador a la

    30

  • cola de recepción del comportamiento asociado (xQueueRxBehavior). En la Figura 6 se observa

    el código con el que fue implementada la guarda BESA y el puerto BESA.

    Figura 6. Estructura asociada a los Puerto y a las Guardas.

    Estructura Mensaje para el Comportamiento: (stMsgBehavior) Tiene un apuntador a los datos

    que se envían en el evento (pEventData) y un apuntador a la función de tratamiento asociada al

    tipo de evento (*ActionFunction) que debe ejecutarse en el comportamiento. De esta forma el

    usuario sólo tendrá que realizar la programación correspondiente a las funciones asociadas, con

    los datos entrantes al agente. En la Figura 7 se observa el código con el que fue implementado

    el tipo Mensaje a comportamiento.

    Figura 7. Estructura del Mensaje recibido por el Comportamiento.

    Para la ejecución del canal se creó una tarea a partir de los servicios del RTOS, la tarea asociada

    al canal se denomina vChannel. Esta es la encarga de revisar constantemente el buzón de

    entrada de mensajes para saber si ha recibido un evento; si no hay un evento pendiente en la

    cola, esta tarea se bloquea hasta que alguno llegue. Cuando se recibe un evento, la tarea debe

    verificar el tipo de evento y compararlo con los puertos existentes; si no existe un puerto para

    este tipo de evento el canal no ejecuta ninguna operación y el evento es ignorado; informándole

    además al transmisor inicial que el evento no pertenece al sistema. Al identificar el puerto

    correspondiente, se evalúa el número de asociaciones existentes, para la correcta ubicación del

    evento y se accede a las guardas para crear el mensaje y enviarlo al comportamiento indicado

    por la guarda.

    La tarea vChannel recibe como parámetro el apuntador a la estructura del canal pChannel, para

    así poder tener acceso a las demás estructuras. Dentro de esta tarea se crea el mensaje que se

    31

  • envía al comportamiento, como se muestra a continuación en pseudo código de la tarea

    vChannel:

    void vChannel (void *pvParameters)

    {

    Creación de los apuntadores a las estructuras stPort, stGuard, stChannel, stEvent y stMsgBehavior;

    Asignación de los apuntadores a las estructuras creadas.

    for( infinito )

    {

    if ( hay algún evento nuevo en la cola de recepción del canal? )

    {

    for ( Se recorre cada uno de los puertos del arreglo de puertos )

    {

    If ( el tipo de evento recibido es igual al tipo de evento del puerto actual?)

    {

    For ( Recorrer el arreglo de guardas para el puerto actual )

    {

    Armar el mensaje para el comportamiento indicado en la guarda;

    Enviar el apuntador del mensaje a la cola de recepción del comportamiento indicado por

    la guarda actual;

    if ( envió no exitoso )

    { intentar de nuevo el envío; }

    }

    }else

    {

    Aumentar la posición del apuntador para cambiar de posición en el arreglo de puertos;

    }

    }

    }

    }

    Construcción del Comportamiento

    El comportamiento es el encargado de recibir los mensajes que contienen el dato y el apuntador

    a la función de tratamiento que haya sido determinada por el usuario para el tipo de evento.

    Debe tener entonces una cola de recepción para almacenar los mensajes. Además es necesario

    acceder al estado del agente para obtener información del estado y poder modificarlo.

    La estructura asociada al Comportamiento es:

    Estructura Comportamiento: Tiene un apuntador a la cola de recepción del comportamiento

    (xQueueRxBehavior) y un apuntador al “Handler” del Agente (pAgentHandler) que permite

    acceder a su estructura y por ende al estado del agente. La estructura de los comportamientos

    se muestra en la figura 8.

    32

  • Figura 8. Estructura asociada al Comportamiento.

    Para la ejecución del comportamiento se creó una tarea a partir de los servicios del RTOS, la

    tarea asociada al comportamiento se llama vBehavior. Es la encargada de revisar

    constantemente su cola de recepción para verificar la llegada de mensajes. Cuando llega un

    mensaje, el comportamiento debe propiciar la ejecución de la función de tratamiento, la cual

    debe recibir como entrada el apuntador al evento BESA que fue enviado en el mensaje y un

    apuntador al Agente al cual pertenece el comportamiento, a través del cual puede acceder al

    estado, si así lo requiere el usuario. A continuación se presenta el pseudo código de vBehavior:

    void vBehavior ( void *pvParameters )

    {

    Creación de las las variables tipo stBehaviorBESA y stMsgBehavior;

    Creación y asignación de los apuntadores a las estructuras creadas;

    for ( infinito )

    {

    if ( llegó algún evento a la cola de recepción del comportamiento )

    {

    Se invoca la función de acción según lo indica el apuntador en el mensaje que

    acaba de llegar y se le mandan los datos recibidos;

    }

    }

    }

    El Estado

    El estado es un espacio de memoria compartida que sólo debe ser accedido desde las acciones

    ligadas a los comportamientos. A través del estado los comportamientos pueden actualizar

    información relativa al agente y a los procesos que éste ejecuta.

    Su implementación se realizó a través de una cola con capacidad para almacenar una apuntador

    de tipo void. Se crearon las funciones TakeStateData y GiveStateData para permitir al usuario

    modificar el estado en una forma segura. Su uso se explica en el manual del usuario que se

    encuentra en el anexo A.

    33

  • Simulación del Envío de un Evento al Canal y Ejecución de sus Comportamientos

    Para verificar el correcto funcionamiento de la estructura de un agente, antes de expandir el

    modelo a más agentes y distintos contenedores, se realizó una prueba creando una tarea

    adicional para enviar eventos al canal.

    La tarea adicional llamada vPrueba envía al buzón del canal un determinado evento,

    bloqueándose luego de esto por un tiempo determinado; luego se despierta para repetir el

    envío. El canal recibe el evento, busca el puerto correspondiente y allí verifica la guarda para

    crear el mensaje y enviarlo al comportamiento adecuado. Una vez el mensaje llega al buzón del

    comportamiento, éste lo recibe y llama la función de tratamiento asociada para ejecutarla.

    El correcto funcionamiento de está primera aproximación del agente se observó a través de la

    ejecución de la función asociada, la cual conmutaba unos LED de acuerdo al dato recibido.

    Luego de observar el correcto desempeño del agente, se procede a aumentar el número de

    comportamientos asociados a un mismo tipo de evento. Prueba que arrojó resultados positivos

    observando la conmutación correspondiente de los LED; la última fase de estas primeras

    aproximaciones acerca de la configuración de un agente se basaron en la creación de distintos

    tipos de eventos enviados a un mismo agente, el cual activa a su vez, luego del tratamiento

    propio de cada entidad, los comportamientos asociados con sus respectivas funciones.

    3.3.3. Nivel Sistema

    Una vez la estructura de cada agente esta completa, es necesario establecer el nivel superior del

    sistema BESA, es decir, el conjunto de varios agentes funcionando en el contexto de un

    contenedor.

    34

  • ActuadorSensor

    Agentes

    BUS SERIAL I2C

    Contenedor A

    Páginas Blancas

    Administrador Local

    ActuadorSensor

    Agentes

    Contenedor B

    Páginas Blancas

    Administrador Local

    ActuadorSensor

    Agentes

    Contenedor C

    Páginas Blancas

    Administrador Local

    ActuadorSensor

    Agentes

    BUS SERIAL I2C

    Contenedor A

    Páginas Blancas

    Administrador Local

    ActuadorSensor

    Agentes

    Contenedor B

    Páginas Blancas

    Administrador Local

    ActuadorSensor

    Agentes

    Contenedor C

    Páginas Blancas

    Administrador Local

    Figura 9. Nivel Sistema en BESA-ME con el servicio de comunicación entre contenedores. El administrador

    local se encarga del manejo de los eventos.

    Un sistema de agentes implementado en BESA–ME se considera como un sistema distribuido

    compuesto por uno o varios contenedores BESA, los cuales funcionan en diversas máquinas

    físicas o virtuales, en este caso, cada contenedor esta ubicado en un microcontrolador

    (contenedor físico).

    La integración de mas de un contenedor y la posibilidad de comunicación entre los agentes

    pertenecientes a éstos a través del protocolo serial I2C, completa el modelo BESA-Micro Edition

    a nivel de sistema distribuido. En la figura 9 se observa una representación gráfica del modelo

    implementado.

    Creación del Contenedor

    BESA-ME tiene estipulado, en su modelo de implementación, que cada contenedor esta

    contenido en un microcontrolador, el cual para efectos de la comunicación necesitará un número

    de identificación fijo, el cual está estipulado por una constante denominada CONTAINER_ID a la

    cual se le deben asignar valores desde 01H hasta 80H, para un máximo de 127 contenedores.

    El CONTAINER_ID es asignado por el usuario.

    35

  • Figura 10. Estructura asociada Contenedor.

    Cada contenedor contiene una estructura necesaria para almacenar la información de los

    agentes internos y los de otros contenedores, tal como se muestra en la Figura 10 (directorio de

    páginas blancas de los agentes de todo el sistema). Además contendrá dos buffers para

    almacenar temporalmente los datos entrantes y salientes de la comunicación entre distintos

    contenedores. Esta utilización de espacios de memoria compartida (buffers, ver Figura 11) hace

    necesario el uso de sistemas de sincronización que permitan el manejo seguro de estos espacios

    de memoria. Se utilizan entonces dos semáforos propios de los servicios de freeRTOSTM, los

    cuales serán explicados en la sección de comunicación entre contenedores.

    Figura 11. Estructura de los buffer de Transmisión y de Recepción para la comunicación entre contenedores.

    El contenedor también contiene dos colas de recepción para manejar la información proveniente

    de otros contenedores. Estas colas permiten un manejo seguro del protocolo de comunicación

    entre contenedores. Hay otra cola más para la recepción de eventos BESA desde una rutina de

    interrupción.

    Los Eventos BESA en BESA-ME han sido implementados de tal forma que el usuario