Autor Tema: Dicusión sobre RTOS  (Leído 26667 veces)

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

Desconectado rodrigo_control2009

  • PIC12
  • **
  • Mensajes: 54
    • Blog  de la  Orden del  temple
Re: Dicusión sobre RTOS
« Respuesta #30 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.
“El hombre ideal, sería persa de origen, árabe de religión, iraquí por cultura, hebreo por experiencia, cristiano por conducta, hindú por perspicacia, sufí por su estilo de vida, angélico por su moral y divino por sus ideas y conocimiento, destinado a la eternidad”

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Dicusión sobre RTOS
« Respuesta #31 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!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado rodrigo_control2009

  • PIC12
  • **
  • Mensajes: 54
    • Blog  de la  Orden del  temple
Re: Dicusión sobre RTOS
« Respuesta #32 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.
 
“El hombre ideal, sería persa de origen, árabe de religión, iraquí por cultura, hebreo por experiencia, cristiano por conducta, hindú por perspicacia, sufí por su estilo de vida, angélico por su moral y divino por sus ideas y conocimiento, destinado a la eternidad”

Desconectado giff

  • PIC10
  • *
  • Mensajes: 31
    • Ignogantes
Re: Dicusión sobre RTOS
« Respuesta #33 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

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 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.
Mi blog sobre apuntes de electrónica: www.ignogantes.net

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Dicusión sobre RTOS
« Respuesta #34 en: 04 de Febrero de 2010, 01:01:25 »
mmm.. Por aquí 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!
No contesto mensajes privados, las consultas en el foro

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Dicusión sobre RTOS
« Respuesta #35 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

Desconectado giff

  • PIC10
  • *
  • Mensajes: 31
    • Ignogantes
Re: Dicusión sobre RTOS
« Respuesta #36 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 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
Mi blog sobre apuntes de electrónica: www.ignogantes.net

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Dicusión sobre RTOS
« Respuesta #37 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í.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado giff

  • PIC10
  • *
  • Mensajes: 31
    • Ignogantes
Re: Dicusión sobre RTOS
« Respuesta #38 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
Mi blog sobre apuntes de electrónica: www.ignogantes.net

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Dicusión sobre RTOS
« Respuesta #39 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Dicusión sobre RTOS
« Respuesta #40 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

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Dicusión sobre RTOS
« Respuesta #41 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 607
Re: Dicusión sobre RTOS
« Respuesta #42 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....
     

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Dicusión sobre RTOS
« Respuesta #43 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!
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dicusión sobre RTOS
« Respuesta #44 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


 

anything