martes, 9 de noviembre de 2010

Estructura general de un programa en C para sistemas embebidos

En un programa para computador común, éste puede iniciar, realizar su tarea en la función main() y cuando termina la tarea se sale de la función y retorna al sistema operativo. En los programas diseñados para microcontroladores generalmente no hay un sistema operativo al cual retornar cuando se ejecuta la función main(), y por tanto, el programa se debe diseñar para estar siempre dentro de esta función (exceptuando cuando se usa un sistema operativo en tiempo real, en donde cambia la filosofía de programación). Así, es posible el uso de ciclos que aseguren la ejecución continua del programa; interrupciones que manejen el flujo de acuerdo a la sincronización de timers o eventos externos; o sistemas más complejos que manejen sistemas operativos en tiempo real (RTOS).

Por otra parte, se debe tener en cuenta el tiempo de reacción del sistema, es decir, el tiempo que tarda en dar una salida correspondiente a una entrada determinada. Dependiendo de la aplicación, este tiempo puede ser crítico, sobre todo en sistemas que realizan varias tareas que tienen prioridades diferentes. De esta forma, de acuerdo a las necesidades de la aplicación, es posible implementar programas usando diferentes estructuras de ejecución.

Polling

Esta es la opción más simple, y se usa para implementar aplicaciones sencillas con recursos limitados de timers y puertos de interrupción. En esta aproximación, se implementa un ciclo en en cual se leen las entradas, se ejecutan los procesos correspondientes a las entradas, y finalmente se generan las salidas.

Programa en polling
La principal desventaja de esta estructura de ejecución radica en que no se tiene un control preciso de la sincronización de eventos, es decir, es difícil controlar el período en el cual se repite el ciclo principal. Para solucionar este problema, es posible insertar una instrucción de retraso que detiene la ejecución por un tiempo fijo, luego de este tiempo, procede a ejecutar el ciclo siguiente.

Otro inconveniente que se tiene al trabajar usando polling es que todos los procesos se ejecutan estrictamente de forma secuencial, y no es posible asignar prioridades. Esto es necesario si se tienen procesos que se deben ejecutar de forma urgente cada cierto tiempo o luego de una entrada determinada; y al mismo tiempo se tienen procesos que se ejecutan de una forma más lenta. Cuando se tiene una situación de este tipo en un programa estructurado para realizar polling, los procesos más lentos retrasarán la ejecución de los que se deben ejecutar de una forma más urgente, provocando un tiempo de reacción que puede ser inaceptable para la aplicación.

Interrupciones

Mediante el uso de interrupciones es posible asignar prioridades de ejecución a determinadas tareas, lo cual es una gran ventaja en el momento de implementar programas que tienen operaciones lentas y de baja prioridad y también operaciones que se deben ejecutar de forma prioritaria sobre las otras, independientemente si estas últimas ya terminaron o no.

Programa con estructura de interrupciones
Como se puede observar en la Figura anterior, se tiene un ciclo principal de fondo, el cual puede correr libremente sin realizar acciones, o puede realizar las acciones de baja prioridad en las que no se requiere un control estricto de ejecución. Las rutinas prioritarias, por su parte, se implementan en una o varias funciones de servicio de interrupción, que pueden ser llamadas por un evento externo, como el cambio de estado en un puerto; o por un evento interno, como el desbordamiento de un contador o timer.

El esquema basado en interrupciones es útil cuando se tienen sistemas de mediana complejidad. Es muy importante tener en cuenta que el intervalo en el cual se llaman las rutinas de interrupción debe ser mayor al tiempo que tardan en ejecutarse los procesos de dichas rutinas, para así asegurar que las funciones críticas se ejecuten correctamente a la frecuencia de deseada. De lo contrario, el sistema puede saltar de interrupción en interrupción evitando que se ejecuten las otras tareas.

RTOS - Real Time Operating System

En sistemas grandes y complejos en tiempo real, con muchas tareas que se deben ejecutar de forma concurrente, se hace necesario el uso de un sistema operativo en tiempo real (RTOS). Mediante el RTOS se implementa un planificador de tareas, basado en prioridad, para la ejecución de procesos múltiples.

El uso de RTOS hace que el diseño de software de microcontroladores para sistemas complejos sea una tarea mucho más sencilla. El modelo de RTOS se muestra en la Figura siguiente. Las conexiones entre las tareas representan señales de sincronización, intercambio de datos o notificaciones de agotamiento de tiempo de espera.

Programa con sistema operativo en tiempo real
Un RTOS es un programa de fondo que controla y organiza la ejecución y comunicación de tareas que se deben ejecutar de forma paralela, programa el uso compartido de recursos, y distribuye las prioridades de las tareas. Existe un gran numero de RTOS comerciales, y hoy en día su uso es extendido en aplicaciones embebidas de alta complejidad.

No hay comentarios:

Publicar un comentario