Planificador de procesos de THOS
/*
* Main function: a welcome message and a simple scheduler
* Alessandro Rubini, 2009 GNU GPL2 or later
*/
#include <bathos/bathos.h>
#include <bathos/jiffies.h>
#include <arch/hw.h>
void __attribute__((noreturn)) bathos_main(void)
{
struct bathos_task *p;
unsigned long now;
printf("Hello, Bathos is speaking (built on %s)\n", __DATE__);
now = jiffies;
for (p = __task_begin; p < __task_end; p++)
p->release += now + 2;
while (1) {
struct bathos_task *t;
for (t = p = __task_begin; p < __task_end; p++)
if (p->release < t->release)
t = p;
while (time_before(jiffies, t->release))
;
t->arg = t->job(t->arg);
t->release += t->period;
}
}
A priori, resulta difícil enteder el código, ya que se han declarado numerosas macros y constantes previamente. Cuando se ejecuta este código (main.c) en THOS se conmutan pequeños procesos que muestran en pantalla distintas cadenas de texto. A continuación se encuentra el código de dichos procesos (task-uart.c):
/*
* A set of tasks that print timely messages to the serial port
* Alessandro Rubini, 2009 GNU GPL2 or later
*/
#include <bathos/bathos.h>
#include <arch/hw.h>
static void *uart_out(void *arg)
{
char *s = arg;
puts(s);
return arg;
}
static struct bathos_task __task t_quarter = {
.name = "quarter", .period = HZ/4,
.job = uart_out, .arg = "."
};
static struct bathos_task __task t_second = {
.name = "second", .period = HZ,
.job = uart_out, .arg = "S",
.release = 1,
};
static struct bathos_task __task t_10second = {
.name = "10second", .period = 10 * HZ,
.job = uart_out, .arg = "\n",
.release = 2,
};
static struct bathos_task __task t_minute = {
.name = "minute", .period = 60 * HZ,
.job = uart_out, .arg = "minute!\n",
.release = 3,
};
Como se puede observar el parámetro .arg es la cadena de texto a la que accede uart_out para posteriormete mostrársela al usuario.
De esta forma al ejecutarse el código de main.c se producirá lo siguiente:
Por cada cuarto de segundo que pase se mostrará en pantalla ".", cuando pase un segundo "S", cuando pasen 10 segundos veremos un salto de línea y cuando pase un minuto se mostrará "minute!" y se producirá un salto de línea.
Visto esto, podemos deducir que el planificador conmutará entre los distintos procesos en función del tiempo que haya pasado para el usuario.