Autor Tema: Bloquear tarea por tiempo indefinido - FreeRTOS  (Leído 6872 veces)

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

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Bloquear tarea por tiempo indefinido - FreeRTOS
« en: 21 de Septiembre de 2012, 15:50:56 »
Hola, estos días he estado trabajando con FreeRTOS para PIC32, he leído algunos libros y foros, pero necesito saber dos cosas que no he encontrado explicita mente, aunque si las he leído pero no las veo... como bloqueo indefinidamente una tarea y como destruyo una tarea.

Estoy trabajando bajo un proyecto de suky para PIC32, tengo dos led funcionando, quiero hacer dos pruebas:

1. Cuando presione un boton, el bloquee una tarea hasta que vuelva a presionar el boton.
2. Cuando presione un boton, el destruya una tarea y cree otra que encienda otro led distinto.

Ojala me puedan ayudar, gracias.

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re: Bloquear tarea por tiempo indefinido - FreeRTOS
« Respuesta #1 en: 21 de Septiembre de 2012, 17:06:07 »
Ya encontré una solución, puedo no suspender una tarea, pero no se como  destruirla, eso queda todavía pendiente... para suspenderla podemos hacer lo siguiente:

Tenemos la siguiente tarea:
Código: [Seleccionar]
xTaskHandle xTarea0;

xTaskCreate( vTASK0, ( const char * const ) "T0", configMINIMAL_STACK_SIZE, NULL, PRIORITY_TASK0, &xTarea0 );

Y podemos suspenderla con la siguiente linea de código:
Código: [Seleccionar]
//         Use the handle to suspend the created task.
           vTaskSuspend( xTarea0 );

Y para activarla seria con:
Código: [Seleccionar]
            vTaskResume( xTarea0 );

Ahora falta como poder destruirla, he encontrado que con la función "vTaskDelete();", se puede destruir, pero no se como utilizarla ni que parámetro pasarle.

Desconectado manutek

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 555
Re: Bloquear tarea por tiempo indefinido - FreeRTOS
« Respuesta #2 en: 21 de Septiembre de 2012, 19:12:30 »
Hola
Otra pregunta referida a los servicios ....tiene FreeRTOS algun servicio de reemplaso de tareas ,es desir matar una tarea y reemplasarla por otra aprovechando la pila de la primera.
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 Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Bloquear tarea por tiempo indefinido - FreeRTOS
« Respuesta #3 en: 21 de Septiembre de 2012, 19:38:02 »
IngRandall, para usar vTaskDelete, primero debes habilitar su uso en FreeRTOSConfig. Luego, si estas en tarea a eliminar, basta con hacer vTaskDelete(NULL);  Y sino vTaskDelete(xTarea0);  por ejemplo.

A tu consulta manutek, no tengo el conocimiento para responderla.


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

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re: Bloquear tarea por tiempo indefinido - FreeRTOS
« Respuesta #4 en: 22 de Septiembre de 2012, 11:13:39 »
Efectivamente Suky, así es, ya lo probé y funciono... ahora lo que no se es como vuelvo a crear una tarea en tiempo de ejecución... mira este ejemplo:

Código: [Seleccionar]
static void vTASK2( void *pvParameters ){
    while(1){
        if(PORT_SW_1==0){
            vTaskDelete(xTarea0);
        }
        if(PORT_SW_2==0){
            xTaskCreate( vTASK0, ( const char * const ) "T0", configMINIMAL_STACK_SIZE, NULL, PRIORITY_TASK0, &xTarea0 );
        }
    }

    // La tarea NUNCA debe pasar de este punto, si lo hiciera debe ser eliminada
    vTaskDelete(NULL);
}

Si presiono el "PORT_SW_1", entonces destruyo la tarea, hasta aqui bien, ya probado y funciona, pero si presiono el "PORT_SW_2", se traba el programa  :shock:

Ya funciono, el problema eran los SW... lo hice de otra forma y funciono, gracias.
« Última modificación: 28 de Septiembre de 2012, 15:51:04 por IngRandall »

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Bloquear tarea por tiempo indefinido - FreeRTOS
« Respuesta #5 en: 04 de Diciembre de 2012, 18:04:56 »
Hola
Otra pregunta referida a los servicios ....tiene FreeRTOS algun servicio de reemplaso de tareas ,es desir matar una tarea y reemplasarla por otra aprovechando la pila de la primera.

Ese servicio tal cual no existe en FreeRTOS pero se puede lograr lo que planteas si utilizas el modo de manejo de memoria apropiado para el heap.

Si utilizas heap1.c se asume que todas las tareas serán creadas antes de comenzar a ejecutar el pĺanificador y por tanto las tareas no serán destruidas o nuevas tareas creadas una vez que se comienza a ejecutar el planificador. Es un método muy útil para sistemas a uC y además es determinístico en el sentido que no se maneja la memoria de forma dinámica, la implementación de malloc es muy simple y free está simplemente vacía. No pensar nunca que este método es poco poderoso, es por cierto el que viene recomendado y por defecto.

Si utilzas heap2.c entonces la memoria se reutiliza cuando creas o eliminas tareas para dar espacio a nuevas tareas, el problema es que no se unifican segmentos de memoria contiguos liberados y tampoco se reorganiza la misma para eliminar la fragmentación. Es muy poderoso si las pilas de las tareas se construyen como múltiplo de un tamaño base porque entonces es más fácil aprovechar la memoria ya que los fragmentos son todos n*tamaño_mínimo y se reduce la fragmentación de memoria. De nuevo este método requiere una implementación simple de malloc() y free()

Si utilizas heap3.c puedes proveer tus propias funciones de manejo de memoria o utilizar la que viene por defecto con FreeRTOS y en este caso incorporar las funcionalidades que desees en el tema de reorganizar la memoria.

Yo siempre recomiendo cuando se utiliza un RTOS en un uC evitar crear y destruir tareas porque la mayoría de nuestras aplicaciones no requieren lanzar y cerrar aplicaciones que por consiguiente liberan o consumen memoria. En general  las aplicaciones a uC tienen un conjunto de tareas estático y modelando adecuadamente el funcionamiento de la aplicación y utilizando semáforos y colas se pueden resolver la mayor parte de los problemas de sincronización y comunicación de tareas sin dificultad.

Saludos
Reinier

Desconectado manutek

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 555
Re: Bloquear tarea por tiempo indefinido - FreeRTOS
« Respuesta #6 en: 04 de Diciembre de 2012, 19:44:07 »
Hola reiniertl ¡¡¡

Estaba mas orientada la pregunta x que utilizo este método de reemplazo de tareas en los cooperativos para la sección de los menúes,en los programas que realizo. y en el momento de investigar el FreeRTOS no encontré ningun servicio y me pareció que otro servicio o configuracion como mencionabas podia haser lo mismo....
bueno queda de mi parte probar y agradecerte por la lección

Saludos 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