Autor Tema: OSA un RTOS para pequeños y medianos  (Leído 21759 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado manutek

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 555
OSA un RTOS para pequeños y medianos
« 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(que yo con el mencionado post comencé a interiorizarme sobre
los RTOS) si no esta también el manual(en ingles) del RTOS Salvo 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,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:



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



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:



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 :)
No es la conciencia del hombre la que determina su ser, sino, por el contrario, es su ser social el que determina su conciencia

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: OSA un RTOS para pequeños y medianos
« Respuesta #1 en: 19 de Noviembre de 2011, 09:42:12 »
Muy buen aporte Manu!, espero leer tus comentarios....
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: OSA un RTOS para pequeños y medianos
« Respuesta #2 en: 19 de Noviembre de 2011, 10:26:11 »
Me suscribo al hilo! Gracias por la info  :)
No contesto mensajes privados, las consultas en el foro

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: OSA un RTOS para pequeños y medianos
« Respuesta #3 en: 19 de Noviembre de 2011, 10:46:48 »
 :-/, lo voy a seguir de cerca

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: OSA un RTOS para pequeños y medianos
« Respuesta #4 en: 19 de Noviembre de 2011, 13:49:30 »
También me apunto

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: OSA un RTOS para pequeños y medianos
« Respuesta #5 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

Desconectado manutek

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 555
Re: OSA un RTOS para pequeños y medianos
« Respuesta #6 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.




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  :)
No es la conciencia del hombre la que determina su ser, sino, por el contrario, es su ser social el que determina su conciencia

Desconectado manutek

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 555
Re: OSA un RTOS para pequeños y medianos
« Respuesta #7 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


Corriendo dos contadores:



. 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.



Saludos espero les guste el post y nos estamos leyendo
MANUtek

No es la conciencia del hombre la que determina su ser, sino, por el contrario, es su ser social el que determina su conciencia

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: OSA un RTOS para pequeños y medianos
« Respuesta #8 en: 27 de Noviembre de 2011, 01:35:19 »
Buen post manutek, felicitaciones!  :-/
@fabianjsm is on twitter

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: OSA un RTOS para pequeños y medianos
« Respuesta #9 en: 03 de Marzo de 2012, 18:00:39 »
Felicidades por el post.
Me suscribo al hilo.

Saludos.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re: OSA un RTOS para pequeños y medianos
« Respuesta #10 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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: OSA un RTOS para pequeños y medianos
« Respuesta #11 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.

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1099
Re: OSA un RTOS para pequeños y medianos
« Respuesta #12 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.

« Última modificación: 14 de Abril de 2012, 13:43:19 por AcoranTf »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: OSA un RTOS para pequeños y medianos
« Respuesta #13 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.
« Última modificación: 14 de Abril de 2012, 18:30:01 por Picuino »

Desconectado manutek

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 555
Re: OSA un RTOS para pequeños y medianos
« Respuesta #14 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:
No es la conciencia del hombre la que determina su ser, sino, por el contrario, es su ser social el que determina su conciencia