Intente implementar un planificador en STM32F4

0

Tengo una pregunta con respecto a la implementación del planificador. He intentado implementar un programador de acuerdo con mi entendimiento.

En este ejemplo, he aprovechado el controlador Systick proporcionado por STM32, por lo que mi controlador se ve algo así:

void SysTick_Handler(void)
{
  HAL_IncTick();
  HAL_SYSTICK_IRQHandler();    

  if(ticks_for_scheduler++==100)
      ticks_for_scheduler=0;    
}

Tengo un archivo scheduler.h que tiene este aspecto:

void (*task1)() = read_temp;
void (*task2)() = Display_temp_lcd;

y mi scheduler.c se ve así:

extern uint16_t ticks_for_scheduler;
void sched_system()
{

  if(ticks_for_scheduler==20)
      (*task1)();

  if(ticks_for_scheduler==40)
  {
      (*task2)();
  }   
}

La función sched_system se llama en main(){while(1){sched_system();} Mi objetivo es ejecutar task1 cada 20 ms y task2 cada 40 ms, pero de alguna manera no puedo hacerlo bien. No estoy seguro de lo que estoy haciendo mal? No veo los resultados en mi LCD como se esperaba.

    
pregunta Abel Tom

1 respuesta

3

Su variable ticks_for_scheduler simplemente cuenta de 0 a 99 una y otra vez, una cuenta por milisegundo. Esto significa que contiene cualquier valor particular una vez cada 100 ms.

En su función principal, eso es todo lo que está verificando, si la variable contiene un valor particular. Por lo tanto, cada tarea solo se ejecutará una vez cada 100 ms.

  

Mi objetivo es ejecutar la tarea 1 cada 20 ms y la tarea 2 cada 40 ms

En el caso más general, cuando una tarea determinada necesita ejecutarse cada N ms, debe mantener un contador separado para cada tarea. En el caso más restringido en el que cada período N tiene un múltiplo común de 100 ms, puede usar un operador de módulo:

if (ticks_for_scheduler%20 == 0) (*task1)();
if (ticks_for_scheduler%25 == 0) (*task2)();

Tenga en cuenta que 40 ms no tiene 100 ms como múltiplo, pero podría hacer que ticks_for_scheduler se ejecute de 0 a 199 si desea usar 40 ms como un intervalo.

También hay un problema más sutil aquí. Está asumiendo que sched_system() se ejecuta al menos cada 1 ms, de modo que pueda "ver" cada valor posible de ticks_for_scheduler . Pero si alguna tarea dada se ejecuta por más de 1 ms, esto no se puede garantizar. Debe tomar precauciones para que el funcionamiento de su programador no se vea perturbado por las tareas en sí mismas, que es un tema demasiado amplio para tratar aquí.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas