Estas llamadas son procesadas por el planificador de RT-Linux. En todas ellas se pasa como parámetro un identificador de tarea, que queda definido, previa inclusión en nuestro programa de linux/rt_sched.h, como:
typedef struct rt_task_struct RT_TASK;
Como vemos hay algo más que un puntero a la tarea: en realidad esta estructura guarda más información, tal como la prioridad o el estado. Sin embargo, no se recomienda tocar sus valores; en realidad pretende ser un tipo de datos abstracto, pero ya que el lenguaje C no permite este tipo de definiciones, el usuario es el responsable de no violar la encapsulación del tipo.
Toda tarea debe ser del tipo anterior, y para asociar una función a realizar con una variable de ese tipo, al tiempo que se registra la nueva tarea en el planificador, tenemos la siguiente función:
extern int rt_task_init(RT_TASK *tarea, void (*funcion)(int datos), int datos, int pila, int prioridad);
Esta función lleva como primer parámetro un identificador de tarea del tipo RT_TASK. La declaración de la variable tarea debe hacerse global, no automática, según hace notar J.R. Hester [3].
El segundo parámetro es la función que contiene el código de la tarea, función que, como indica la declaración, deberá llevar un parámetro de tipo entero (aunque no se use).
El tercer parámetro es el número entero que le pasamos a la función al ejecutarla, para seguir con el cuarto parámetro, tamaño de pila local (en bytes) y el quinto, la prioridad, que como indicamos antes, es máxima para el valor 1 y mínima para el valor RT_LOWEST_PRIORITY.
La función rt_task_init no inicia la ejecución de la tarea. Para ello hay que decirle al planificador su período, lo que se hace con la función:
extern int rt_task_make_periodic (RT_TASK *tarea, RTIME instante_inicio, RTIME periodo);
El primer parámetro que se le pasa es el identificador de la tarea elegida; el segundo es el instante (absoluto) de la primera activación y el tercero es el período.
Como indicamos antes, los tiempos se expresan en golpes de reloj (ticks). Para traducirlo a segundos contamos con la constante RT_TICKS_PER_SEC, que se define al incluir asm/rt_time.h en nuestro programa.
Cuando se ejecuta una tarea, que suele ser un bucle infinito (en cada iteración realiza por ejemplo un muestreo y una actuación) debe indicarse al planificador que hemos terminado un ciclo. Para ello la tarea puede llamar a la función:
extern int rt_task_wait(void);
Desde fuera es posible también parar la planificación de una tarea, mediante:
extern int rt_task_suspend(RT_TASK *task);
A esta función se le pasa como parámetro la tarea a detener.
Por último, podemos borrar del planificador cualquier tarea, liberando los recursos reservados, llamando con la tarea elegida como parámetro, a:
extern int rt_task_delete(RT_TASK *task);
Todas estas funciones retornan -1 si se ha producido un
error. Recordamos también que para acceder a las funciones y tipos
vistos es necesario incluir en nuestro programa el linux/rt_sched.h.
Además, antes de cargar un módulo con las tareas, hay que cargar el
módulo rt_prio_sched, con la orden: modprobe rt_prio_sched
.