Réseaux de Capteurs Sans Fils
CoursOutils transverses

Notion de tâche et concurrence dans nesC

Tâche

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();

Commands vs. Events vs. Tasks

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".

Instruction "atomic"

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

Accès à une ressource critique avec "atomic"

bool busy; // global

void f() {

bool available;

atomic {

available = !busy;

busy = TRUE;

}

if (available) do_something;

atomic busy = FALSE;

}

Compiler et exécuter une application nesCConfigurations
Accueil Yacine CHALLAL creativecommons : by-ncRéalisé avec SCENARI