TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: LABmouse en 30 de Junio de 2010, 20:51:04

Título: Preguntas concretas sobre FreeRTOS.
Publicado por: LABmouse en 30 de Junio de 2010, 20:51:04
Hola, decido abrir este hilo para poder plasmar de manera ordena algunas preguntas que van surgiendo sobre el uso de este sistema operativo.

Como se crea una Tarea que sera ejecutada por una interrupción?
Sucede que no conozco que cuidados hay que tener con aquellas tareas que son ejecutadas por Interrupción.  Conocen algún ejemplo del cual me pueda guiar?.

Título: Re: Preguntas concretas sobre FreeRTOS.
Publicado por: jgpeiro06 en 02 de Julio de 2010, 19:08:57
Mas o menos lo que tienes que hacer es una tarea que se bloquee llamando a xSemaphoreTake(), luego en la ISR de la interrupcion correspondiente llamas a xSemaphoreGiveFromISR().
Si descargas el FreeRTOS, en la carpeta FreeRTOS\Demo\XXX\serial viene un ejemplo del driver de la UART que muestra con mas detalle como utilizar la interrupcion para que active la tarea. Tambien en la documentacion online de FreeRTOS sobre la funcion xSemaphoreGiveFromISR http://www.freertos.org/a00124.html

Yo no estoy seguro de haber entendido esto bien, pero creo que tener en cuenta que TaskISR puede tener o no una prioridad mayor que la tarea que se estaba ejecutando en el momenot de ocurrir la IRQ. Para eso la funcion tiene un argumento mas llamado xHigherPriorityTaskWoken

Saludos

Código: C
  1. xSemaphoreHandle sem;
  2.  
  3. ISR(){
  4.     xSemaphoreGiveFromISR( sem );
  5. }
  6.  
  7. TaskISR(){
  8.     while(1){
  9.         xSemaphoreTake( sem );
  10.         ...code...
  11.     }
  12. }
  13.  
  14. main(){
  15.     vSemaphoreCreateBinary( sem );
  16.     xTaskCreate( TaskISR );
  17.     vTaskStartScheduler();
  18. }
Título: Re: Preguntas concretas sobre FreeRTOS.
Publicado por: LABmouse en 02 de Julio de 2010, 19:44:19
Perfecto, muchas gracias por responderme jgpeiro06.

Entonces, la interrupción, sera una función como siempre la hacemos sin tener nada que ver con el FreRTOS, lo que hay que agregar en el ISR el GiveSemaphoreFromISR  para que ella pase a ejecución la tarea que esta esperando dicha interrupción.

GRACIAS!