You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
2.7 KiB
138 lines
2.7 KiB
/** @file task.h
|
|
@author M. P. Hayes, UCECE
|
|
@date 17 August 2011
|
|
@brief Simple task scheduler.
|
|
|
|
@defgroup task Simple task scheduler
|
|
|
|
This scheduler periodically calls functions specified in an array
|
|
of tasks to schedule. There is no pre-emption; a task can hog the CPU.
|
|
The tasks at the start of the array have a higher priority.
|
|
|
|
Each task must maintain its own state; either using static local
|
|
variables, file variables, or dynamically using the generic pointer
|
|
passed when the task is called.
|
|
|
|
Here's an example of two LED flashing tasks that run at 2 and 3 Hz.
|
|
|
|
@code
|
|
#include "task.h"
|
|
#include "led.h"
|
|
#include "system.h"
|
|
|
|
static void led1_task (void *data)
|
|
{
|
|
static uint8_t state = 0;
|
|
|
|
led_set (LED1, state);
|
|
state = !state;
|
|
}
|
|
|
|
|
|
static void led2_task (void *data)
|
|
{
|
|
static uint8_t state = 0;
|
|
|
|
led_set (LED2, state);
|
|
state = !state;
|
|
}
|
|
|
|
|
|
int main (void)
|
|
{
|
|
task_t tasks[] =
|
|
{
|
|
{.func = led1_task, .period = TASK_RATE / 2, .data = 0},
|
|
{.func = led2_task, .period = TASK_RATE / 3, .data = 0},
|
|
};
|
|
|
|
system_init ();
|
|
led_init ();
|
|
|
|
task_schedule (tasks, 2);
|
|
return 0;
|
|
}
|
|
@endcode
|
|
|
|
Here's another similar example. This time there are two instances
|
|
of the same task but with different state.
|
|
|
|
@code
|
|
#include "task.h"
|
|
#include "led.h"
|
|
#include "system.h"
|
|
|
|
typedef struct state_struct
|
|
{
|
|
uint8_t led;
|
|
uint8_t on;
|
|
} state_t;
|
|
|
|
|
|
static void led_task (void *data)
|
|
{
|
|
state_t *pstate = data;
|
|
|
|
led_set (pstate->led, pstate->on);
|
|
pstate->on = !pstate->on;
|
|
}
|
|
|
|
|
|
int main (void)
|
|
{
|
|
state_t led1 = {.led = LED1, .on = 0};
|
|
state_t led2 = {.led = LED2, .on = 0};
|
|
task_t tasks[] =
|
|
{
|
|
{.func = led_task, .period = TASK_RATE / 2, .data = &led1},
|
|
{.func = led_task, .period = TASK_RATE / 3, .data = &led2},
|
|
};
|
|
|
|
system_init ();
|
|
led_init ();
|
|
|
|
task_schedule (tasks, 2);
|
|
return 0;
|
|
}
|
|
@endcode
|
|
*/
|
|
|
|
#ifndef TASK_H
|
|
#define TASK_H
|
|
|
|
#include "system.h"
|
|
#include "timer.h"
|
|
|
|
|
|
#define TASK_RATE TIMER_RATE
|
|
|
|
|
|
/** Task function prototype. */
|
|
typedef void (* task_func_t)(void *data);
|
|
|
|
|
|
/** Task structure. */
|
|
typedef struct task_struct
|
|
{
|
|
/** Function to call. */
|
|
task_func_t func;
|
|
/** Generic pointer to pass to function. */
|
|
void *data;
|
|
/** How many ticks between scheduling events. */
|
|
timer_tick_t period;
|
|
/** When to reschedule. */
|
|
timer_tick_t reschedule;
|
|
} task_t;
|
|
|
|
|
|
/** Schedule tasks
|
|
@param tasks pointer to array of tasks (the highest priority
|
|
task comes first)
|
|
@param num_tasks number of tasks to schedule
|
|
@return this never returns.
|
|
*/
|
|
void task_schedule (task_t *tasks, uint8_t num_tasks);
|
|
|
|
#endif
|
|
|