--
-- 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+unsubscribe@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+unsubscribe@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
Hay varios libros que cubren el tipo de algoritmo que estás buscando. Los que recuerdo son:"Real-Time Embedded Systems" - Xiaocong Fan"Embedded Systems Building Blocks" - Jean LabrossePodés buscar en la web bajo los términos: "Timing wheel C", "Timer wheel C" o "Software timers C". Hay muchas implementaciones dando vueltas.Hay uno bastante interesante, que a diferencia del resto, está basado en eventos:Saludos,Fernando Mondello
El 10 de enero de 2017, 10:40, Geni Suarez<geni...@gmail.com> escribió:
Grcias Christian, pero vamos a intentarlo:Realmente quisiera planificar algo muy básico para empezar por lo sencillo, más adelante ya incrementaría el nivel de complejidad.Imaginemos 4 tareas o 5 a lo sumo; funciones que se ejecutan cuando son llamadas y está previsto que sean llamadas cuando ha pasado una cierta cantidad de tiempo (diferente en cada una) y que no son preventivas (no deben ser interrumpidas). Si me apuras a concretar un dato más, algunas pueden lanzar llamadas al driver, como sea leer o escribir en algún registro GPIO.
Me gustaría saber cómo se escribe un planificador. Dónde y cómo se define, etc.. y bueno una estructura. Supongo que puedo tener un timer corriendo que al llegar a determinados valores active un flag. Luego fuera del timer ya comparo el flag (p ej: por polling) y si cambió entonces lanzo la tarea correspondiente. Así hasta que las n tareas hayan sido lanzadas de forma cíclica. Si alguna no puede lanzarse porque está en ejecución la anterior no pasa nada, ya saldrá cuando esté libre y le toque turno.Esa sería mi idea conceptual de lo que trataría de llevar a código.Por cierto, muy interesante ese link, lleva de todo.
--
-- 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 acceder a más opciones, visita https://groups.google.com/d/optout.
--Saludos,
Fernando Mondello
Grcias Christian, pero vamos a intentarlo:Realmente quisiera planificar algo muy básico para empezar por lo sencillo, más adelante ya incrementaría el nivel de complejidad.Imaginemos 4 tareas o 5 a lo sumo; funciones que se ejecutan cuando son llamadas y está previsto que sean llamadas cuando ha pasado una cierta cantidad de tiempo (diferente en cada una) y que no son preventivas (no deben ser interrumpidas). Si me apuras a concretar un dato más, algunas pueden lanzar llamadas al driver, como sea leer o escribir en algún registro GPIO.
Me gustaría saber cómo se escribe un planificador. Dónde y cómo se define, etc.. y bueno una estructura. Supongo que puedo tener un timer corriendo que al llegar a determinados valores active un flag. Luego fuera del timer ya comparo el flag (p ej: por polling) y si cambió entonces lanzo la tarea correspondiente. Así hasta que las n tareas hayan sido lanzadas de forma cíclica. Si alguna no puede lanzarse porque está en ejecución la anterior no pasa nada, ya saldrá cuando esté libre y le toque turno.Esa sería mi idea conceptual de lo que trataría de llevar a código.
Por cierto, muy interesante ese link, lleva de todo.
--
-- 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+unsubscribe@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+unsubscribe@googlegroups.com.
--
-- 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.
Hola nuevamente
Coincidiendo con lo dicho por Martin y un poco lo que intente comentar en la primer respuesta, el algoritmo de scheduling es lo menos importante por lo menos al comenzar ya que de nada sirve si no se domina la arquitectura donde se implementara.
Tomando tu decision de conmutar las tareas cuando finalizan, eso mas que preemtivo (como indicaste originalmente) seria algo mas parecido a colaborativo.
Pasando en limpio tu especificacion, que dista de ser colaborative, preemtive u orientada eventos, pareceria que tu idea es que un temporizador dispara la conmutacion de tarea cada un tiempo N. Dicho tiempo sera el que tenga asignado la tarea para hacer su mision. En este contexto ni bien sepas que procesador utilizar, o aunque sea que arquitectura vas a emplear tenes que reconocer como vas a restaurar los registros de la interrupcion del temporizador. Pensando en voz alta, suponiendo que estamos en la tarea 1 (al fin y al cabo por una hay que empezar aunque sea la idle), salta la interrupcion, segun la arquitectura los datos de retorno se almacenan en la pila o en registros especificos (retene esto en mente), ahora dentro del controlador de la interrupcion vos modificas dichos registros para que cuando hagas el iret, reti (o como sea en el uP) la direccion de salto sea el comienzo de la siguiente tarea.
typedef struct { void (*entry)(); uint32_t timestamp; uint32_t duration; uint32_t interval; } Task_t; extern Task_t *get_next_task(); // scheduler propiamente dicho extern uint32_t current_time(); // retorna el timestamp actual (en ticks, ms, us o lo que fuere) extern void ConfigTimer(uint32_t duration); // Configura interrupcion del timer para duration (ticks, ms, us o lo que fuere) extern void ResetTimer(); // deshabilita la interrupcion del timer // Contexto para volver de la tarea cuando se supera el tiempo de ejecución jmp_buf tout_ctx; void sched() { while(1) { Task_t *t = get_next_task(); uint32_t ts = current_time(); if (t->timestamp >= ts && t->timestamp <= ts + t->duration) { if (setjmp(&tout_ctx) == 0) { t->entry(); ResetTimer(); } else { printf("Task %p timeout", t); } } t->timestamp = ts + t->interval; } } // TimerInterrupt es llamada cada vez que termina la cuenta del timer void TimerInterrupt() { // Restaura el contexto salvado antes de entrar a la tarea longjmp(tout_ctx); // Esto es incorrecto y puede fallar si esta en una interrupción // Hay que implementarlo manipulando el stack de interrupción }
Con este escenario ya tenes bastante para pensar, ¿donde esta guardadas las direcciones de inicio de la siguiente tarea? ¿cuando te referis que se perdio por una vez, donde guardaste los registros para retomar su ejecucion la proxima vez que se ejecute? ¿en que nivel de ejecucion esta la rutina de conmutacion? ¿que sistemas de proteccion tiene la arquitectura/uP? ¿quien inicializo los registros de gestion de memoria paginacion/segmentacion o lo que sea.
Por ejemplo en Intel (x86/64) podes conmutar de una tarea a otra sin necesidad de timer, el procesador tiene mecanismos de anidamiento y conmutacion internos que te facilitan la tarea, basta que al finalizar cada tarea haga una jmp far o call a una estructura especfica de la arquitectura que se encarga de activar el mecanismo de guardado y restaurado del contexto. Por lejos este metodo es el menos utilizado ya que es super dependiente de esta arquitectura, pero bastante facil de llevar adelante.
Realmente empezar por el algoritmo de scheduling sin saber la arquitectura que lo va a soportar no es mas que un mero ejercicio de listas enlazadas, ya que lo complejo del scheduler es su gestion de cambio de contexto. Al menos es el consejo desde mi humilde experiencia.
Salu2
--
-- 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+unsubscribe@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+unsubscribe@googlegroups.com.
--
-- 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+unsubscribe@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+unsubscribe@googlegroups.com.
--
-- 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.