Vous êtes sur la page 1sur 5

Badr RERHRHAYE

TP Examen

I. Objectif
On veut créer deux tâches sous le système d’exploitation embarqué PicOS18 en utilisant
l’environnement MPLAB.
Tâche0 : elle est synchronisée par le Timer de base du système ;
Tâche1 : elle se réveille suite à un événement envoyé par la Tâche0.
Le microcontrôleur utilisé est un PIC18F452. Les deux Tâche exploitent le port D du PIC.

II. Montage
On propose un montage organisé autour d’un PIC18F452. Deux boutons poussoir (BUTTON)
B1 et B2 sont connectés sur les pins RD0 et RD1 du port D ; ces boutons sont gérés par la
Tâche0. Deux LEDs sont brachées sur les pins RD6 et RD7 du port D. La LED D1 commute
chaque fois que la Tâche1 est en mode RUN. La LED D2 s’allume par appuie sur B1 et s’éteint
par appuie sur B2.
Badr RERHRHAYE

III. Travail demandé

1. Dans la Tâche0, les bits RD0 et RD1 doivent être configurés en entrée sans changer l’état
des autres bits du port D. Donner deux solutions pour réaliser cette configuration.
-Solution 1 :
TRISD= 0x03;
-Solution 2 :
TRISDbits.TRISD0 = 1;
TRISDbits.TRISD1 = 1;

2. Dans la Tâche1, les bits RD6 et RD7 doivent être configurés en sortie sans changer l’état
des autres bits du port D. Donner deux solutions pour réaliser cette configuration.
-Solution 1 :
TRISD= 0x03; // RD0 ET RD1 doivent être laissé en entrée pour maintenir le bon fonctionnement de la tache 0

-Solution 2 :
TRISDbits.TRISD6 = 0;
TRISDbits.TRISD7 = 0;

3. En utilisant la fonction SetRelAlarm, donner le code de la Tâche0 qui se réveille toute les
500ms.
TASK(TASK0)
{
TRISDbits.TRISD0 = 1;
TRISDbits.TRISD1 = 1;
TRISDbits.TRISD6 = 0;
TRISDbits.TRISD7 = 0;
SetRelAlarm(ALARM_TSK0,800,500);
while(1)
{
}
}//le premier fonctionnement de cette alarme sera après 800ms et sa période et 500ms
Badr RERHRHAYE

4. Compléter le programme de la Tâche0 pour que la LED D2 s’allume par appuie sur B1 et
s’éteint par appuie sur B2.

TASK(TASK0)
{
TRISDbits.TRISD0 = 1;
TRISDbits.TRISD1 = 1;
TRISDbits.TRISD6 = 0;
TRISDbits.TRISD7 = 0;
LATDbits.LATD6 =0;
LATDbits.LATD7 =0;
SetRelAlarm(ALARM_TSK0,800,500);
while(1)

{
WaitEvent(TASK0_EVENT);
ClearEvent(TASK0_EVENT);

if (PORTDbits.RD0 != 0 && PORTDbits.RD1 == 0)


{
LATDbits.LATD7 =1;
}
else
{
LATDbits.LATD7 =0;
}
}
}
Badr RERHRHAYE

5. Donner le programme de la Tâche1 qui attend un événement de la Tâche0 pour faire


commuter La LED D1.
TASK(TASK1)
{
TRISDbits.TRISD0 = 1;
TRISDbits.TRISD1 = 1;
TRISDbits.TRISD6 = 0;
TRISDbits.TRISD7 = 0;
LATDbits.LATD6 =0;
while(1)
{
WaitEvent(TASK1_EVENT);
ClearEvent(TASK1_EVENT);
LATDbits.LATD6 =1;
}
}
6. Que faut-il ajouter au programme de la Tâche0 pour envoyer un événement à la Tâche1.
Dans la boucle while de la tache 0 on ajoute les lignes en jaune :
while(1)
{
if (PORTDbits.RD0 != 0 && PORTDbits.RD1 == 0)
{
LATDbits.LATD7 =1;
SetEvent (TASK1_ID,TASK1_EVENT);
}
else
{
LATDbits.LATD7 =0;
LATDbits.LATD6 =0;
}
}
Badr RERHRHAYE

7. Sous MPLAB, placer des points d’arrêts (breakpoints) dans les tâches Tâche0 et Tâche1
pour montrer l’effet des priorités (Faire des captures d’écran si vous disposez de MPLAB,
sinon donnez des explications pour les deux cas de figures).

La possibilité de modifier la priorité de la tâche 0 et la tâche 1 se fait dans le fichier "define.h".


Si la tâche 1 est la plus prioritaire, on aura le fonctionnement souhaitable de l’application.En
fait, cela s’explique par le fait que la tâche 1 est plus prioritaire que la tâche 0, donc lorsqu’elle aura
posté un événement à la tâche 0, elle continuera à s'exécuter jusqu'à ce qu'elle soit mise en sommeil par
le WaitEvent. La tâche 1 à le champ libre pour pouvoir s'exécuter et le pointeur s'arrête sur le Breakpoint
du ClearEvent.
Toutefois, lorsqu’on inverse les priorités, le programme reste sur la tache 0 et ne passe jamais à
l’exécution de la tâche 1.

Vous aimerez peut-être aussi