Autor Tema: FreeRTOS C18  (Leído 6345 veces)

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

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
FreeRTOS C18
« en: 05 de Noviembre de 2011, 02:29:49 »
Estoy estudiando este RTOS y me he basando en los ejemplos de suky (http://www.micros-designs.com.ar/freertos-en-c18-utilizacion-de-colas/) principalmente.

Aun tengo muchas dudas y un largo camino por recorrer. Pero, hasta el momento he logrado hacer uso de tareas y mensajes de este RTOS  con interrupcion del usart por recepcion.

Pues, bien, dejo adjuntado todo lo que tengo tal cual, que funciona correctamente en un PIC18F4550 en la placa PICDEM FS USB de microchip (tambien hay una simulacion en proteus).

Lo que hace no es nada del otro mundo: Prmierp, creo una tarea principal que es como la configuracion de los perifericos y demas cosas que comunmente se haria al pincipio del main; aqui, configuro los TRISs, LATs, la interrupcion de la usart por rx, etc. Luego, de hacer hecho todo lo que tengo que hacer ahii por unica vez, elimino dicha tarea, pero antes, creo dos tareas mas. Una destinada a hacer oscilar un led por RD0 cada 200ms aprox. (no estoy seguro aun). Por otro lado, creo otra tarea que es la encargada de procesar el dato que se llega cuando ocurre la interrupcion por rx de la usart.

Entonces, cuando llega un byte por la usart al pin rx del pic, ocurre una interrupcion. Esta, guarda el dato y se la envia, atravez de un mensaje (queue) a la tarea encargada de analizar el dato y hacer lo que tenga que hacer, que en mi caso, solo lo vuelve a enviar al terminal por el tx, entre otras cosa mas.

Ahora, tengo unas cuantas dudas como habia dicho sobre este RTOS y ojala puedan contestarmelas.
1. El FreeRTOS usa algun timer como con en el CCS que tu le dices que timer usar?

2. Porque en port.c en esa parte de pvrLowInterrupt, solo atiende a la interrupcion del usart? Que pasa con las demas interrupciones?

3. Si quiero implementar por ejemplo algo con el timer0 (o algun otro) debo alterar algo el port.c como lo hice con el uart?

4. En mi programa, puse a la tarea2 (la que atiende a los mensajes del usart) una prioridad mayor. Lo hice porque es mas prioritario esto no? Porque suky no lo hiciste asi? No es el caso para hacer esto?

5.

Enserio ?

Bueno, gracias suky, reiniertl, Darukur, J1M y a todos los que han aportado mucho por la implementacion de esta RTOS.

Finalmente, dejo unos links que me han servido mucho:
plantilla c18 de suky: http://www.micros-designs.com.ar/freertos-en-c18-plantilla/
Darukur: http://sistemasembebidos.com.ar/foro/index.php?topic=237.msg1023#msg1023
RTOS CCS reiniertl: http://www.todopic.com.ar/foros/index.php?topic=15876.0
Curso reiniertl: http://www.micropic.es/cursos/course/view.php?id=3
J1M: http://www.todopic.com.ar/foros/index.php?topic=31520.0


Saludos.

DESCARGA: http://www.megaupload.com/?d=KKU3WWP6 (tiene que ponerlo en C: pues sino habra problemas con algunos archivos, yo los tuve  :mrgreen: )



« Última modificación: 05 de Noviembre de 2011, 06:31:39 por jeremylf »

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: FreeRTOS C18
« Respuesta #1 en: 06 de Noviembre de 2011, 21:26:41 »
El puerto de PIC18 utiliza el TIMER1 como temporizador del kernel, el fichero port.c tiene la implementación de las interrupción del TIMER1, si vas hasta el finl del fichero verás allí la implementación de la subrrutina de interrupción, desde la cual se hace una llamada a la función de planificación.


El resto de las interrupciones se pueden modificar como desees, pero no puedes olvidar que estás trabajando con un demo, por lo que los desarrolladores no se han preocupado mucho de hacer el código de modo que sea flexible.


Si utilizas varias interrupciones en PIC18, tienes dos vectores para atender a varias fuentes de interrupción, así que si ya se han utilizado los vectores, tendrás que modificar el código fuente para utilizar muchos más. Lo mejor es mover el código de interrupción para un fichero aparte y en la subrrutina de cada vector encuestar y saltar a las rutinas de interrupción tuyas. El manual C18 tiene un ejemplo de como hacer esto, pero no es la forma en que se hace en el demo de FreeRTOS.

Sobre el punto 5 no hay comentarios, así que supongo que tu preocupación está dada por el consumo de recursos, en el caso de la RAM no puedes hacerle caso, porque FreeRTOS necesita que le reserven memoria en una estructura del timpo heap para de allí asignarle las pilas a las tareas. La ROM si que se gasta tal como aparece, pero el demo de FreeRTOS tiene unas cuantas cosillas aunque no lo parezca, algunas de ellas bastante pesadas en cuanto a código.

Yo por ejemplo logré meter el núcleo y la tarea idle en solo 2K instrucciones de  memria FLASH, cuando comienzas a ponerle semáforos y colas se pone entre 3.5 y 4K instrucciones, así que el núcleo y su código base es bastante ligero. Ten en cuenta que tienes un sistema multitareas en tu micro de 8 bits, por ejemplo DOS nunca fue multitarea y se utilizó en muchas PC desde los comienzos de los ochenta hasta mediados de los 90.


Un saludo
Reinier

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: FreeRTOS C18
« Respuesta #2 en: 09 de Noviembre de 2011, 05:02:45 »
Gracias reiniertl por las respuestas.

De esta forma, puedo entender que no es posible utilizar el timer 1 para algún uso que yo le quiera dar verdad?

Cual son esos dos vectores al que te refieres? Yo solo entiendo la parte que se tiene que comentar si no se usa la interrupcion del usart por rx o tx. El codigo fuente, primordialmente es el port.c no?

Por el consumo, con la imagen que he puesto, la aplicación que le pueda dar a un 4550 con FreeRTOS sera poca no? Pues, para una aplicacion son USB, aparte de que el consumo de memoria aumenta mucho mas, habrá que modificar también el .LKR para ajustar los espacios reservados de memoria, tanto para el usb como para el RTOS.

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: FreeRTOS C18
« Respuesta #3 en: 09 de Noviembre de 2011, 09:59:14 »
Citar
De esta forma, puedo entender que no es posible utilizar el timer 1 para algún uso que yo le quiera dar verdad?

Sí y no. En realidad no puedes utilizar la interrupción de la misma forma que utilizas el resto de las interrupciones porque tendrías que eliminar la interrupción del tick del sistema operativo. Sin embargo, FreeRTOS tiene un truco para este inconveniente, los ganchos "hook functions". Existen dos hook functions en FreeRTOS, uno está ligado a la tarea idle el otro al tick del sistema operativo. Así que si deseas hacer algo ligado al TIMER1 tendrás que hacerlo en e tick hook. Al utilizar esta funcionalidad puedes hacer uso del TIMER1, pero no según tus propiros intereses, sino al de los intereses del sistema operativo.

También puedes modificar el port.c y utilizar otro temporizador para el TICK del sistema operativo, aunque eso puede implicar perder flexibilidad en la resolución y precisión del TICK, por ejemplo si usas el TIMER0. O también puedes obtener más flexibilidad si te cambias a un TIMER más poderoso que el TIMER1. De todos modos lo más recomendable es dejar el TIMER1 para FreeRTOS ya que es una buena relación de compromiso para el TICK. Sin embargo, el puerto de PIC32 sigue tomando el TIMER1 para el TICK, aunque yo hubiese tomado el TIMER del núclo MIPS, el cual seguramente muchos desarrolladores de aplicaciones con PIC ni sabe que existe.

Citar
Cual son esos dos vectores al que te refieres? Yo solo entiendo la parte que se tiene que comentar si no se usa la interrupcion del usart por rx o tx. El codigo fuente, primordialmente es el port.c no?

Para conocer un poco más acerca de esto tendrás que leer en el datasheet y los manuales de la familia PIC18. Basta decirte que estos micros tienen solamente dos vectores de interrupción y muchas otras fuentes de interrupción. Por ejemplo la familia PIC16 e inferiores tienen un único vector de interrupción. Por otro lado las familias avanzadas tienen hasta 92 vectores de interrupción y dos tablas de vectores, lo que los convierte en sistemas realmente poderosos desde este punto de vista.

Cuando el sistema es interrumpido, se ejecuta la subrrutina de interrupción ubicada en el vector al que está ligada la fuente de interrupción. Dado que en los PIC18 varias fuentes de interrupción pueden estar ligadas al mismo vector. Cuando se ejecute la subrrutina de atención a interrupción tendrías que averiguar cual ha sido la fuente y ejecutar entonces el código ligada a esa fuente y no a otras. Lo que ocurre es que habitualmente los códigos de ejemplo tienen una sola fuente de interrupción activada y por eso no se toman la molestia de explicar en detalle este "problemilla".


Citar
Por el consumo, con la imagen que he puesto, la aplicación que le pueda dar a un 4550 con FreeRTOS sera poca no? Pues, para una aplicacion son USB, aparte de que el consumo de memoria aumenta mucho mas, habrá que modificar también el .LKR para ajustar los espacios reservados de memoria, tanto para el usb como para el RTOS.


El linker lo tienes que modificar, en cuanto a la cantidad de cosas que puedes hacer, eso depende de las necesidades de la aplicación y de las técnicas de desarrollo que utilices, etc. Lo que ocurre con la memoria de datos es que tienes que reservar una buena parte de ella para poder asignarla a las pilas de las tareas, aún cuando no utilices esa memoria tienes que reservarla y por eso parace que se ha terminado aún cuando tengas sólo dos tareas en el sistema. La memoria de programas es otro asunto, esa se consume con código o tablas de constantes.

Saludos
Reinier

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: FreeRTOS C18
« Respuesta #4 en: 09 de Noviembre de 2011, 14:49:26 »
De nuevo, gracias. Dudas despejadas  :-/

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: FreeRTOS C18
« Respuesta #5 en: 11 de Noviembre de 2011, 05:53:50 »
Ahi va otra  :mrgreen:  

Veo que en la rutina de configuración del timer (en este caso, el timer 1) también configura algo del módulo CCP, en concreto parece ser con el modo comparador. Es así? Es decir, también trabaja con este periferico? Para que?

Gracias!

EDITO:
Me respondo yo mismo, leyendo y leyendo creo que el uso del modulo CPP que le dan ahi es el de ESPECIAL EVENT TRIGGER, quien se encarga de poner a 0 (restear) el timer 1. Estoy en lo cierto?
« Última modificación: 11 de Noviembre de 2011, 06:08:06 por jeremylf »

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: FreeRTOS C18
« Respuesta #6 en: 11 de Noviembre de 2011, 11:23:40 »
Utiliza el Timer 1 por la resolución. 16-bits. Luego junto al comparador lo trabaja como funciona el timer 2 junto a su PR2  ;-)


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

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: FreeRTOS C18
« Respuesta #7 en: 12 de Noviembre de 2011, 01:55:35 »
Ambos tienen razón

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: FreeRTOS C18
« Respuesta #8 en: 12 de Noviembre de 2011, 03:39:01 »
Bien!  De nuevo, gracias a ambos!  :mrgreen:

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: FreeRTOS C18
« Respuesta #9 en: 12 de Noviembre de 2011, 08:52:38 »
Hola amigos, ¿Saben de algún puerto para el PIC18F47J53?. Ese tiene timer RTC y pensaba dedicarle ese Timer al RTOS.

Saludos!

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: FreeRTOS C18
« Respuesta #10 en: 19 de Noviembre de 2011, 00:11:59 »
Puedes adaptar el purto que viene con FreeRTOS para ese uC, no es difícil, basta cambiar el PIC en el proyecto de MPLAB, liker script, unas cuantas horas sacando los errores y ya está.

Saludos
Reinier


 

anything