Engineering school, 3rd year
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

106 lines
3.6 KiB

/************************************************************************/
/* EX1.C : Multi-Fenêtrage avec seulement UNE tâche */
/************************************************************************/
/* Fonction : */
/* Création de fenêtres avec le système de Multi-Fenêtrage VIDEO */
/* et opérations d'affichage dans les fenêtres. */
/************************************************************************/
#include <basec.h>
#include <str.h>
#include <video.h>
#define T1 1 /*Outre la tâche main, il n'y a dans cette exercice que la tâche T1 qui a le numéro 1*/
/*Rappel : le numéro peut varier de 1 à 10. La valeur 0 est reservée à la tâche main*/
#define PT1 3 /*La priorité de la tâche T1 est PT1=3 (pourquoi pas?). La priorité peut varier de 1 à 10*/
/*La priorité la plus forte correspond à la valeur 10. La tâche main a la priorité 0*/
#define ESC 0x1b /*On revient au DOS en frappant sur la touche Escape*/
Word F0,F1,F2,F3,F4,F5;/*On utilise 6 fenêtres dans cet exercice*/
#include "tempo.c" /*Le fichier tempo.c est dans le répertoire courant et correspond à une boucle d'attente logicielle*/
/*La syntaxe d'appel est Tempo(Word Duree). La valeur de Duree correspond approximativement*/
/*à la durée de la boucle (en millisecondes) pour les PC utilisés en TP*/
/*--------------------------------------------------------------------------------------------------*/
Tache_Controleur(void)
{
/*Deux tâches dans cet exercice :
- la tâche main (incontournable)
- la tâche Tache_Controleur*/
Char Car;
EcrTexte(F5,"Tapez des chiffres entre 1 et 4 ; ESC pour sortir\r");
while (TRUE)
{
LireCar(F5, ON, &Car); /*Rappel : la fonction LireCar est suspensive*/
switch (Car)
{
case ESC : RetDos(); break; /*RetDos est une fonction du noyau*/
case '1' : Proc_1(); break; /*Les fonctions Proc_i sont extrémement simples (cf. ci-dessous)*/
case '2' : Proc_2(); break;
case '3' : Proc_3(); break;
case '4' : Proc_4(); break;
}
}
}
/*--------------------------------------------------------------------------------------------------*/
Proc_1(void)
{
EcrTexte(F1,"Proc_1 En Cours\n");
Tempo(2); /*Boucle d'attente logicielle*/
EffaceFen(F1);
}
Proc_2(void)
{
EcrTexte(F2,"Proc_2 En Cours\n");
Tempo(5);
EffaceFen(F2);
}
Proc_3(void)
{
EcrTexte(F3,"Proc_3 En Cours\n");
Tempo(10);
EffaceFen(F3);
}
Proc_4(void)
{
static Int Cpt=0;
EcrTexte(F4,"Proc_4 En Cours\r");
SelectFen(F4);
EcrVar("Cpt = %d\r", Cpt);
Cpt ++;
if(Cpt == 3)
{
Cpt = 0;
Tempo(10);
EffaceFen(F4);
}
}
/*--------------------------------------------------------------------------------------------------*/
void main(void)
{
InitVideo(); /*Appel obligatoire avant toute utilisation du module video*/
F0=OuvreFen( 0, 0,79,24, noir, blanc, "EXERCICE1");
F1=OuvreFen( 1, 6,39, 9, cyan, blanc, "Proc_1");
F2=OuvreFen(41, 6,78, 9, vert, blanc, "Proc_2");
F3=OuvreFen( 1,11,39,14, bleu, blanc, "Proc_3");
F4=OuvreFen(41,11,78,19, marron, blanc, "Proc_4");
F5=OuvreFen( 1, 1,78, 5, rouge, blanc, "Tâche_Contrôleur");
InitNoyau(); /*Obligatoire pour utiliser le module video*/
CreateTask(T1,PT1,Tache_Controleur); /*Créer la tâche numéro T1, avec la priorité T1, correspondant la fonction Tâche_controleur*/
/*La TCB (partiellement initialisée est créée)*/
StartTask(T1); /*La TCB est totalement initialisée : La tâche est prête*/
/*Le tableau TabPrio est mis à jour*/
/* while (TRUE); */
}