martes, 18 de diciembre de 2018

RTOS en microcontroladores PIC: ¡El diablo en el interior!


 
Un moderno circuito digital con microcontroladores en su corazón. (cortesía de wallpoper.com)

 Los microcontroladores son caballos de trabajo para la mayoría de los dispositivos electrónicos digitales. Mucha gente como yo ama el poder de procesamiento y control que ofrecen estas pequeñas computadoras. Si estás leyendo este blog, puedo asumir con seguridad que te apasionan los microcontroladores y quieres impulsar a las pequeñas bestias a su máximo potencial y diseñar sistemas electrónicos del mundo real.

Supongo que tiene un conocimiento previo de qué son los microcontroladores y ha estado trabajando con ellos durante algún tiempo. Si eres nuevo en este campo, sería una gran búsqueda y aprendizaje sobre los microcontroladores y su uso para varios problemas más simples.

Áreas de enfoque: diseño de aplicación de subproceso paralelo basado en RTOS usando microcontroladores PIC con OSA RTOS en mikroC pro para compiladores de la serie PIC.

¿Por qué necesito RTOS?

La mayoría de los programadores de microcontroladores escriben códigos secuenciales para sus aplicaciones. El microcontrolador leerá cada función llamada y hará lo que se le pida. Esto está bien para aplicaciones más pequeñas donde el microcontrolador debe hacer solo una cosa en particular. Digamos que desea utilizar su microcontrolador para hacer parpadear un LED y nada más, estaría bien si lo hace sin sentir la necesidad de ejecutar un sistema operativo dentro de su microcontrolador. Pero para cualquier otra aplicación donde se supone que más de una cosa debe hacerse simultáneamente, estás atascado.

¿Alguna vez sintió que su computadora funciona a la perfección mientras escribe documentos, navega por la web y escucha música, todo al mismo tiempo? Esto es posible gracias a los sistemas operativos que comparten el tiempo de su procesador entre las tareas. Todos los dispositivos electrónicos integrados modernos que ha estado utilizando utilizan un sistema operativo de algún tipo u otro. 

Piense en un problema muy simple, suponga que ahora, en lugar de un LED parpadeando en su microcontrolador, necesita 5 leds parpadeando, todos con diferentes frecuencias. Suena como un problema estúpido sin uso real y cualquier dispositivo real sería más complicado que esto, pero todavía no puedes hacerlo con el código secuencial que has estado escribiendo. 

Los problemas prácticos generalmente requieren un mayor número de tareas que se ejecutan en paralelo. Es posible que solo haya un par de subprocesos funcionando para permitir la interacción del usuario mientras la actividad principal del dispositivo se mantiene activa en segundo plano. 

Un sistema operativo en tiempo real (RTOS, por sus siglas en inglés) le permite ejecutar un número o tareas de forma periódica o, de lo contrario, proporcionar servicios como la programación para compartir el tiempo del procesador entre diferentes tareas. Todos los procesadores ejecutan solo una línea de código a la vez.

Este tutorial lo llevará a través del desarrollo de una aplicación de subprocesos múltiples en un microcontrolador PIC18. El compilador utilizado será MikroC Pro para PIC, solo porque me encanta, no hay otra razón. El sistema operativo utilizado es OSA. Diseñaremos una aplicación que le proporcionará una plantilla básica para usar OSA en casi la mayoría de las aplicaciones que pueda encontrar.

Acerca de OSA

He trabajado con diferentes RTOS hasta ahora, y nunca encontré realmente una gran huella ultra-baja y un RTOS eficiente para ser portado en dispositivos como microcontroladores con una cantidad de memoria extremadamente limitada. Un microcontrolador PIC18f452 generalmente tendría aproximadamente 1.5 KB de RAM. Nunca querrá usar la mayor parte de su memoria para el programador.

OSA es un RTOS cooperativo no preventivo para dispositivos con poca memoria, se ha incorporado a todos los microcontroladores populares y generalmente es compatible con casi todos los compiladores famosos, incluidos MPLAB, CCS PICC, AVR studio y MikroC Pro. El núcleo del sistema operativo proporciona una gran biblioteca de funciones. La estructura del programa termina siendo muy similar a la que has estado trabajando. Mientras consume solo alrededor de 60 bytes de memoria en la RAM, OSA es una opción ideal para aplicaciones basadas en microcontroladores. Caerás en su amor, sospecho :).

Algunos términos que usaré alrededor:
Cambio de contexto: pausando la tarea donde está y atendiendo a otra tarea, la operación volverá a esta tarea más adelante.

Tarea: Un fragmento de código que ejecutará el sistema operativo. Tarea es una función que el sistema operativo llamará repetidamente.

Hilo : Esto podría usarse indistintamente con la Tarea, pero en el contexto de este tutorial es una función que nunca termina (tiene un bucle de tiempo (1) dentro) y se ejecuta en paralelo con otros subprocesos.

Limitaciones:
Ser no preventivo es una desventaja, significa que si su programa se atasca en un bucle largo dentro de una tarea de baja prioridad, el programador no se adelantará o cambiará el contexto de manera forzada. El cambio de contexto es hasta el usuario en todos los RTOS cooperativos. Sin embargo, esto no es un contratiempo importante y puede hacer frente a estos problemas con alguna programación inteligente. Esto es lo que hace a este RTOS basado en un microcontrolador diferente de los sistemas operativos complejos como Windows, por lo que es lo suficientemente bueno con una computadora pequeña como PIC. 

Haciendo su primer programa multihilo

El plan es resolver el mismo problema simple del que hablé. Haremos un programa que parpadee 4 LED con frecuencias muy diferentes, todo al mismo tiempo. Lanzaremos 4 hilos. Está acostumbrado a tener una función principal en su programa de microcontrolador donde tendría un bucle sin fin para mantener el programa en marcha. Escribiremos un código que le dará 4 funciones de este tipo que "aparentemente" operan en paralelo y le dará la sensación de que tiene 4 funciones principales en su programa. Cuando sea bueno con el parpadeo de 4 LED en paralelo, simplemente puede completar el código y hacer lo que quiera.

Descargas
Para comenzar a escribir nuestra primera aplicación, las cosas que necesita descargar son:
Sería recomendable navegar por el sitio web de OSA y estudiar su documentación. Está muy bien escrito, algo que no esperará para la mayoría de los softwares de código abierto. ¡Me encantó!.

Paso uno:

Cree una nueva carpeta y extraiga el archivo zip OSA allí. Ejecute MikroC pro y cree un proyecto. Seleccione la misma carpeta donde extrajo OSA. OSA funciona para la mayoría de los microcontroladores, pero preferiría ir con 18F452, tiene una memoria razonable para nuestro trabajo. Utilice un cristal de 8 a 12Mhz.



¿Por qué estoy seleccionando un cristal de baja frecuencia ?, después de todo, no estoy planeando ninguna misericordia con esta pequeña criatura. Tiene razón, no hay piedad hoy, usaremos un cristal de 12Mhz y permitiremos que PLL use nuestro microcontrolador a 48Mhz, ese es el otro nombre de tortura, pero nos da un contexto extremadamente pequeño para el cambio de sobrecarga y el rendimiento supremo.



Ahora necesitamos agregar los archivos del sistema operativo a nuestro proyecto. Haga clic en Agregar y seleccione los archivos osa.h y osa.c


Haga clic en siguiente e incluya todas las bibliotecas, luego seleccione la configuración abierta para el proyecto y seleccione el oscilador como oscilador HS con PLL habilitado.


Ahora, volvemos a escribir código. Guarda el proyecto. Abra el archivo OSAcfg_Tool.exe y seleccione las siguientes opciones. Establezca Tareas en 4 porque tendremos 4 subprocesos en nuestra aplicación, seleccione la configuración como se muestra cuando haya terminado, haga clic en Guardar y guarde el archivo de configuración en la carpeta con su proyecto actual.



El archivo OSAcfg.h guardado requiere que se agregue al proyecto. En MikroC, con su proyecto abierto, vaya al menú Proyecto y agregue el archivo OSAcfg.h al proyecto (si no lo hace, se producirá un error).

Configurando el temporizador:

No voy a ser muy técnico y discutiré brevemente por qué un programa RTOS requiere configurar un temporizador. Todos los RTOS necesitan mantener un sentido del tiempo físico. Entonces, en todo momento, el Kernel sabría qué hora es y, con base en esta información, generará retrasos precisos y programará llamadas a funciones. En palabras simples, no puedes seguir tu rutina diaria sin tener un sentido del tiempo. Sabes que hay temporizadores dentro de PIC que te permiten contar el tiempo. Pero el reloj de nuestro sistema operativo funciona mucho más lento que el temporizador. Por lo tanto, incrementaríamos el reloj del sistema operativo un TICK cada vez que el temporizador se desborda.

 Estoy planeando tener una garrapata cada 1 ms. Esto significa algo, mi aplicación no podrá medir en ningún momento menos de 1 ms, no podrá llamar a retrasos menores a 1 ms, esto generalmente está bien si ninguno de los hilos requiere un retraso de tiempo inferior a 1 ms. La selección de un período de tiempo más largo para marcar tiene la ventaja de que su controlador pasará menos tiempo en el servicio de la rutina del servicio de interrupción por desbordamiento del temporizador y más tiempo en hacer lo que se supone que debe hacer.

Sí, olvidaste los prescalers, los registros de configuración y esas cosas que estudiaste en clase, los odié porque hay programas hechos para recordar esas cosas. Inicie la calculadora temporizador. Sabe todo lo que olvidaste :).


La utilidad de temporizador genera ajustes precisos para su temporizador. Genera una función InitTimer0 que llamaría al inicio del programa para configurar el temporizador. Copia ambas funciones a tu proyecto.

En su función principal, inserte una llamada a InitTimer0. Al inicio del proyecto, inculque los encabezados del SO utilizando la   directiva #include <osa.h> . Para incrementar el reloj en cada desbordamiento del temporizador, inserte una llamada a OS_Timer () en la rutina de servicio de interrupción. Así que tu código debería tener un aspecto como este a estas alturas:



Ahora necesitamos agregar los subprocesos y ejecutar el planificador para completar el programa. Para definir una tarea a la que llamaría el programador, se define de la siguiente manera:



Debería poder comprender la importancia de las funciones OS_Yeild y OS_Delay (). En su programa RTOS, OS_Delay es solo una contraparte muy eficiente de Delay_ms que ha estado usando antes. Delay_ms es una forma muy ineficiente de perder el tiempo del procesador simplemente atándolo en un bucle inútil. Cuando llama a OS_Delay, en lugar de perder el tiempo en algunas instrucciones ficticias, el programa atenderá otros subprocesos. Esto debería ayudarlo a ver el beneficio de emplear un RTOS en su aplicación. Pero recuerde, un subproceso de programa RTOS que nunca cede ni retrasa las llamadas nunca permitirá otros subprocesos en el procesador. Por lo tanto, siempre debe llamar a OS_Yeild a menudo en sus hilos para que se haga justicia a todos los hilos. El programador decidirá en función de la prioridad de cada subproceso, quién obtiene qué porcentaje del tiempo total.

Los desarrolladores de RTOS generalmente alientan el uso de variables globales. Particularmente porque durante el cambio de contexto, las variables locales deben conservarse en la memoria. de modo que cuando todos los subprocesos se ejecutan en paralelo, todas las variables locales existen en la memoria al mismo tiempo. Por lo tanto, tener variables locales apenas tiene un beneficio. Pero en caso de que permita alguna optimización de memoria en su código, recuerde usar el identificador 'estático' con las declaraciones de variables locales.

Al igual que en un subproceso definido anteriormente, puede definir cualquier número de subprocesos siempre que haya informado al sistema operativo sobre ellos al crear el archivo de configuración.
El último paso es crear los hilos y llamar al programador del sistema operativo desde la función principal.


Eso es todo !!, simplemente complete las tareas respectivas con el código que le guste y tendrá OSA ejecutándose con 4 subprocesos paralelos en su programa. OSA es potente y un sistema operativo bien desarrollado, las rutinas que he discutido son las cruciales y por lo general serían suficientes para los programas estándar. Sin embargo, debe explorar todos sus servicios en su documentación.

El ejemplo completo descrito anteriormente está disponible para su descarga en el siguiente enlace, que incluye una simulación de cómo funciona en su microcontrolador. El archivo comprimido también contiene la utilidad de temporizador, la herramienta de generación de archivos de configuración OSA y la documentación de OSA.



Créditos al Dr. Jahangir Ikram y a mis compañeros miembros del equipo en LUMS por los incalculables debates y discusiones sobre temas técnicos.

Pagina original con el articulo en ingles:
http://noumanqaiser.blogspot.com/2014/03/rtos-in-pic-microcontrollers-devil.html

No hay comentarios:

Publicar un comentario