Une tâche est un élément de contrôle indépendant défini par une fonction retournant void et sans arguments:
task void myTask() { ... }
Les tâches sont lancées en les préfixant par post:
post myTask();
Command
Ne doit pas être bloquante i.e. prend les paramètres, commence le traitement et retourne dans l'application;
Reporte le travail qui consomme du temps en postant une tâche
Peut appeler des commandes sur d'autres composants
Event
Peut appeler des commandes, signaler d'autres événements, poster des tâches mais ne peut pas être signalé par des commandes
Peut interrompre une tâche mais pas l'inverse.
Task
Ordonnancement FIFO
Non préemptive par une autre tâche, préemptive par un événement
Utilisée pour réaliser un travail qui nécessite beaucoup de calculs
Peut être postée par une "command" ou un "event".
L'instruction "atomic" guarantie que l'exécution de l'instruction se fait comme si aucun autre calcul ne se fait simultanément. Une instruction "atomic" doit être courte. nesC interdit dans une instruction atomique: call, signal, goto, return, break, continue, case, default, label
bool busy; // global
void f() {
bool available;
atomic {
available = !busy;
busy = TRUE;
}
if (available) do_something;
atomic busy = FALSE;
}