TODOPIC

Microcontroladores PIC => RTOS => Mensaje iniciado por: manutek en 19 de Noviembre de 2011, 08:33:37

Título: OSA un RTOS para pequeños y medianos
Publicado por: manutek en 19 de Noviembre de 2011, 08:33:37
Hola amigos
Paso a comentar(superficialmente y practicar) un poco sobre este rtos cooperativo que para mi gusto es excelente y todavía no le encontre error
alguno(a poco mas de un año en usarlo).
Si no se tiene idea de lo que es un RTOS cooperativo les recomiendo un post del amigo reiniertl (http://www.todopic.com.ar/foros/index.php?topic=15876.0)(que yo con el mencionado post comencé a interiorizarme sobre
los RTOS) si no esta también el manual(en ingles) del RTOS Salvo (http://www.pumpkininc.com/content/doc/manual/SalvoUserManual-v3.2.3.pdf) que trae una excelente explicación de un RTOS cooperativo con detalles de sus funciones
y ejemplos muy esclarecedores sobre aplicaciones practicas de cada uno de los servicios.

El autor de este RTOS (OSA)es un ruso ,un tal Victor Timofeev.El OSA Tiene muchas similitudes en sus funciones con el RTOS JacOS y RTOS Salvo;
soporta los pic10-12-16-18-24 AVRs de 8 bit,los de topson semiconductor STM8 y varios compiladores(incluyendo el hi-tech que utilizo para mis
 aplicaciones y para ejemplificar sobre el tema en cuestión)
Ademas es gratis y se lo puede bajar de la pagina donde victor publica (http://www.pic24.ru/doku.php/en/osa/ref/intro),el archivo para bajar contiene: una buena documentacion(en HTML help)
en su idioma(obio en Ruso) y en ingles con todas las explicaciones y aplicaciones de los servicios del OSA , viene también con una
excelente aplicación/herramienta de configuración de encabezados ,ejemplos para varios compiladores , el kernel,los ports para los micros
 y carpetas con ejemplos a forma de tutorial.
En la pagina se encuentra uno con ejemplos desde un pic10 teniendo 3 salidas(por soft)PWM ,pasando por un pic16 con teclado capacitivo
inclusive este sintetizando un piano ,asta un juego de video (el Bulder Dash)con sonido y video para VGA todo dentro de un pic18!!

acá una imagen de los micros & compiladores soportados:

(http://img88.imageshack.us/img88/5030/supz.jpg)

aspecto de la aplicación para generar el encabezado necesario:

(http://img408.imageshack.us/img408/5989/configj.jpg)

cosa a tener en cuenta para compilar los sig ejemplos sin problemas
_ El compilador HI-TECH PICC tiene que ser la versión estándar (STD) no tiene que ser de los que tienen OCG
_ La carpeta del OSA tiene que estar enraizado en el C:
_ El IDE sera el MPLAB
_ en los directorios de búsqueda para compilar en el MPLAB tiene que figurar bien donde buscar los encabezados
ejem:

(http://img40.imageshack.us/img40/1114/optionsv.jpg)

y se aplicara los ejemplos que expondré mañana y sig. sobre un pic16f887 + simulación en proteus;

Saludos cordiales a todos y espero sus comentarios :)
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: todopic en 19 de Noviembre de 2011, 09:42:12
Muy buen aporte Manu!, espero leer tus comentarios....
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: Suky en 19 de Noviembre de 2011, 10:26:11
Me suscribo al hilo! Gracias por la info  :)
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: pablomanieri en 19 de Noviembre de 2011, 10:46:48
 :-/, lo voy a seguir de cerca
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: Nocturno en 19 de Noviembre de 2011, 13:49:30
También me apunto
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: reiniertl en 20 de Noviembre de 2011, 00:56:04
Ánimo, yo no me anoto por falta de tiempo, pero te aliento a que difundas en la comunidad el uso de herramientas como los RTOS.

En mi modesta opinión es tiempo de que la comunidad comience a utilizar más seguido los RTOSes como complemento de las otras herramientas o mejor aún, a la versa.

un saludo
Reinier
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: manutek en 20 de Noviembre de 2011, 12:01:53
Gracias por los saludos y seguirme amigos:

en el siguiente ejemplo se realizara el clasico parpadeo de led para demostrar una simple y típica rutina para este RTOS.
expondré primero las partes de la aplicación de la configuración de los encabezados ,que son las básicas y necesarias para que el
ejemplo de los led funcione como nos parece y luego explicare funcionalidades del código + posibles variantes que resultan interesantes.

(http://img840.imageshack.us/img840/6269/configejemplo1.jpg)


en la imagen pegue texto de color rojo para resaltar las partes necesarias para que genere el encabezado.
observaciones:
_Para,el tamaño de TasckTimer lo coloque en int (con objeto de disponer de periodos + largos de todo tipo de función temporizadora).
_la política de prioridades se des-habilito para ahorrar espacio de memoria en micro (ocurre lo contrario
al habilitarlas y + en el modo extendido)
_el resto se puede quedar como en la imagen aparece

Con respecto al código subido comenzare con el principal:

Código: C
  1. void main (void)
  2. {
  3.     Init();                                   // configuración del pic
  4.    
  5.     OS_Init();                                // inicializacion de variables del OSA              
  6.  
  7.     OS_Task_Create(5, TaskParpaLedUno );      // creación de tarea con su prioridad  
  8.     OS_Task_Create(5, TaskParpaLedDos );      // es decir OS_Task_Create(prioridad asignada , nombre del Task)
  9.                                               // que para este caso no tiene sentido x estar des-habilitada las prioridades ,pero
  10.                                               // se necesita que este para que el compilador no tire errores x la necesidad de datos para la función
  11.    
  12.     OS_EI();                                  // habilita las interrupciones  
  13.  
  14.     OS_Run();                                 // arranca el kernel
  15. }

otra variante interesante de arrancar el kernel seria:

Código: C
  1. void main (void)
  2. {
  3.     Init();                                  
  4.    
  5.     OS_Init();                                          
  6.  
  7.     OS_Task_Create(5, TaskParpaLedUno );      
  8.     OS_Task_Create(5, TaskParpaLedDos );
  9.    
  10.     OS_EI();
  11.                                      
  12.     for (;;) {
  13.         OS_Sched ();
  14.     }
  15.                                
  16. }

Tiene su razón la posibilidad de arrancar de esta manera al kernel,que en otro post comentare.

sigo con la configuración para este micro:

Código: C
  1. void Init (void)
  2. {  
  3.     OSCCON=0b01110001;                                   // Cnfg Para trabajar en 8Mhz
  4. /********************************************************************************/
  5.     T0CS = 0;                                            // clock select : interno/4
  6.     PSA  = 0;                                            // asignacion de entrada al oscilador interno/4
  7.     PS2  = 1;                                            // Osc /128
  8.     PS1  = 1;                                            //
  9.     PS0  = 0;                                            //
  10.     T0IE = 1;                                            // habilitar la interrupción por desborde del TMR0
  11. /*********************************************************************************/  
  12.     ADON=0;
  13.     ANSEL=0;
  14.     ANSELH=0x00;
  15.     PEIE=0;
  16.     GIE=1;
  17. }

En esta función  se puede ver que en la primera instrucción es la configuración del oscilador,que para mi parecer (en los casos de OSA RTOS)
tiene que ser la máxima frecuencia disponible (salvo aplicaciones portátiles) para poder realizar mayor cantidad de tareas a tiempo y forma.

En este caso las funciones de temporizado recaerán sobre la presicion del TMR0 ,se lo configurara para trabajar a 1ms x tick:

Código: [Seleccionar]
tick = 1/(8Mhz/4)*(256-240)*128 = 1ms~
función de interrupción:

Código: C
  1. static void interrupt
  2. isr(void)                                              
  3. {
  4.     if ( T0IF ) {
  5.         T0IF = 0;    
  6.         OS_Timer();
  7.         TMR0=240;
  8.     }            
  9. }

En esta función (que cada 1ms se ejecuta) aparece OS_Timer(); que es en la que consta el tiempo para que el kernel (cuando se lo llame)
tome control de alguna tarea temporizada.

Y acá las estrella de esta película los task:

que si seria preemptive seria

Código: C
  1. void TaskPreemptive( void )
  2. {
  3.         for(;;)
  4.         {
  5.              //codigo
  6.         }
  7. }

En este caso preemptive. el kernel en cada intervalo configurado toma control del task siendo necesario o no (es decir que si no fue requerido.
El tiempo que llevo procesar el kernel peemptivo ,que por lo gral son mas grandes que los cooperativos, fue una tarea en vano para el micro )

que si seria cooperativo; Lo que cambiaría de la misma tarea seria :

Código: C
  1. void TaskCooperative( void )
  2. {      
  3.         for(;;)
  4.         {
  5.           //codigo       
  6.           OS_Yield();
  7.         }
  8. }

El punto al que quiero llegar es que si uno aplica con el debido criterio los cambios de contexto, los RTOS cooperativos son mas rápidos y eficientes
que los Preemptives ,por ser mas chicos y por ser llamarlos en cada vez que realmente se los necesita .

acá una típica tarea del OSA:

Código: C
  1. void TaskParpaLedUno ( void )
  2. {
  3.     TRISD0=0;
  4.         for(;;)
  5.         {
  6.            RD0=!RD0;
  7.            OS_Delay(100); // 100ms
  8.         }
  9. }
  10. void TaskParpaLedDos( void )
  11. {  
  12.         TRISD1=0;
  13.         for(;;)
  14.         {
  15.            RD1=!RD1;
  16.            OS_Delay(300); // 300ms
  17.         }
  18. }

Acá como única función del OSA dentro de las tareas temporizadas se utilizo OS_Delay();

En el siguiente post comentare y ejemplificare(sobre la misma plataforma) sobre tareas orientadas a eventos y temporizadas y mixtas
Saludos cordiales y espero sus comentarios y observaciones

ManuTek  :)
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: manutek en 27 de Noviembre de 2011, 01:23:00
En este post comentare un poco mas sobre tareas que se ejecutan temporizadamente ...
Ejemplificare sobre el uso de un LCD de tipo dos lineas de texto sobre la misma base anterior
 con la salvedad que se agregaría una tarea mas:

Código: C
  1. #define OS_TASKS                3

imágenes :

Al inicio
(http://img707.imageshack.us/img707/2315/vaikonur21.jpg)

Corriendo dos contadores:
(http://img821.imageshack.us/img821/1320/vaikonur22.jpg)


. Las tareas quedarían con el siguiente aspecto:

Código: C
  1. void TaskParpaLedUno ( void )
  2. {
  3.  static unsigned int ConTaskUno;      // Variable de conteo
  4.  TRISD0=0;
  5.  PrintLcd(0,"Ejemplo RTOS OSA");      //fucion de escritura de texto
  6.  PrintLcd(16,"   Vaikonur 2   ");  
  7.  OS_Delay(5000);
  8.  ClearLcd();                          //funcion de limpieza del lcd
  9.  PrintLcd(0,"TickTask1:");
  10.  PrintLcd(16,"TickTask2:");
  11.  RUN=1;  
  12.         for(;;)
  13.         {
  14.            IntLcd(10,ConTaskUno);     //funcion de escritura de una variable tipo int
  15.            ConTaskUno++;
  16.            RD0=!RD0;
  17.        OS_Delay(100);
  18.         }
  19. }
  20. void TaskParpaLedDos( void )
  21. {
  22.  static unsigned int ConTaskDos;                 
  23.  TRISD1=0;
  24.         for(;;)
  25.         {
  26.            if(RUN)
  27.            {
  28.            IntLcd(26,ConTaskDos);
  29.            ConTaskDos++;               
  30.            RD1=!RD1;
  31.            }
  32.        OS_Delay(200);
  33.         }
  34. }

Sobre las funciones de escritura y su uso:

Código: C
  1. PrintLcd(0,"Ejemplo RTOS OSA");

NombreFuncion(ubicación,texto);
La ubicación esta limitada a un LCD de dos lineas de 16x2 osea no superara este
valor 32(la primera linea comienza a 0 y la segunda linea comienza 16).
No retorna ningún dato.

Código: C
  1. IntLcd(10,ConTaskUno);

NombreFuncion(ubicación,integer);

la ubicación es = que la anterior y el limite de visualizacion es de un integer(0xFFFF)
No retorna nada

Código: C
  1. ClearLcd();

borrado total.No tiene ningún retorno.

Acerca de la estrategia:

TaskRefLcd( void );

Funciona bajo un task ciclico(30ms en este ejemplo) que compara los valores de un arreglo con otro de referencia para poner
en el LCD solo los datos diferenciados.

Las partes del task:
_La inicializacion :la propia que sugiere el fabricante con cierta tolerancia temporal.
_Escritura de la primera linea: primero se compara y después se escribe si se detecto diferencias en arreglos.
_Escritura de la segunda linea
_Retardo (a la demanda de la aplicación)

Particularidad :
Dentro del task aparecen suficientes retardos (OS_Delay();) ;como para tener lo mas atomizada posible la
tarea ,siendo en la inicializacion o en la escritura del LCD.
Bajo uso de memoria de programa y algo de ram.

(http://img339.imageshack.us/img339/1300/vaikonur23.jpg)

Saludos espero les guste el post y nos estamos leyendo
MANUtek

Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: fabianjsm en 27 de Noviembre de 2011, 01:35:19
Buen post manutek, felicitaciones!  :-/
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: Picuino en 03 de Marzo de 2012, 18:00:39
Felicidades por el post.
Me suscribo al hilo.

Saludos.
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: AcoranTf en 13 de Abril de 2012, 19:48:40
Aun no empece con los RTOS, pero si que lo tengo en mente. Sobretodo porque quiero realizar un PLC y creo que con RTOS quedara mucho mas optimizado. Pero eso sera mas adelante, aun me queda mucho por estudiar.

Saludos.
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: Picuino en 14 de Abril de 2012, 10:19:23
Un PLC no necesita obligatoriamente un rtos.
Se puede implementar con un bucle:


Código: [Seleccionar]
main() {
   while(1) {
      read_inputs();

      user_program();
     
      write_outputs();
      communication();     
   }
}


user_program() {

    if ((input1 && input2) || input3) {  output1 = 1; }
    if (input4) { output1 = 0; }
}
 

Es un poco rústico y no tiene prioridades, pero muchos PLCs utilizan este esquema de bucle infinito y de instrucciones que no acaparan el tiempo total del procesador.

Es parecido al lenguaje ladder.

Saludos.
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: AcoranTf en 14 de Abril de 2012, 13:37:15
Hola Picuino, precisamente hace algun tiempo le comentaba a Kallitos que estaba en duda si utilizar el sistema que tu describes o utilizar un sistema operativo base, para a partir de el construir el resto de la logica del PLC.
Tambien tengo otra duda. Si utilizo el sistema que describes, seria facil a la hora de programar el PLC, (programa de usuario), prepararlo en el PC con algun editor adaptado, agregarle el programa generico, compilarlo y cargarlo en el PLC. O sea cada vez que se reprograme, se hara totalmente, desde cero. La otra opcion seria tener el programa generico, o bien el rtos, residente en el PLC y cargarle solo el programa de usuario. En este ultimo caso, mi idea es, crear el programa de usuario, compilarlo y cargarlo en una determinada localizacion de memoria, a la que saltara el programa generico o el rtos, que en ese caso actuaria como una especie de bootloader y gestor de arranque.

Comentame que te parece mi planteamiento y que sistema ves mejor a la hora de implementar el PLC. Gracias.

Saludos.

P.D.: Mi preferencia por un rtos, es porque asi seria mas facil programar modulos como temporizadores, registros de desplazamiento, contadores, entradas analogicas, etc. y no solo entradas salidas digitales.

Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: Picuino en 14 de Abril de 2012, 18:24:38
Yo conozco los PLCs como usuario en lenguaje ladder sobre todo, pero no conozco con detalle la programación interna del PLC.
Tu planteamiento puede estar bien. Se trata de hacer las cosas lo más fáciles posibles. Si te resulta más facil con un rtos, pues adelante.

Yo me he planteado alguna vez hacer algo semejante. La idea que yo tenía es tener un pequeño sistema operativo en la flash y enviar por rs232 el programa a la memoria para que fuese interpretado. Algo parecido al basic.
Hay intérpretes basic que caben en muy pocos bytes (4000 bytes el primer basic de microsoft)
Habría que definir un lenguaje simple para interpretarle, por ejemplo un subconjunto de logo, que es muy sencillo o un lenguaje parecido al código máquina como el que utilizan los PLC.

La ventaja del lenguaje interpretado es que puedes evitar conflictos y errores (si una instrucción da error pasas a la siguiente y ya está) de manera que sería más fiable.

Lenguajes de PLC: http://en.wikipedia.org/wiki/IEC_61131-3
Lenguaje ladder: http://en.wikipedia.org/wiki/Ladder_logic
Lenguaje de lista de instrucciones (como código máquina del plc): http://en.wikipedia.org/wiki/Instruction_list


Saludos.
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: manutek en 14 de Abril de 2012, 18:35:59
Aca Jgpeiro06 dio clase magistral y desarrollo un verdadero PLC basado en freeRTOS


http://www.todopic.com.ar/foros/index.php?topic=32574.0

Un genio el maestro¡¡¡ :shock:
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: AcoranTf en 14 de Abril de 2012, 20:04:40
El proyecto de Jgpeiro06 es impresionante, pero aun estoy a años luz de poder hacer algo similar. Mis conocimientos de programacion, como he dicho otras veces, estan en pañales.

Saludos.
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: MerLiNz en 14 de Abril de 2012, 20:07:53
Si tu PLC no necesita mucha velocidad supongo que con rtos no tendras problemas, pero si piensas en hacer un PLC optimizado y rapido lo tendras que hacer sin rtos. Piensa que rtos aparte de consumir memoria tambien consume muchos ciclos y la latencia sera mas alta que desarollar el programa tu mismo.

He leido algunas opiniones cuando hablan la diferencia entra usar rtos y no usarlo, muchas de ellas no son correctas.

Cuando dicen que un pic esta el 50% del tiempo sin hacer nada se equivocan, un pic siempre esta ejecutando instrucciones, sean las que sean, aunque tu pienses que un delay() hace que el pic se detenga durante X tiempo eso no es asi, lo unico que hace es repetir durante X tiempo un bucle.

Ahora, como hacer un programa que siempre este haciendo cosas utiles?? Evitando usar delay. Para controles de tiempo siempre se pueden usar los timers, por ejemplo, queremos ejecutar funcion1 cada 10ms, y funcion2 cada 20ms seria:

char tmr=0, fFuncion1=0, fFuncion2=0;

timer() {
fFuncion1=1;
if(tmr==1) fFuncion2=1;
tmr++;
if(tmr>1) tmr=0;
}

main() {
//configuramos timer para que se desborde cada 10ms
....
while(1) {
if(fFuncion1){
 Funcion1(); //ejecutamos la funcion1 si el flag esta activado
 fFuncion1=0; //reseteamos el flag
}
if(fFuncion2) {
Funcion2(); //ejecutamos funcion2,
fFuncion2=0;
}
Funciones_de_utilidad();
Calculos();
....
}
}

Como ves ahi se utiliza un timer el cual controla 2 variables, una de ellas se pone cada 10ms y la otra cada 20ms. A su vez en el main se ejecuta un bucle, si algun flag estuviese en 1 entonces se ejecutaria esa funcion, sin embargo si ningun flag estuviese seteado se ejecutarian las Funciones_de_utilidad(), Calculos().... Todo esto seria asi, funciones cada X tiempo y a su vez se ejecutan funciones las cuales por ejemplo puede ser el calculo constante de un ADC, o una lectura constante de los puertos....

Como ya dije en otra ocasion el rtos no ejecuta 2 funciones a la vez, unicamente va alternando entre ellas segun el tiempo, prioridad... Pero todo esto lo hace en monotarea.
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: Picuino en 14 de Abril de 2012, 20:51:41
Si quieres muchos timers se puede hacer:

Código: [Seleccionar]
/* esta función se llama por interrupciones 10 veces por segundo */
timers() {
   int i;
   for(i=0; i<20; i++) {
      if (timer[i]>0) timer[i]--;
   }
}


main() {
   while(1) {
      if (pulsador)   timer[1] = 20;   // timer 1 temporiza 2 segudos

      if (timer[1] == 0)  output1 = 1;
   }
}

Después de pulsar el pulsador se temporiza dos segundos y la salida output se activa.
Tienes 20 temporizadores a tu disposición.

De todas formas los Rtos facilitan mucho estas cosas. En cuanto el programa se vuelve un poco grande, mejor irse a un rtos.

La ventaja de programarlo "a mano" sin rtos es la velocidad. Puedes conseguir tiempos de latencia bajísimos al precio de muchas horas dedicadas a programar y depurar. Y necesitas tener las ideas muy claras para no comenter errores.



Saludos.
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: AcoranTf en 15 de Abril de 2012, 18:15:20
Muchas gracias de nuevo por vuestros comentarios, que tendre en cuenta cuando decida ponerme con el PLC, de momento tengo un par de proyectos por realizar antes. Mientras tanto aprovechare para estudiar algo mas sobre los rtos.

Saludos.
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: Picuino en 15 de Abril de 2012, 19:02:35
Yo estudié hace unos meses el manual del rtos Salvo. Está muy bien explicado y es muy genérico (explica el rtos Salvo y además teoría general sobre los rtos)
El unico problema es que está en inglés.

http://www.pumpkininc.com/content/doc/manual/SalvoUserManual.pdf

Saludos.
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: KALLITOS en 16 de Abril de 2012, 11:37:33
Ahora, como hacer un programa que siempre este haciendo cosas utiles?? Evitando usar delay. Para controles de tiempo siempre se pueden usar los timers

La ventaja de programarlo "a mano" sin rtos es la velocidad. Puedes conseguir tiempos de latencia bajísimos al precio de muchas horas dedicadas a programar y depurar. Y necesitas tener las ideas muy claras para no comenter errores.

Muy cierto, para mi el uso correcto del hardware y flags, son muy eficientes, en comparación de las funciones preprogramadas.

saludos.
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: jeremylf en 27 de Marzo de 2013, 21:57:09
Ya estoy probando el OSA RTOS (v110306) con el ejemplo que trae. Estoy con el CCS v.4.134 y un PIC18F258 a 20Mhz
 
Adjunto proyecto con simulaicon en proteus 7.10 (No he puesto los LED pues es lo mismo ver los pines del propio PIC)

Eso si, hay que especificar la direcion de la carpeta osa en Project/Project Options -> Include Files.

Esta bueno!
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: suigeneris_abril24 en 16 de Junio de 2014, 16:21:39
Hola quisiera saber cuantas tareas puede soportar el freertos en un pic18f4526, estoy haciendo un proyecto y debo implementar 16 secuencias paralelas, gracias.
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: MerLiNz en 16 de Junio de 2014, 16:39:31
depende de la velocidad que requieran
Título: Re: OSA un RTOS para pequeños y medianos
Publicado por: jeremylf en 17 de Junio de 2014, 15:20:07
Hola quisiera saber cuantas tareas puede soportar el freertos en un pic18f4526, estoy haciendo un proyecto y debo implementar 16 secuencias paralelas, gracias.
Este tema es para el RTOS OSA exclusivamente por favor.