El lun., 13 may. 2019 a las 10:27, Mauro Moreyra
(<
maurom...@gmail.com>) escribió:
>
> Hola a todos.
>
> Necesito implementar una "especie" de watchdog sobre FreeRTOS. Me refiero a "especie", ya que en la web encontré un par de estrategias que no lo implementan como tal, sino como que existe una tarea "watchdog" que cada X tiempo va verificando "flags", los cuales son manejados por las otras tareas a "supervisar", y en el caso de que alguna tarea se "cuelgue" sin tener que hacerlo, no refresca su "flag", por ende la tarea watchdog reinicia esa tarea (o algunas, o todas, dependiendo del escenario). Pero consulto en la comunidad si alguno ya lo implementó y lo probó con eficacia, ésta u otra estrategia, y si me puede comentar cómo lo hizo.
>
Lo que entiendo que estas buscando es un task killer timer, es decir,
un evento controlado por hardware que marque tu tarea como completa o
incompleta....
En términos generales, tenes una IRQ de un timer (distinto al system
tick o los timer del RTOS) que cuando se activa, mata/reinicia la
tarea marcada cono "on kill timer" y una variable para saber que tarea
es la del kill timer.
Cuando una tarea quiere iniciar una sección protegida por tiempo, se
inicia el kill timer y de no borrarse a tiempo, se activa la IRQ y esa
tarea es reiniciada.
Esto tiene dos problemas:
El primero es que una tarea determinada esta atada a un kill timer
determinado, para tener muchas tareas necesitas consumir muchos
killtimers de hardware, esto no es practico porque los timers de
hardware son limitados. Se puede palear el problema con timers por
software, pero la verdadera solución proviene por modificar freeRTOS
para que use el "run time count" como watchdog y si se pasa de ese
tiempo, la reinicie.
https://github.com/cjlano/freertos/blob/master/FreeRTOS/Source/include/task.h#L137
Por supuesto, también se requiere añadir una llamada al sistema para
borrar el runtime count (lo ideal seria tener otro runtime count
gemelo que cuente el tiempo hacia su muerte)
El otro problema es la limpieza de los recursos. FreeRTOS no libera
los semáforos/mutes/recursive-mutex al momento de hacer un task
delete. Esto es un problema ya que si la tarea adquiere algún recurso
y se reinicia ese recurso queda adquirido sin posibilidad de
liberarse... esto es manejable si tenemos el cuidado de que la tarea
no tenga recursos adquiridos cuando esta en posibilidad de "killtimer"
o agregamos un hook para el task delete que nos libere los recursos
que esta tarea tiene tomados. Por supuesto, el task delete hook solo
podría hacerse cargo, de forma segura, de recursos tomados antes del
killtime porque, si adquirimos esos recursos en mitad de un killtimer
nada nos garantiza que entre que adquirimos el recurso y lo ponemos en
cola de recursos adquiridos, no salte el killtimer y nos quedemos con
un recurso adquirido pero que no vemos como limpiable al kill.
La solución a esto otro pasa, de nuevo, por modificar freeRTOS para que:
- Lleve una cuenta de los recursos adquiridos. Esto requiere
modificaciones al código de los semáforos para poder tener un
ownership atómico, lo cual no es para nada fácil
- Prohibir la adquisición de recursos mientras esta en killtime
- Permitir la adquisición y que esa adquisición limpie antes el
killtime de forma que, nos de tiempo de poner nuestro killtime dentro
del registro de recursos usados (y obviamente, tener un hook que los
libere al finalizar la tarea)
Como vez, freeRTOS no esta tan pensado para hacer esto. Si bien hay
formas de hacerlo, requiere cuidado y una planificación meticulosa del
comportamiento de las tareas.
> Muchas gracias.
> Saludos.
>
> --
> -- Recibiste este mensaje porque estás suscripto al Grupo Google Embebidos32. Para postear en este grupo, escribe un email a
embeb...@googlegroups.com. Para des-suscribirte, envía un email a
embebidos32...@googlegroups.com. Para más opciones, visita el sitio del grupo en
https://groups.google.com/d/forum/embebidos32?hl=es
> ---
> Has recibido este mensaje porque estás suscrito al grupo "Embebidos32" de Grupos de Google.
> Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a
embebidos32...@googlegroups.com.
> Para ver esta conversación en el sitio web, visita
https://groups.google.com/d/msgid/embebidos32/11d745e6-4a4d-4d2e-b673-6a416a71f294%40googlegroups.com.
> Para acceder a más opciones, visita
https://groups.google.com/d/optout.