Autor Tema: Gestión de tareas en FreeRTOS  (Leído 9040 veces)

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

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Gestión de tareas en FreeRTOS
« en: 02 de Enero de 2013, 15:50:26 »
Buenas,

Estoy haciendo mi primer programa con un RTOS, tengo por ahora unas 5 tareas y posiblemente al final llegue a tener hasta 10, la mayoría son de prioridad 2 y una con 3 y otra con prioridad 4.

Hay una que se activa cada 5 segundos (con prioridad 2) y envía dos comandos por el puerto serie, pues bien, hay veces que el segundo comando no lo envía (solo algunas). ¿a que se puede deber?

Cuando hay una tarea en ejecución y lo interrumpe otra, cuando vuelve continúa ésta por donde iba, no? Si lo interrumpe el RTOS para atender otra, cuando le vuelve otra vez el turno sigue por donde iba, no? para que ésto lo haga correctamente... es necesario incrementar alguna pila para que no pierda en ningún momento? porque si tiene 4 tareas a medias y las va gestionando cada 1ms cada una debe guardar por donde va en cada una de ellas.

Espero que podais ayudarme. Gracias!!

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: Gestión de tareas en FreeRTOS
« Respuesta #1 en: 02 de Enero de 2013, 16:41:58 »
Solucionado, dandole un retardo de 1ms entre un envío al puerto serie y el otro...

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: Gestión de tareas en FreeRTOS
« Respuesta #2 en: 04 de Enero de 2013, 09:21:01 »
Me surge otra nueva cuestión.

SITUACIÓN:
Tengo dos tareas:

TASK 1 priority 3
TASK 2 priority 2

estoy en la tarea 2 ejecutando una zona de código que está dentro de un semaforo (ya que está utilizando un recurso que comparte con la tarea 1)

INCOGNITAS:
1. Si en ese momento entra a ejecutarse la tarea 1 (al tener mas prioridad). Ésta se ejecutará?
1.1. Si se ejecuta hasta que llegue el momento de utilizar el recurso el cual está ocupado y la tarea 1 se bloquea y entonces sigue ejecutando la zona del semaforo hasta que acabe y luego continua la tarea 1 ejecutando ese recurso normalmente?
2. La tarea 1 no se ejecuta al estar ejecutandose en ese momento un semaforo?

gracias por responderme estas cuestiones entre semaforos y prioridades...

Desconectado suigeneris_abril24

  • PIC10
  • *
  • Mensajes: 3
Re: Gestión de tareas en FreeRTOS
« Respuesta #3 en: 16 de Junio de 2014, 16:30:42 »
Como determino el número máximo de tareas que puede cubrir un RTOS? si tengo un pic18f4550 o un 18f4526 de que dependería el numero de tareas paralelas?

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Gestión de tareas en FreeRTOS
« Respuesta #4 en: 30 de Septiembre de 2014, 09:45:50 »
Primero tienes que saber cuales son los overheads de tu RTOS, es decir cuanto se lleva el TCB y cuanto necesita el mismo SO para operar otras estructuras para el control de tareas. Después tendrás que ver cuanto asignas como pila de tareas a cada tarea y por allí te puedes ir haciendo una idea del gasto de memoria.

Si tu RTOS utiliza métodos estáticos de asignación de memoria (bastante común en uC) entonces la herramienta de desarrollo te puede hacer los cálculos y sabrás cuanto estás consumiendo. Si tienes manejo dinámico de memoria (malloc y free) entonces la cosa no tiene otra salida que depurar el uso de memoria para saber cuanto utilizas en el caso peor y cuanto realmente no estás utilizando.

Existen RTOSes que tienen funciones de la API que te permiten saber cuanta memoria de la pila asignada a la tarea se ha utilizado y eso te puede ayudar a ajustar el tamaño de la pila. En caso de desbordamiento de pila tendrás que ver que te da el RTOS para ello. Lo más común es que el RTOS no haga nada y te lance una excepción por desbordamiento de pila.

Saludos
Reinier

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Gestión de tareas en FreeRTOS
« Respuesta #5 en: 30 de Septiembre de 2014, 10:42:35 »
Me salté la respuesta a esta

Citar
Me surge otra nueva cuestión.

SITUACIÓN:
Tengo dos tareas:

TASK 1 priority 3
TASK 2 priority 2

estoy en la tarea 2 ejecutando una zona de código que está dentro de un semaforo (ya que está utilizando un recurso que comparte con la tarea 1)

INCOGNITAS:
1. Si en ese momento entra a ejecutarse la tarea 1 (al tener mas prioridad). Ésta se ejecutará?
1.1. Si se ejecuta hasta que llegue el momento de utilizar el recurso el cual está ocupado y la tarea 1 se bloquea y entonces sigue ejecutando la zona del semaforo hasta que acabe y luego continua la tarea 1 ejecutando ese recurso normalmente?
2. La tarea 1 no se ejecuta al estar ejecutandose en ese momento un semaforo?

gracias por responderme estas cuestiones entre semaforos y prioridades...

Todo depende del tipo de semáforo que estés utilizando. Dado que el recurso es compartido voy a asumir que utilizas un MUTEX y no un semáforo binario. Si lo has hecho con semáforo binario debes cambiar para MUTEX porque los semáforos binarios son para sincronización de actividad, no para acceso a recursos compartidos.

1. Si, comenzará a ejcutar hasta que llame a take() y como el MUTEX está en LOCKED por la tarea 2 la tarea 1 se bloqueará y estará en un estado que el RTOS no tiene que reconocer para la tarea (pero sí para el MUTEX) pero que nosotros debemos llamar "inversión de prioridad".

1.1 Con MUTEX si porque ahora la tarea hereda la prioridad de la tarea 1. Esto lo hace el RTOS, que al detectar la inversión de prioridad sube la prioridad de la tarea 2 al nivel de la tarea 1 (3) hasta que ella llame a give(). Entonces el RTOS devuelve la tarea 2 a su nivel de prioridad (2) y le da el procesador a la tarea 1. Esto se hace así para evitar que una tarea de prioridad intermedia pueda extender la inversión de prioridad. Es el mecanismo básico contra la inversión de prioridad.

2. Los semáforos no se ejecutan, se utilizan para marcar el inicio y fin de una sección crítica. Para ello introduces código protegido por take() ... secc crítica ... give(). La tarea 1 no podrá ejecutarse si la tarea dos está ejecutado código de la sección crítica, tendrá que esperar a que la tarea 2 libere el MUTEX.

Saludos
Reinier