Un mauvais programme
Considérez le programme suivant. Voici une tâche faisant décrire un carré au robot (comme nous l'avons fait si souvent avant) et la deuxième tâche s'occupe des capteurs tactiles. Lorsqu'un capteur est touché, le robot se déplace un peu vers l'arrière, et fait un virage à 90 degrés.
task check_sensors()
{
while (true)
{
if (SENSOR_1 == 1)
{
OnRev(OUT_AC, 75);
Wait(500);
OnFwd(OUT_A, 75);
Wait(850);
OnFwd(OUT_C, 75);
}
}
}
task submain()
{
while (true)
{
OnFwd(OUT_AC, 75); Wait(1000);
OnRev(OUT_C, 75); Wait(500);
}
}
task main()
{
SetSensor(IN_1,SENSOR_TOUCH);
Precedes(check_sensors, submain);
}
Ce programme vous semble probablement tout à fait valable. Mais si vous l'exécutez, vous verrez un comportement imprévu. Essayez ce qui suit: faite touche quelque chose au robot pendant qu'il tourne. Il va commencer revenir en arrière, mais se déplace immédiatement vers l'avant à nouveau, atteignant l'obstacle. La raison vient du fait que les tâches peuvent interférer entre elles. Voici ce qu'il se passe. Le robot tourne à droite, voulu par la première tâche, la deuxième tâche est en sommeil. Maintenant, le robot rencontre un obstacle. Il va commencer à reculer, mais à ce moment-là, la tâche principale se réveille et déplace le robot vers l'avant à nouveau : dans l'obstacle. La deuxième tâche esgt en sommeil à ce moment et ne detecte pas la collision. Ce n'est clairement pas le comportement que nous aimerions voir. Le problème est que, tandis que la seconde tâche est en sommeil nous n'avions pas réalisé que la première tâche était encore en marche, et que ses actions interféraient avec les actions de la deuxième tâche.
Dostları ilə paylaş: |