TODOPIC

Microcontroladores PIC => RTOS => Mensaje iniciado por: reiniertl en 16 de Febrero de 2007, 10:27:20

Título: Dicusión sobre RTOS
Publicado por: reiniertl en 16 de Febrero de 2007, 10:27:20
Este Post se crea con el objetivo de mantener la cordial discusión que nos caracteriza en este foro sobre el tema de la programación con RTOS. Si has leído el post Sistemas Operativos en PIC o quieres hacer alguna pregunta sobre el desarrollo de aplicaciones con este tipo de herramienta, este es el lugar para hacerlo.

Sin embargo, si lo que te interesa es conocer o participar en la programación de un RTOS, entonces te sugiero que te dirijas al hilo del amigo Darukur: RTOS para PIC GNU (http://www.todopic.com.ar/foros/index.php?topic=15561.0) Lo mismo ocurre si tus dudas con los RTOS están asociadas al RTOS LMOS desarrollado también por Darukur, ya que es mejor ventilar temas sobre LMOS directamente con su padre :-).

Todas las preguntas o sugerencias son bienvenidas, y por supuesto, trataremos de responderlas a la mayor brevedad y de la forma más clara posible.

Reinier
Título: Re: Dicusión sobre RTOS
Publicado por: Darukur en 18 de Febrero de 2007, 02:24:17
Hola reiniertl, me gustaria ya que veo tu capacidad de enseñanza (que no es mi fuerte  :mrgreen: ), si te interesa armar para el RTOS LMOS algun tipo de manual, documentacion o instructivo.
A esto tambien sumarle ejemplos de uso con algun requerimiento especifico.
Serviria para aumentar el interes de todos los foreros por los RTOS.
Saludos y gracias.

Marcelo
Título: Re: Dicusión sobre RTOS
Publicado por: PalitroqueZ en 21 de Marzo de 2007, 14:09:08
tengo una duda:

con esto del RTOS ¿se puede decir que se está separando la programación de la parte física del PIC?, es decir, porque todavía siento que aún usando lenguaje C se está trabajando casi a nivel bajo y ya es hora de que sea el compilador el que se encargue de hacer las operaciones de I/O mientras que al programador solo le toque escribir las tareas a ejecutarse.

Título: Re: Dicusión sobre RTOS
Publicado por: reiniertl en 21 de Marzo de 2007, 14:46:59
Para nada, eso puede ourrir con un SO más sofisticado como Windows o GNU/LINUX, con los RTOS no, al menos con estos RTOS tendrás que encontrar un equilibrio entre el diseño empleando las potencialidades del RTOS y la programación tradicional.

Si bien el RTOS te ofrece un conjunto de herramientas para hacer más comodamente un montón de tareas que antes debías hacer tú personalmente, este no elimina la neecsidad de escribir código para manipular los periféricos del PIC y la E/S de puertos, solo que ahora este proceso puede gestionarse mejor (o peor dependiendeo de cuan bien pensado esté el diseño).

Reinier
Título: Re: Dicusión sobre RTOS
Publicado por: reiniertl en 23 de Marzo de 2007, 17:27:22
Citar
Saludos Reinertl,
Te felicito una vez mas por la exelente introducción que estas brindando a cerca de los RTOS.
Quiesiera que me aclares una duda referente al ejemplo q has mostrado en la sección de Insertar Cita
¡Interrupciones! ¡A MÍ!
Tengo entendido q utilizas 2 Pic 16F877 los cuales estan interconectados a traves de su respectiva interfaz serial (USART). Hasta ahi me queda todo claro...lo q no logro entender es si el 2do. Pic q hace de receptor de la cadena del otro y luego lo retransmite...hacia donde...? Es hacia el primero...? Puesto q el Pic solo posee una interfaz fisica ( el primer pic no posee una rutina para la recepcion, aunque entiendo q no habra colision simplemente la cadena retransmitida no tendrá un receptor.. )....la cual esta configuarada al principio....(directiva #use rs232(...)). Si quisieramos debugear en Hardware seria mas interesante retransmitirlo hacia la PC...obviamente a traves de otro puerto USART simulado por soft.

Desde ya gracias..y que siogas adelante, ya que el curso se esta volviendo cada vez mas interesante

Bien el segundo PIC solamente recibe una cadena del primero, por lo que le queda libre su pin Tx, para retransmitir hacia donde quieras conectarlo. Es cierto que en una aplicación seria esto no estaría de este modo, pero para los propósitos de enseñanza me pareció bien. Si descargaste el archivo con la simulación en PROTEUS te habrás dado cuenta que al pin Tx del 2do PIC le conecté un VirtualTerminal para que cuando corras la simulación aparezca impreso en pantalla el dato que este PIC toma del primero y lo retransmite.

Espero haber aclarado tu duda.

Por supuesto que las variaciones al código y al circuito pueden ser muchas, eso queda para la tarea de ustedes, de acuerdo a los intereses y posibilidades de cada cual. Sería bueno poner una tarea en el 2do PIC que de acuse de recibo del mensaje enviado por el segundo PIC y que retransmita el mensaje hacia la PC mediante un puerto simulado, etc. Pongan a volar su imaginación.

Un saludo Reinier
Título: Re: Dicusión sobre RTOS
Publicado por: Y@el en 04 de Octubre de 2007, 13:04:12
Saludos Reiniertl,

He estado practicando con el RTOS del CSS, y queria ver aca un programa que estoy haciendo.

En si la idea es muy sencilla. Y mi solucion me parece que muy complicada. Pero la idea era ir practicando RTOS, y nada como un ejemplo aplicativo, para entenderlo.

Motivacion
Antes que nada decirles, que debido a mi actual trabajo, el tiempo me es escaso.
Pero el otro dia, un amigo me comento que queria un timer que debe funcionar solo 6 horas al dia, y luego el resto de tiempo mantenerse apagado.
Y ante eso se me ocurrio la idea de ayudarlo, haciendo un programa con pic. Que prenda un Rele y se apague, de acuerdo a lo indicado.
Una vez hecho, se me vinieron las interrogantes:
* ¿Porque no configuro el tiempo?
* ¿Porque no crear un Reloj que me indique el tiempo que esta funcionando?
Y asi sucesivamente....

Y que tiene de especial?
1.- Control de Tareas por RTOS - Timer 1
2.- Configuracion de Tiempos via RS232.(Manejando la interrupcion int_RDA, del ejemplo Interrupciones Ami).
3.- Reloj del Sistema Manejado por Interrupcion de Timer 0 (Esto trate de manejarlo con el RTOS), pero no me fue muy eficiente.(Siguiendo el Ejemplo del Maestro RedPic)
4.- Graba la hora Actual en la EEPROM, usando para esto una tarea separada sin afectar las demas tareas. Usando para esto rtos_yield();

Aca el codigo
Código: C
  1. #include <16F628A.h>
  2.  
  3. #FUSES NOWDT                    //No Watch Dog Timer
  4. #FUSES HS                       //Resistor/Capacitor Osc with CLKOUT
  5. #FUSES NOPUT                    //No Power Up Timer
  6. #FUSES NOPROTECT                //Code not protected from reading
  7. #FUSES NOBROWNOUT               //No brownout reset
  8. #FUSES MCLR                     //Master Clear pin enabled
  9. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10. #FUSES NOCPD                    //No EE protection
  11.  
  12. #use delay(clock=4000000)
  13. #use rs232(baud=1200,xmit=PIN_B2,rcv=PIN_B1)
  14.  
  15. #include "string.h"
  16. #use RTOS(timer=1, minor_cycle=1ms)
  17. #byte EECON1=0x9C
  18.  
  19. char cBuffer[6]; //Aqui guardamos el texto a enviar por el puerto serie
  20. char comando[6];
  21. int8 iBuffer; //Indice en el buffer para ir llenandolo
  22. int8 semaforo;
  23. int8 horas,minutos,segundos=0;//Variables de la Hora del Sistema
  24. int8 mApago,hApago;
  25. int8 mPrendo,hPrendo;
  26. int8 hora,minuto;
  27. int8 estado=0;
  28. int const RTCCxS=134; // Número de RTCC's para 1 segundo con 4 Mhz / 1:256.
  29. // VARIABLES GLOBALES
  30. int nRTCC=0x00;           // Contador de interrupciones RTCC completas
  31.  
  32. #int_RTCC                 // Interrupción por desbordamiento
  33. void RTCC_isr() {  // del TIMER0 RTCC
  34.   set_timer0(32);
  35.   if(++nRTCC==RTCCxS){
  36.     nRTCC=-1;
  37.     output_toggle(PIN_A0);
  38.     set_timer0(50);    
  39.     if(++segundos>59){
  40.       segundos=0;
  41.       //nRTCC=0;
  42.       output_toggle(PIN_A2);
  43.       set_timer0(100);
  44.       if(++minutos>59){
  45.         minutos=0;
  46.         nRTCC=1;
  47.         output_toggle(PIN_A3);        
  48.         set_timer0(0);
  49.         if(++horas>23){
  50.           horas=0;
  51.           nRTCC=2;
  52.           set_timer0(119);
  53.         }
  54.       }
  55.     }
  56.   }
  57. }
  58.  
  59.  
  60. #task (rate=20ms, max=1ms, queue = 5) //Creamos una cola con 4 bytes utiles
  61. void Serial();
  62.  
  63. #task (rate=1s, max=1ms) //Creamos Tarea Comando
  64. void timer();
  65.  
  66. #task (rate=1ms, max=1ms)
  67. void disable_task();
  68.  
  69. #task (rate=10ms, max=1ms,queue=6)
  70. void grabaEE();
  71.  
  72. #task (rate=40ms, max=1ms) //Creamos Tarea Ejecuta
  73. void Ejecuta();
  74.  
  75. #task (rate=1s, max=1ms) //Creamos Tarea que Guarda Datos
  76. void SaveRTC();                   //Trabajando con una Cola de 6 Datos
  77.  
  78. //Comandos
  79. void verHora();//Visualiza Hora
  80. void ConHora();//Configura Hora
  81. void ConApa();//Configura Apaga
  82. void ConPre();//Configura Prende
  83.  
  84. void main()
  85. {
  86.    //setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  87.    setup_counters(RTCC_INTERNAL,RTCC_DIV_32); // TIMER0: Clock Interno y Preescaler  
  88.                                               //Este sera usado como Reloj.
  89.    //setup_timer_1(T1_DISABLED);
  90.    //setup_timer_2(T2_DISABLED,0,1);
  91.    setup_comparator(NC_NC_NC_NC);
  92.    setup_vref(FALSE);  
  93.    enable_interrupts(INT_RTCC);// Habilito Interrupción RTCC  
  94.    enable_interrupts(INT_RDA);
  95.    nRTCC=-5;  
  96.    set_timer0(68);  
  97.    enable_interrupts(GLOBAL);
  98.    setup_oscillator(False);
  99.    
  100.    output_a(0);
  101.    //Inicializo Reloj.
  102.    minutos=read_eeprom(2);
  103.    horas=read_eeprom(1);
  104.    
  105.   //Prendo
  106.   mPrendo=read_eeprom(4);
  107.   hPrendo=read_eeprom(3);
  108.  
  109.   //Leo Hora Apago
  110.   mApago=read_eeprom(6);
  111.   hApago=read_eeprom(5);
  112.   output_low(pin_A0);
  113.  
  114.   EECON1=0;
  115.    iBuffer=0;
  116.    semaforo=1;
  117.    rtos_run();
  118. }
  119.  
  120. //Guardara Datos hasta llegar  auna cadena de 5
  121. void Serial()
  122. {
  123.    char cDato;
  124.    rtos_await(rtos_msg_poll()); //Esperamos hasta que haya algun dato en cola
  125.    
  126.    while(rtos_msg_poll()) //Procesamos la cola completa
  127.    {
  128.       cDato = rtos_msg_read();
  129.       if (cDato==0x08){
  130.          if(iBuffer>0){
  131.             iBuffer--;
  132.             putc(0x08);
  133.          }
  134.          }
  135.       else{
  136.          if(iBuffer<5){
  137.          cBuffer[iBuffer] = cDato;
  138.          iBuffer++;
  139.          putc(cDato);
  140.          }
  141.       }
  142.    }
  143.  
  144.    if(cDato == 0x0D) //Si esta toda la cadena la enviamos
  145.    {
  146.          cBuffer[iBuffer] =0 ;
  147.          strcpy(comando,cBuffer);
  148.          iBuffer = 0;
  149.          rtos_enable(Ejecuta);
  150.          rtos_disable(Serial);
  151.    }
  152. }
  153.  
  154. #INT_RDA
  155. void fINT_RDA(void)
  156. {
  157. char tecla;
  158. tecla=getc();
  159. rtos_msg_send(Serial, tecla); //Tomamos el dato del buffer y lo ponemos en la cola
  160. }
  161.  
  162. void disable_task(){
  163. rtos_disable(Ejecuta);
  164. //rtos_disable(SaveRTC);
  165. rtos_disable(disable_task);
  166. }
  167.  
  168. void Ejecuta(){
  169.    int8 len,i;
  170.    strlwr(comando);  
  171.    len=strlen(comando);
  172.    for (i=0;i<len;i++){
  173.       if (comando[i]==0x0d) {
  174.          comando[i]=0x0;
  175.       }
  176.    }
  177.    len=strlen(comando);  
  178.    
  179.    semaforo=0;
  180.    if (len==1 && comando[0]=='v'){
  181.       verHora();
  182.    }
  183.    else{
  184.       if(len==2&&comando[0]=='e'){
  185.          estado=comando[1]&1;
  186.       }
  187.      
  188.       if (len==5){
  189.          hora=(comando[1]& 0x0F)*10+comando[2]&0x0F;
  190.          minuto=  (comando[3]& 0x0F)*10+comando[4]&0x0F;
  191.          switch(comando[0]){
  192.             case  'h': ConHora();
  193.                        break;
  194.             case  'a': ConApa();
  195.                        break;
  196.             case  'p': ConPre();
  197.                        break;
  198.             default: //putc('\n');
  199.                      semaforo=1;
  200.                      break;          
  201.          }
  202.          if (semaforo==0){
  203.             verHora();
  204.          }
  205.       }
  206.    }
  207.      
  208.    rtos_enable(Serial);      
  209.    rtos_disable(Ejecuta);
  210. }
  211.  
  212. void VerHora(){
  213. printf("\n\r  Hora Actual %02d:%02d:%02d\n\r",horas,minutos,segundos);
  214. printf("  Prende %02d:%02d  y  Apaga %02d:%02d\n\r",hPrendo,mPrendo,hApago,mApago);
  215. }
  216.  
  217. void ConHora(){
  218. horas=hora;
  219. minutos=minuto;
  220. segundos=0;
  221. }
  222.  
  223. void ConApa(){
  224. mApago=minuto;
  225. hApago=hora;
  226. }
  227.  
  228. void ConPre(){
  229. mPrendo=minuto;
  230. hPrendo=hora;
  231. }
  232.  
  233. void GrabaEE(){
  234.    int i;
  235.    int8 dato;
  236.    rtos_await( rtos_msg_poll()==6);
  237.    //if (rtos_msg_poll()==5){
  238.    for (i=1;i<7;){
  239.       if ((EECON1&2)==0){
  240.       dato=rtos_msg_read();
  241.       write_eeprom(i,dato);
  242.       i++;
  243.       }
  244.       rtos_yield(); }
  245.    //}
  246. }
  247.  
  248. void SaveRTC(){
  249. rtos_msg_send(GrabaEE,horas);
  250. rtos_msg_send(GrabaEE,minutos);
  251. rtos_msg_send(GrabaEE,hPrendo);
  252. rtos_msg_send(GrabaEE,mPrendo);
  253. rtos_msg_send(GrabaEE,hApago);
  254. rtos_msg_send(GrabaEE,mApago);
  255. }
  256.  
  257. void timer(){
  258. int16 P,A,N;
  259.  
  260.    A=hApago*60+mApago;
  261.    P=hPrendo*60+mPrendo;
  262.    N=horas*60+minutos;
  263.  
  264.    if (A>P){
  265.       if(A>N && N>=P){
  266.       estado=1;}
  267.       else{      
  268.       estado=0;}}
  269.    else{
  270.       if(P>N && N>=A){
  271.       estado=0;}
  272.       else{
  273.       estado=1;}}
  274.    
  275.    output_bit(PIN_A1,estado);
  276. }
  277.  
  278. #rom  0x2101={0,0,0,2,0,1}

Tambien, puede descargarse de aca http://www.proyectosfie.com/samples/rtos/Temporizador.rar

Y los comandos del terminal son:
v ->Para ver la hora actual, tiempo de encendido y tiempo de apagado
sABCD ->Cambia la hora actual, a AB:Horas CD:Minutos
pABCD ->Cambia hora de encendido, a AB:Horas CD:Minutos
aABCD ->Cambia hora de apagado, a AB:Horas CD:Minutos

Saludos,

Yoel
Título: Re: Dicusión sobre RTOS
Publicado por: reiniertl en 04 de Octubre de 2007, 17:45:10
Descargado y en proceso de revisión, nada más tenga una ranurita medio vacía en mi planificador de tareas, se la robo para darte una respuesta de este mensaje.

Saludos
Reinier
Título: Re: Dicusión sobre RTOS
Publicado por: cerebro en 07 de Junio de 2009, 21:24:32
hola gente desde ayer empecé a estudiar esto de los RTOS por ahora voy en la 3ra pagina del post, y quiero ir de a poco.
Les dejo mis dudas sobre lo que pude hacer a ver si alguien tan amable las responde  :mrgreen:

En el ejercicio1 hay un momento en que se juntan 2 tareas y el RTOS atiende siempre a la misma, como es que da esa prioridad se puede cambiar la prioridad de atención por ejemplo sin tener que habilitar o deshabilitar una de las tareas, esto me parece crítico. Si la solución esta más adelante del post solo me avisan y ya voy a llegar a esa parte.

En el ejercicio2 me quedo prácticamente igual a reitner  :shock:, les dejo el código y el esquemático que utilice(no se para que?  :?), bueno acá no me permitió utilizar el timer0 (8 bits) en el 16f877a me indicaba minor_cycle muy  bajo, por lo que tuve que utilizar el timer1(16 bits). O el timer0 y aumentar ese numerito. o cambiar el clock.
La cuestión es que había creado una rutina que entraba y habilitaba una tarea, luego se ejecutaba la misma rutina y habilitaba la misma tarea que ya había habilitado previamente y así varias veces. Esto puede causar algún inconveniente de estabilidad en el sistema?  :undecided:.

Gracias! seguro que cuando haga un par de ejercicios más me surgen más preguntas por eso las mando a medida que van saliendo  :laugh:
 
 

Título: Re: Dicusión sobre RTOS
Publicado por: gera en 07 de Junio de 2009, 22:00:53
Muy buen hilo, me viene de 10 ahora q estoy empezando con esto de los RTOS. :-/
Aprovecho a sacarme un par de dudas:
1. En el ejemplo de Y@el, habilita varias interrupciones, pero no la de UART. No es necesario cuando usamos #use rs232(), cierto?
2. Cuando tengo un RTOS, y ciertas tareas solo se tienen q ejecutar bajo ciertas condiciones, conviene tener una tarea madre q inhiba o no a las demas tareas dependiendo de estas condiciones? o q cada tarea evalue la condicion y ejecute o no?
Estoy usando el RTOS de CCS.

Muchas gracias!! :D
Título: Re: Dicusión sobre RTOS
Publicado por: reiniertl en 09 de Junio de 2009, 09:12:41
Hola "cerebro" y "gera"

Trataré de responderles las dudas a ambos, ya que seguramente están viendo los post que he pulicado hace montón de tiempo sobre el RTOS de CCS.

Las prioridades en el RTOS de CCS no se pueden cambiar, este es un RTOS bastante limitado en funcionalidades, una de sus limitaciones es esa, lo que pasa es que por ser tan simple es muy bueno para ser utilizado en la docencia, y aún con sus limitaciones es muy bueno si se compara con otros métodos de programación. Yo lo utilizo habitualmente con buenos resultados, la mayor parte del tiempo.

El minor_cycle debe ser menor o igual que el tiempo de desbordamiento del temporizador a utilizar, de modo que el RTOS pueda saber en una ISR que nosotros no vemos "gracias" a que CCS nos esconde la bola, que están transcurriendo los tics del sistema. Así que este parámetro se utiliza para especificar la base de tiempo para todas las demás tareas, es por ello que el "rate" de cualquier tarea debe ser múltiplo de este numerito.

Habilitar y deshabilitar tareas no crea, hasta donde e comprobado, ningún problema, excepto que la tarea se ejecute o no en los plazos establecidos. Debemos recordar que una tarea incluso, puede deshabilitarse a sí misma, pero si una tarea se deshabilita a sí misma ella tendrá que terminar ese ciclo de ejecución, así que el efecto no se notará hasta el próximo momento en que supuestamente debe ejecutarse.

Que una tarea o parte de su código se ejecute o no depende de los mecanismos de sincronización utilizados, de un diseño determinado que requiera alguna técnica específica y de la habilidad del programador para combinar todo eso en la solución de un problema. Así que aquí no hay recetas, todo depende del "todo". Ahora es mi recomendación que siempre que se puedan utilizar los mecanismos de sincronización para mantener a una tarea en estado de bloqueo o espera, se utilice esta técnica y evitar en lo posible tener tareas "madres" que habilitan y deshabilitan a otras, sobre todo porque las interrelaciones entre tareas pueden tener dependencias difíciles de controlar con un método así y porque con ello hacemos que la programación con RTOS se parezca más a la programación sin RTOS y creo que no es eso lo que se pretende.

Saludos
Reinier

PD: Estaré por acá para cualquier duda.
Título: Re: Dicusión sobre RTOS
Publicado por: gera en 09 de Junio de 2009, 14:49:38
Muchas gracias por tu respuesta reiniertl!! Está claro como el agua :D
Estoy muy entusiasmado con este tema, voy a ponerme a investigar a ver si le puedo sacar provecho.
saludos!!!
Título: Re: Dicusión sobre RTOS
Publicado por: Suky en 16 de Junio de 2009, 19:16:39
Hola compañeros! Yo también estoy entusiasmado en aprender RTOS, comencé con el de CCS. Pero tengo una duda existencial  :mrgreen: Yo declaro una tarea que se tiene que ejecutar cada 2ms por ejemplo:
Código: C
  1. #task(rate=2ms,max=1ms)
  2. void Tarea1(void);
Es la única tarea, la cual solo enciende un led y lo apaga durante 300us. Ahora como es la única yo pensé que se tenia que ejecutar exactamente cada 2ms, pero simulándolo en proteus veo que el pulso de 300us es exacto y la tarea se ejecuta cada 1.7ms  :?
Adjunto el código completo para ver si estoy declarando algo mal.

Esta duda surgió al realizar un cartel de leds (http://www.todopic.com.ar/foros/index.php?topic=25723.msg216626#msg216626) como primer ejercicio (maté 2 pájaros de un tiro, también es mi primer cartel). Logre sincronizar de manera correcta las tareas para realizar el refresco y también para provocar cambios en el mensaje sin que ocurran distorsiones, pero después se me dio por controlar lo tiempos de ejecución y ahí fue que me encontré con este problema  :?

Muchas gracias!
Título: Re: Dicusión sobre RTOS
Publicado por: MGLSOFT en 17 de Junio de 2009, 08:59:41
Es que realmente se ejecuta cada 2 mseg!!
1,7 mseg mas los 0,3 mseg dan los dos mseg que buscas!!! :mrgreen: :mrgreen:
Título: Re: Dicusión sobre RTOS
Publicado por: Suky en 17 de Junio de 2009, 10:59:36
Es que realmente se ejecuta cada 2 mseg!!
1,7 mseg mas los 0,3 mseg dan los dos mseg que buscas!!! :mrgreen: :mrgreen:
No MGLSOFT, los 1.7ms son entre flancos ascendentes, ya tiene en cuenta los 300us  :mrgreen:
Título: Re: Dicusión sobre RTOS
Publicado por: Nocturno en 17 de Junio de 2009, 12:29:47
¿Ese delay_us dentro de un RTOS no es un poco raro?. Desde la más profunda ignorancia, quizás si pones dos tareas, una que encienda el led y otra que lo apague...
Título: Re: Dicusión sobre RTOS
Publicado por: Suky en 17 de Junio de 2009, 13:15:08
¿Ese delay_us dentro de un RTOS no es un poco raro?. Desde la más profunda ignorancia, quizás si pones dos tareas, una que encienda el led y otra que lo apague...
Del ejemplo donde provino la duda no tiene delays, son solo instrucciones y ocurre el mismo problema.  :? Es que esto me desoriento! He visto ejemplos de RTOS en la ejecución de un control PID por ejemplo, donde la frecuencia de muestreo es critica, y no puede ser que varíe tanto! Para mi soy yo que estoy fallando en algo, sigo leyendo a ver que encuentro.
Título: Re: Dicusión sobre RTOS
Publicado por: cerebro en 17 de Junio de 2009, 13:30:25
tenés razón suky no se cumplen los tiempos, en mi caso es peor porque trabajaba con funciones de tiempo mayores y se adelanta unos 50 ms. Hasta ahora no me había dado cuenta y estuve buscando alguna explicación y no encontré nada...
Pero me puse el poncho detectivesco y descubrí que el rate se cumple pero lo que hace el RTOS es llamar a la función  en  rate-minor_cycle por ejemplo

Código: [Seleccionar]
#task(rate=400ms,max=50ms)con un minor_cycle=50ms la función la llama en 350ms y con un minor_cycle=100 la función la llama a los 300ms  :shock: para los 400ms siempre se completan.
Esto lo probe cargando el .cof y simulando paso a paso.

Ahora supuestamente en tu caso el retraso es de  0.3 [ms] yo esperaría que fuese de 1 [ms], pero le cambie el clock al micro(procesor clock frecuency) a 40 Mhz (un bolazoooo) y se cumplió la regla  :x. No se que decirte, si lo que dije fue pura coincidencia o si el rtos del ccs trabaja así o el proteus nos está jugando una pasada. La cuestión es que estoy más perdido que "un piojo en la oreja" con este RTOS, encima tengo más preguntas sobre el ejercicio 3 y 4  :z)...
Creo que somos malos estudiantes  :) (espero que el profe reiniertl no nos regañe) será mas saludable una vez terminado todos los ejercicios pasarse a algún otro RTOS.  :5]

Saludos!



Título: Re: Dicusión sobre RTOS
Publicado por: Suky en 17 de Junio de 2009, 14:21:19
tenés razón suky no se cumplen los tiempos, en mi caso es peor porque trabajaba con funciones de tiempo mayores y se adelanta unos 50 ms. Hasta ahora no me había dado cuenta y estuve buscando alguna explicación y no encontré nada...
Pero me puse el poncho detectivesco y descubrí que el rate se cumple pero lo que hace el RTOS es llamar a la función  en  rate-minor_cycle por ejemplo

Código: [Seleccionar]
#task(rate=400ms,max=50ms)con un minor_cycle=50ms la función la llama en 350ms y con un minor_cycle=100 la función la llama a los 300ms  :shock: para los 400ms siempre se completan.
Esto lo probe cargando el .cof y simulando paso a paso.

Ahora supuestamente en tu caso el retraso es de  0.3 [ms] yo esperaría que fuese de 1 [ms], pero le cambie el clock al micro(procesor clock frecuency) a 40 Mhz (un bolazoooo) y se cumplió la regla  :x. No se que decirte, si lo que dije fue pura coincidencia o si el rtos del ccs trabaja así o el proteus nos está jugando una pasada. La cuestión es que estoy más perdido que "un piojo en la oreja" con este RTOS, encima tengo más preguntas sobre el ejercicio 3 y 4  :z)...
Creo que somos malos estudiantes  :) (espero que el profe reiniertl no nos regañe) será mas saludable una vez terminado todos los ejercicios pasarse a algún otro RTOS.  :5]

Saludos!
Yo estaba en la misma tratando de encontrar alguna regla o como diablos establece los tiempos, modificaba minor_cycle, rate y el max, pero no le había encontrado explicación! También pensé que era el proteus que me estaba jugando una mala pasada, pero fijando un tiempo exacto en la tarea me di cuenta que eso no era! Al final parece que es problema de CCS! Voy a practicar algunas cositas mas y me cambio a otro RTOS  :5]
Título: Re: Dicusión sobre RTOS
Publicado por: reiniertl en 17 de Junio de 2009, 19:35:40
A ver si me eplico un poco con utede, poque eto que me enseñan me deja como indio que no etiende.

Yo nunca he tenido ese tipo de problemas, la razón no la se, quizá nunca me he preocupado demasiado de eso, cuando necesito temporizacoines precisas, combino el RTOS con TIMER, típicamente el TIMER1 + CCP y pongo en la ISR las cosas que no pueden depender de que al RTOS le de la gana de planificarme una tarea demasiado jodedora con los tiempos.

Pero si yo fuese ustedes ponía un minor_cycle 10 veces menor que el rate de la tarea más rápida, así me evito el jodido problema del aliasing, pero esta vez aplicado a la ejecución de las tareas.

Cambiarse de RTOS es buena idea, el FreeRTOS tiene soporte para PICs, pero es un poco más jodido de trabajar que el de CCS y se necesita del compilador de Microchip para programar con él.

Saludos
Reinier
Título: Re: Dicusión sobre RTOS
Publicado por: Suky en 17 de Junio de 2009, 20:01:58
A ver si me eplico un poco con utede, poque eto que me enseñan me deja como indio que no etiende.
:shock:
Yo nunca he tenido ese tipo de problemas, la razón no la se, quizá nunca me he preocupado demasiado de eso, cuando necesito temporizacoines precisas, combino el RTOS con TIMER, típicamente el TIMER1 + CCP y pongo en la ISR las cosas que no pueden depender de que al RTOS le de la gana de planificarme una tarea demasiado jodedora con los tiempos.

Creo yo que nos vendría muy bien un ejemplo, si no es mucho pedir  :mrgreen:

Pero si yo fuese ustedes ponía un minor_cycle 10 veces menor que el rate de la tarea más rápida, así me evito el jodido problema del aliasing, pero esta vez aplicado a la ejecución de las tareas.

Ahora yo he realizado tareas que se tienen que ejecutar cada 1 segundo, con un minor_cycle de 1ms y se ejecutan cada 800ms, porque es tanta la diferencia? Me arruina todo lo que tenia pensado hacer :5]

Cambiarse de RTOS es buena idea, el FreeRTOS tiene soporte para PICs, pero es un poco más jodido de trabajar que el de CCS y se necesita del compilador de Microchip para programar con él.
El lenguaje no seria problema, yo manejo C18 y además pasar de un C al otro no es tan complicado. Pero donde podremos conseguir material tal como has hecho tu con el de CCS. A mi me fue muy útil para entender este tema.

Modificado: Esto seguramente esta posteado en algún lado en el foro  :mrgreen: Curso de RTOS con FreeRTOS (http://www.sistemasembebidos.com.ar/forum/index.php?topic=237.0)

Muchas gracias por tu tiempo reiniertl  :-/
Título: Re: Dicusión sobre RTOS
Publicado por: cerebro en 17 de Junio de 2009, 20:09:12
 :( todavía no llegue al capitulo de las interrupciones pero ya conozco el problema me va a ser más fácil la solución, por el momento seguimos con el RTOS de CCS. FreeRTOS es prometedor pero lo que dice en la pagina me bajonea....
Citar
Please note that the segmented memory on the PIC18 makes it a less than ideal candidate for use with an RTOS.
Vamo' a tener que romper la alcancía y comprar algo de la gama alta  :mrgreen:.
 
Tomo nota de bajar el minor_cycle y en la próxima te paso todas las preguntontas que tengo por ahí.
Saludos y gracias por todo!!
Título: Re: Dicusión sobre RTOS
Publicado por: MGLSOFT en 18 de Junio de 2009, 00:20:50
Ta lindon el tema!!! :mrgreen: :mrgreen:
Título: Re: Dicusión sobre RTOS
Publicado por: Suky en 20 de Junio de 2009, 18:06:19
Hola compañeros! Yo también estoy entusiasmado en aprender RTOS, comencé con el de CCS. Pero tengo una duda existencial  :mrgreen: Yo declaro una tarea que se tiene que ejecutar cada 2ms por ejemplo:
Código: C
  1. #task(rate=2ms,max=1ms)
  2. void Tarea1(void);
Es la única tarea, la cual solo enciende un led y lo apaga durante 300us. Ahora como es la única yo pensé que se tenia que ejecutar exactamente cada 2ms, pero simulándolo en proteus veo que el pulso de 300us es exacto y la tarea se ejecuta cada 1.7ms  :?
Adjunto el código completo para ver si estoy declarando algo mal.

Esta duda surgió al realizar un cartel de leds (http://www.todopic.com.ar/foros/index.php?topic=25723.msg216626#msg216626) como primer ejercicio (maté 2 pájaros de un tiro, también es mi primer cartel). Logre sincronizar de manera correcta las tareas para realizar el refresco y también para provocar cambios en el mensaje sin que ocurran distorsiones, pero después se me dio por controlar lo tiempos de ejecución y ahí fue que me encontré con este problema  :?

Muchas gracias!

Realice esta misma pregunta en el foro de CCS, en donde me dieron un link donde tenían los mismos problemas: RTOS tasks execution rates (http://www.ccsinfo.com/forum/viewtopic.php?t=29772)

Resulta ser un bug del compilador:  :z)

 :5]
Título: Re: Dicusión sobre RTOS
Publicado por: Nocturno en 20 de Junio de 2009, 19:02:34
Estupenda información, Suky. Ahora al menos sabemos cuál es la razón del problema.
Título: Re: Dicusión sobre RTOS
Publicado por: gera en 20 de Junio de 2009, 19:34:00
Y q esperan para solucionarlo??? Ya conociendo el problema, con sentarse una semanita a codear se arregla!
Q tipos jaja.
Título: Re: Dicusión sobre RTOS
Publicado por: reiniertl en 22 de Junio de 2009, 08:38:56
Nada parece que el RTOS no se ha constituido un producto fuerte de CCS, tendré que dar un curso on-line con tipo aula virtual para ver si se crea espectativa al respecto. A mi me gusta ese RTOS por lo simple que es, claro que lo considero un producto poco profesional, pero para entrarle al mundo del RTOS nada mejor qu eeso.

Saludos
Reinier
Título: Re: Dicusión sobre RTOS
Publicado por: gera en 22 de Junio de 2009, 12:26:27
Reiniertl, q RTOS preferis vos? Yo he sentido muy buenos comentarios de freeRTOS, pero cuando me dispuse a aprender, me parecio muy complicado :?
Ademas q es para c18 cierto? yo solo uso CCS... creo q es hora de migrar jeje
saludos!
Título: Re: Dicusión sobre RTOS
Publicado por: reiniertl en 22 de Junio de 2009, 12:47:36
Desgraciadamente me cambié para profesor de la universidad y ahora lo menos que tengo es tiempo para estudiar o diseñar, situación que cambiaré para fines de año. Mucho trabajo incluso del tonto.

Así que me he quedado varado en eso de los RTOS, pero freeRTOS es un tipo fuerte, claro que primero tienes que familiarizarte con el C de Microchip y luego meterle el coco al FreeRTOS que tiene sus cosillas, pero después de ver 4 ó 5 veces los mismos ejemplos y el mismo código ya se le va perdiendo el miedo.

Ahora, hay otras cosas, como el uCLinux, que tengo entendido tiene puertos para los PIC24 y PIC32

Saludos
Reinier
Título: Re: Dicusión sobre RTOS
Publicado por: Suky en 22 de Junio de 2009, 12:50:20
Reiniertl, q RTOS preferis vos? Yo he sentido muy buenos comentarios de freeRTOS, pero cuando me dispuse a aprender, me parecio muy complicado :?
Ademas q es para c18 cierto? yo solo uso CCS... creo q es hora de migrar jeje
saludos!
Es para C de Microchip, y es conveniente usar el PIC de alta gamma, con un 18F es limitado por lo que he leído.
Título: Re: Dicusión sobre RTOS
Publicado por: reiniertl en 22 de Junio de 2009, 13:30:46
Bueno los ejemplos que me he descargado de la página, que lo único que hacen es encender y apagar unos LED y creo que enviar una cadena por puerto serie son con un PIC18, si no me equivoco el PIC18F844 o algo así.

Claro que todo dependerá de la aplicación que uno quiera ponerle al PIC con el RTOS, pero seguro estoy que un equivalente a una aplicación desarrollada con un sistema operativo, será mucho más simple y eficiente que una hecha por medios tradicionales. Por cierto hablo de aplicaciones complejas, no de encender y apagar un LED.


Saludos
Reinier
Título: Re: Dicusión sobre RTOS
Publicado por: rodrigo_control2009 en 01 de Julio de 2009, 13:57:51
Hola  habia  estado  tratando de  compilar un programa en el cual  uso  rtos  y  usb  pero siempre  me producia  un erros  asociado al rtos_run() . Luego  hice algo mas  simple pq  crei que podria ser por el tema  de  los  48mhz  y bueno empeze compilado el condigo desde 20 mhz hasta  40 mhz (no se si  haran cristales de 40 mhz ..) pero cuado intente  hacerlo con 41 mhz comenzaron los errores que antes ya se me  habian mencionado y  cueno creo que el problema  quizas  pase por alli, con el tema  de la frecuancia del ocsilador.  Si alguien sabe algp agradeceria dicha ayuda  o aclaraciòn

adjunto el archivo  al  final  aparece el error  antes mencionado

#include <18F4550.h>

//#include <18F452.h>
//#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#fuses HS,NOWDT
//#use delay(clock=20000000)
#use delay(clock=41000000)
//#use delay(clock=48000000)
//#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
// this tells the compiler that the rtos functionality will be needed, that
// timer0 will be used as the timing device, and that the minor cycle for
// all tasks will be 100 miliseconds
#use rtos(timer=0,minor_cycle=100ms)

// each function that is to be an operating system task must have the #task
// preprocessor directive located above it.
// in this case, the task will run every second, its maximum time to run must
// be less than or equal to the minor cycle, and there is no need for a
// queue at this point, so no memory will be reserved.
#task(rate=1000ms,max=100ms)
// the function can be called anything that a standard function can be called
void The_first_rtos_task ( )
{
  // printf("1\n\r");
}

#task(rate=500ms,max=100ms)
void The_second_rtos_task ( )
{
  // printf("\t2!\n\r");
}

#task(rate=100ms,max=100ms)
void The_third_rtos_task ( )
{
  // printf("\t\t3\n\r");
}

// main is still the entry point for the program
void main ( )
{
   // rtos_run begins the loop which will call the task functions above at the
   // schedualed time
   rtos_run ( );
}

//***Error 44 "ex_rtos_demo_1_task.c"Line 59(15,16):Internal Error -Contact CCS Built in call fail,rtos_run
//1 Error, 0 Warnings.
Título: Re: Dicusión sobre RTOS
Publicado por: gera en 01 de Julio de 2009, 14:43:36
Rodrigo, lee las reglas del foro por favor, no se pueden repetir mensajes. http://www.todopic.com.ar/foros/index.php?topic=26649.msg218755#msg218755
saludos!
Título: Re: Dicusión sobre RTOS
Publicado por: rodrigo_control2009 en 04 de Julio de 2009, 15:56:23
Gracias
la  verdad  lo habia  colocado en otro  hilo  pero  me corrieron de alli 
y lo copie aca  por q  la verdad  no se  como  moverlo  si es que  uno  lo  puede  hacer 
de todas  formas  en cuanto al post  creo q si esta relacionado con el tema de  la  frecuencia pq  cambie  los  fuses  a pll10 y  clock a 20MHz  cpudiv2  (si mal no recuerdo) y  logre compilar  y  el usb  funciona  bien  y  es  parte de una tare rtos tb envio  desde  VB tramas  y  las  recepciona  bien y hace eco de ellas. y  ejecutas  otras  tareas  como atencion de EUSART
Trate  de compilar  con clock a 48Mhz pero  no  lo  permitia.
 
Título: Re: Dicusión sobre RTOS
Publicado por: giff en 03 de Febrero de 2010, 21:14:22
Hola gran Suky, tengo unas consultas para este bug encontrado en CCS.


Realice esta misma pregunta en el foro de CCS, en donde me dieron un link donde tenían los mismos problemas: RTOS tasks execution rates (http://www.ccsinfo.com/forum/viewtopic.php?t=29772)

Resulta ser un bug del compilador:  :z)
  • Para 4MHz y 8MHz funciona correctamente
  • Para 15MHz el compilador calcula el rate de las tareas para 20MHz
  • Para 20MHz funciona bien
  • Para 32MHz el compilador calcula el rate de las tareas para 40MHz
  • Para 40MHz funciona bien
  • Para 48MHz el compilador calcula el rate de las tareas para 40MHz

 :5]


Donde puedo averiguar los cambios que realiza CCS para saber si corrigieron este error?. Pregunto debido a que en el post RTOS tasks execution rates (http://www.ccsinfo.com/forum/viewtopic.php?t=29772) leí que estaba presente en la version  3.249; pero en estos momentos se maneja la versión 4.104.

Sucede que quiero realizar un RTOS con CCS para una freq de 48 Mhz y el tiempo de sincronizacion de estas tasks es un factor crítico. La solución seria bajarme a 40 Mhz en caso contrario.

Muchas gracias de ante mano.


PD: Disculpen por preguntar así como así, siendo que soy nuevo en este foro. Pero la verdad viendo el desarrollo que has logrado te tengo como meta a seguir en lo que respecta RTOS.
Título: Re: Dicusión sobre RTOS
Publicado por: Suky en 04 de Febrero de 2010, 01:01:25
mmm.. Por aquí  (http://www.ccsinfo.com/devices.php?page=versioninfo)se pueden ver los cambios recientes. Yo sinceramente no los he seguido de cerca con este tema así que no sabría que decirte. Sino, no queda otra que hacer una prueba, con proteus puedes verificar si se están cumpliendo las temporizaciones de las tareas.


Saludos!
Título: Re: Dicusión sobre RTOS
Publicado por: reiniertl en 04 de Febrero de 2010, 09:41:32
No estoy al tanto de la situación del compilador de CCS, y aunque yo soy un gran defensor de los RTOSes, en el caso de los PIC, estoy mudándome para FreeRTOS porque la verdad que con tanto bug y tanta limitación ya me queda corto.

Además que no es software libre y eso ya lo hace menos atractivo para mí.

Utilizar el FreeRTOS no es tan difícil una vez que sabes utilizar un RTOS.

Saludos
Reinier
Título: Re: Dicusión sobre RTOS
Publicado por: giff en 07 de Febrero de 2010, 18:00:01
Muchas gracias Suky por la respuesta y reiniertl por la sugerencia. Por ahora no tengo tiempo suficiente para aprender FreeRTOS asi que seguiró con CCSRTOS.

Ehm, tengo otra duda y es sobre el uso del rtos_yield(). Analicé un tiempo la rutina que esta en este hilo Control PID con anti-windup en PIC y CCSRTOS (http://www.todopic.com.ar/foros/index.php?topic=26780.0) por Suky y veo que en algunas partes usa rtos_yield() mientras que en otras no.

Quiero ver si me acerco en algo con lo que diré, y es que se debería a que al deshabilitar la tarea con rtos_disable(task) el programador de tareas hará como si esta no existiese hasta cuando se vuelva a habilitar. En cambio cuando está habilitada la tarea es conveniente usar rtos_yield() para pasar el control de esta al programador.

¿Es eso?

Segunda consulta: si envío varios rtos_msg_send desde distintas tareas, ¿hay alguna forma de clasificar estos datos enviados a la cola de mensajes por si tengo varias tareas y necesito una de esos mensajes solamente?. Y si no es posible ¿tendría que deshabilitar las tareas que no quiero que lleguen esos mensajes para aplicar correctamente un rtos_msj_read desde la tarea que deseo?

Muchas gracias por su tiempo
Título: Re: Dicusión sobre RTOS
Publicado por: Suky en 08 de Febrero de 2010, 09:20:55
rtos_disable(), deshabilita la tarea y no la ejecuta más hasta volver a habilitarse, y en ese caso comienza desde la primer linea. En cambio rtos_yield() devuelve el control al planificador de tareas, esto sirve por ejemplo para hacer demoras o ejecutar un sector del código de la tarea y en el siguiente ciclo seguir con la ejecución. Por ejemplo,
Código: C
  1. #task(rate=1ms,max=1ms)
  2.   void ImprimirLCD(void){
  3.   int j;
  4.    
  5.      if(Print==1){                
  6.         lcd_comand(1);    
  7.         Print=0;
  8.         rtos_yield();                  
  9.      }
  10.      for(j=0;j<LengthMsj1;j++){    
  11.        lcd_putc(BufferLCD1[j]);
  12.        rtos_yield();              
  13.      }

Se consulta si es necesario borrar display, si es el caso se borra y se pasa el control al planificador de tareas que ejecutará las tareas que le seguían en orden, y al próximo ciclo (aprox 1ms después) continua la ejecución a partir del for, el cual envía un carácter y devuelve el control.
Respecto a rtos_msg_send revisa por aquí. (http://www.todopic.com.ar/foros/index.php?topic=15876.msg106611#msg106611)

Saludos!
Título: Re: Dicusión sobre RTOS
Publicado por: giff en 09 de Febrero de 2010, 12:01:10
Muchas Gracias Suky por la respuesta, ahora podre seguir con la programación que necesito y cuando termine lo documentare bien para devolver la mano a los amigos de todopic ;D
Título: Re: Dicusión sobre RTOS
Publicado por: AngelGris en 10 de Febrero de 2010, 11:53:51
Es muy interesante esto de los RTOS. Estuve leyendo el hilo de reiniertl que está muy claramente explicado y ahroa estoy leyendo un libro en ingles que bajé de internet (Advanced PIC Microcontroller Projects in C) y me surgen algunas dudas.

En el libro dice:

minor_cycle is the longest time any task will run. -esto en la declaracion RTOS.....-

max specifies how much processor time a task will use in one execution of the task. The time specifed here must be equal to or less than the time specified by minor_cycle -esto en la declaración de TASK....-

En curso de reiniertl dice:

minor_cycle: especifica la cantidad de tiempo mínima que una tarea tendrá para ejecutarse, y los tiempos de ejecución de cada tarea deben ser múltiplos de esta cantidad.


Según yo traduzco del libro, minor_cycle es el máximo tiempo que una tarea tiene para ejecutarse. ¿es correcto esto?

Cuándo reiniertl dice "...y los tiempos de ejecución de cada tarea deben ser múltiplos de esta cantidad." ¿Se está refiriendo al rate que se especifica en TASTK...? Porque justamente rate coincide con esta definición.
Título: Re: Dicusión sobre RTOS
Publicado por: reiniertl en 11 de Febrero de 2010, 15:56:11
El libro debe estar mal porque la cosa funciona de la siguiente manera:

Este RTOS no es una maravilla de RTOS, así que te impone restricciones en cuanto a lo que puede hacer una tarea:

Una tarea debe entrar en contexto de ejecución a frecuencia constante. Esto quiere decir que no puede ejecutarse ahora y luego dentro de 5ms, y después a los 20ms (hay RTOSes que permiten cosas como esta). El RTOS de CCS impone que la tarea se ejecute a período constante. Este es el valor de "rate" de tu tarea.

Pero las desgracias no acaban allí, esta restricción se transfiere a todo el sistema, así que también se impone que el RTOS debe tener un período mínimo que vendrá siendo como el tic del reloj del sistema. Esta técnica no es rara, muchos sistemas operativas imponen al programador declarar el tic del sistema. Que viene siendo algo así como que un pic de la familia de los 16 tiene un período de ejecución por instrucción de 1/4 del reloj del sistema.

Entonces, el parámetro que se declara como tic, del RTOS es "minor_cycle" y es por eso que las tareas podrán tener rates en valores enteros iguales al "minor_cycle" o en intervalos múltiplos enteros positivos de ese valor. Visto con un ejemplo:

Supongamos que declaramos un "minor_cycle" de 10ms; entonces podremos tener tareas con rates de 10ms, 20ms, 30ms....n*10ms.

El valor de "max" solamente sirve para decirle al RTOS cuanto es el tiempo máximo que esperamos debe consumir la tarea para ejecutarse, de este modo se pueden llevar las estadísticas de la tarea y saber si realmente la tarea consume menos o más tiempo del que se ha estimado. Este valor debe ser menos que el "minor_cycle", ya que se supone que otras tareas podrían necesitar el procesdor en cualquier valor múltiplo del "minor_cycle".

Saludos
Reinier
Título: Re: Dicusión sobre RTOS
Publicado por: AngelGris en 11 de Febrero de 2010, 23:11:34
El libro debe estar mal porque la cosa funciona de la siguiente manera:

Este RTOS no es una maravilla de RTOS, así que te impone restricciones en cuanto a lo que puede hacer una tarea:

Una tarea debe entrar en contexto de ejecución a frecuencia constante. Esto quiere decir que no puede ejecutarse ahora y luego dentro de 5ms, y después a los 20ms (hay RTOSes que permiten cosas como esta). El RTOS de CCS impone que la tarea se ejecute a período constante. Este es el valor de "rate" de tu tarea.


Pero las desgracias no acaban allí, esta restricción se transfiere a todo el sistema, así que también se impone que el RTOS debe tener un período mínimo que vendrá siendo como el tic del reloj del sistema. Esta técnica no es rara, muchos sistemas operativas imponen al programador declarar el tic del sistema. Que viene siendo algo así como que un pic de la familia de los 16 tiene un período de ejecución por instrucción de 1/4 del reloj del sistema.

Entonces, el parámetro que se declara como tic, del RTOS es "minor_cycle" y es por eso que las tareas podrán tener rates en valores enteros iguales al "minor_cycle" o en intervalos múltiplos enteros positivos de ese valor. Visto con un ejemplo:

Supongamos que declaramos un "minor_cycle" de 10ms; entonces podremos tener tareas con rates de 10ms, 20ms, 30ms....n*10ms.

El valor de "max" solamente sirve para decirle al RTOS cuanto es el tiempo máximo que esperamos debe consumir la tarea para ejecutarse, de este modo se pueden llevar las estadísticas de la tarea y saber si realmente la tarea consume menos o más tiempo del que se ha estimado. Este valor debe ser menos que el "minor_cycle", ya que se supone que otras tareas podrían necesitar el procesdor en cualquier valor múltiplo del "minor_cycle".

Saludos
Reinier

Entiendo perfectamente lo del rate. Pero justamente mi mayor problema es entender bien la definición de minor_cycle.
Si el rate tiene que ser igual o múltiplo de minor_cycle -que es lógico porque no puedo pretender ejecutar una tarea cada 20ms y que dicha tarea me lleve 30ms- entonces minor_cycle me está diciendo que ese es el tiempo máximo que me puede consumir la tarea y no el tiempo mínimo.

Perdón por mi dureza para entender.
Título: Re: Dicusión sobre RTOS
Publicado por: Menta en 12 de Febrero de 2010, 01:01:49
Entiendo perfectamente lo del rate. Pero justamente mi mayor problema es entender bien la definición de minor_cycle.
Si el rate tiene que ser igual o múltiplo de minor_cycle -que es lógico porque no puedo pretender ejecutar una tarea cada 20ms y que dicha tarea me lleve 30ms- entonces minor_cycle me está diciendo que ese es el tiempo máximo que me puede consumir la tarea y no el tiempo mínimo.

Perdón por mi dureza para entender.

Creo que lo has entendido a la perfección... minor_cycle debería ser mayor al máximo tiempo de ejecución de tareas... y parece con esta definición que está mal que su nombre incluya minor, pero se puede interpretar desde otro lado, ya que es el menor tiempo de repetición de una tarea....
Título: Re: Dicusión sobre RTOS
Publicado por: AngelGris en 12 de Febrero de 2010, 09:44:35
Entonces ahora entiendo bien el ejemplo que puso reiniertl cuando se refirió a la familia 16 de los pic. El problema fue que el ejemplo también me confundió un poco, en su momento, porque en ese caso 1/4 de clock es también el mínimo tiempo que lleva cada instrucción. Per él lo puso como ejemplo del mínimo rate o "menor tiempo" en el cual se puden repetir las tareas.

¡Gracias a ambos por la explicación!
Título: Re: Dicusión sobre RTOS
Publicado por: jeremylf en 03 de Noviembre de 2011, 01:32:13
Tengo una consulta con el FReeRTOS. En su pagina para los PIC18 dice: Please note that the segmented memory on the PIC18 makes it a less than ideal candidate for use with an RTOS.

Esto lo dicen porque usan un 18F452 para la demo ?? Pues, ahora hay pic18 con mas rom y ram. Talves para estos PICs con mayor capacidad ese comentario ya no se aplique. O no tiene nada que ver?

Gracias
Título: Re: Dicusión sobre RTOS
Publicado por: Darukur en 03 de Noviembre de 2011, 23:13:46
Tengo una consulta con el FReeRTOS. En su pagina para los PIC18 dice: Please note that the segmented memory on the PIC18 makes it a less than ideal candidate for use with an RTOS.

Esto lo dicen porque usan un 18F452 para la demo ?? Pues, ahora hay pic18 con mas rom y ram. Talves para estos PICs con mayor capacidad ese comentario ya no se aplique. O no tiene nada que ver?

Gracias
Hola jeremylf, el problema en si es la arquitectura del micro y del compilador, no de un micro especifico de la linea PIC18.
Al tratarse de un micro que no puede manejar de manera lineal toda su memoria (la accede de a bancos de 256 bytes) y que por decisiones de compromiso su stack esta modelado en hardware, hay muchas restricciones de lo que se puede hacer y en el caso de que se pueda, se debe tener mucho cuidado en su uso.
Osea que uses un PIC18 de mas o menos memoria, te toparas con el mismo problema.

Otro tema, la demo de FreeRTOS con PIC18 es solo a fines de ejemplo, no vas a poder hacer realmente nada util con eso, de seguro te encontrarias en poco tiempo con algun funcionamiento erratico dificil de detectar.
Título: Re: Dicusión sobre RTOS
Publicado por: Suky en 03 de Noviembre de 2011, 23:58:23
Otro tema, la demo de FreeRTOS con PIC18 es solo a fines de ejemplo, no vas a poder hacer realmente nada util con eso, de seguro te encontrarias en poco tiempo con algun funcionamiento erratico dificil de detectar.

+1
Título: Re: Dicusión sobre RTOS
Publicado por: jeremylf en 04 de Noviembre de 2011, 01:07:34
Hola, gracias por la respuesta.

Por lo que comentas, debo entender a que no podré hacer mucho con un PIC18 con esta FreeRTOS?

Por otro lado, no estoy usando dicha demo, nada mas vi ese comentario. El ejemplo que he usado ha sido el de suky (gracias porcierto suky :mrgreen:) Tambien, estoy viendo tu curso en tu pagina, que me esta sirviendo mucho para entender mejor esta RTOS (gracias tambien!).
Título: Re: Dicusión sobre RTOS
Publicado por: Darukur en 04 de Noviembre de 2011, 14:04:12
Por lo que comentas, debo entender a que no podré hacer mucho con un PIC18 con esta FreeRTOS?

En PIC18 te recomiendo (si lo conseguis) SALVO rtos, o alguno que lo emule en funcionamiento, yo hice un mini manejador de tareas (http://www.sistemasembebidos.com.ar/cms/index.php?option=com_content&view=article&id=63:mini-scheduler&catid=36:programacion&Itemid=41) para este tipo de micros y lo he usado con mucho exito (tiene la base de un RTOS cooperativo sin la complejidad del manejo del contexto de tarea).

Tambien funciona con uC/OS-II (http://www.sistemasembebidos.com.ar/cms/index.php?option=com_content&view=article&id=67:ucos-ii&catid=35:cursos-desarrollos-proyectos&Itemid=41) pero en todo RTOS preemptive vas a tener problemas con este micro.