Untitled

 avatar
unknown
plain_text
a month ago
1.8 kB
2
Indexable
/*
 * scheduler.c
 *
 *  Created on: Dec 7, 2022
 *      Author: MihaiDaraban
 */


#include "scheduler.h"

tCB initTask(void (*funct)(), uint8_t taskPeriod,  uint8_t taskDelay, bool periodicTask)
{

    tCB task;

    task.funct = funct;
    task.taskPeriod = taskPeriod;
    task.taskDelay = taskDelay;
    task.elapsedTime = 0; // initializare timp scurs de la ultima rulare
    task.periodicTask = periodicTask;

    task.state = Waiting;

    if (taskDelay == 0)
    {
        task.state = Ready;
    }

    return (task);
} // initTask()

void scheduler()
{
   uint8_t indexTask;

   for(indexTask = 0; indexTask < TASK_COUNT; ++indexTask)
   {
       ++taskList[indexTask].elapsedTime;  /* incrementam cu un MinorCycle */

       if( (taskList[indexTask].state == Ready) && (taskList[indexTask].elapsedTime >= taskList[indexTask].taskPeriod) )
       {
           taskList[indexTask].state = Running;

           /* lansare task */

           taskList[indexTask].funct();

           /* am revenit din rularea task-ului */
           if (taskList[indexTask].periodicTask == false)
           {
               taskList[indexTask].state = Stop;
               /* Stergem task-ul */
           }
           else
           {
               taskList[indexTask].state = Ready;

               taskList[indexTask].elapsedTime = 0;
           }
       }
       else // Implementare delay Task
       {
           if( (taskList[indexTask].state == Waiting) && (taskList[indexTask].elapsedTime >= taskList[indexTask].taskDelay) )
           {
               taskList[indexTask].state = Ready;
               taskList[indexTask].taskDelay = 0;
               taskList[indexTask].elapsedTime = 0;
           }
       }
   }
} // scheduler()
Leave a Comment