Vous êtes sur la page 1sur 52

MTR86 Win32 V2.

Manuel de rfrence rvision 2.1a


Site de mise jour http://mtr86x.free.fr
Support : winmtr86@gmail.com

Mtr86 Win32 rvision 2.1

Page -II-

TABLE DES MATIERES


1. INTRODUCTION..............................................................................................1
1.1. Prsentation de Mtr86 Win32 ........................................................................... 1
1.2. Installation de Mtr86 Win32 .............................................................................. 1
Installation sur poste individuel partir des disquettes (ou CD) dinstallation............... 1
Installation partir dun rseau .................................................................................... 1

1.3. Accs et installation des ports E/S sous Windows NT et 2000 ........................ 3
Etat dun pilote de port E/S pour NT .............................................................. 3
Etat dun pilote de port E/S pour 2000 ........................................................... 3
Installation dun pilote pour port E/S .............................................................. 3
1.4. Taille des piles des tches................................................................................ 4
1.5. Utilisation des bibliothques standard C et C++............................................... 4
1.6. Utilisation de la bibliothque E/S console conio ............................................... 4
1.7. Gestion des priorits avec Mtr86 ...................................................................... 4
1.8. Rsolution de l'horloge ..................................................................................... 6
1.8. Rsolution de l'horloge ..................................................................................... 7
2. DIAGRAMME D'ETAT DE MTR86 ................................................................... 7

3. COMPILATION DES PROGRAMMES .............................................................8


IMPORTANT ................................................................................................................... 8
Configuration des compilateurs ....................................................................................... 9
VisualC++ V4X..V6X ...................................................................................................... 9
C++ Builder ................................................................................................................... 10

4. LISTES DES REQUETES PAR CATEGORIE................................................11


5. PRIMITIVES DE MTR86 ................................................................................13
5.1. Formalisme utilis .......................................................................................... 13
Nom de la requte ....................................................................................... 13
5.2. Requtes du noyau ....................................................................................... 13
start, startEx................................................................................................. 13
mtr86exit ...................................................................................................... 14
cree .............................................................................................................. 14
active............................................................................................................ 14
tache_priorite ............................................................................................... 15
classe_priorite.............................................................................................. 15
priorite_processus........................................................................................ 15
d_tic ............................................................................................................. 15
cvrtic............................................................................................................. 15
dort............................................................................................................... 16
suspend ....................................................................................................... 16
reveille.......................................................................................................... 16
detruit ........................................................................................................... 17
supprime ...................................................................................................... 17
tache_c ........................................................................................................ 17
tache_id ....................................................................................................... 17
thread_id ...................................................................................................... 17
num_tache ................................................................................................... 17
m_wait, MONITOR....................................................................................... 18
m_signal, ENDM .......................................................................................... 18
verrouille ...................................................................................................... 18
Table des matires

Mtr86 Win32 rvision 2.1

Page -III-

deverrouille .................................................................................................. 18
m_send ........................................................................................................ 19
5.3. Gestionnaire de tches rythmes................................................................... 19
t_cree ........................................................................................................... 19
t_start ........................................................................................................... 20
t_stop ........................................................................................................... 20
5.4. Gestion des vnements................................................................................ 20
e_cree .......................................................................................................... 20
e_close......................................................................................................... 20
e_wait........................................................................................................... 21
e_signal........................................................................................................ 21
5.5. Gestionnaire de rendez-vous ......................................................................... 22
rv_cree ......................................................................................................... 22
rv_close........................................................................................................ 22
rv_signal....................................................................................................... 23
rv_init ........................................................................................................... 23
5.6. Gestionnaire de tubes .................................................................................... 23
p_open ......................................................................................................... 23
p_close......................................................................................................... 24
p_write ......................................................................................................... 24
p_read.......................................................................................................... 24
p_plein ......................................................................................................... 25
p_vide .......................................................................................................... 25
p_openEx..................................................................................................... 25
p_closeEx .................................................................................................... 25
p_writeEx ..................................................................................................... 26
p_readEx...................................................................................................... 26
p_pleinEx ..................................................................................................... 26
p_videEx ...................................................................................................... 26
5.7. Gestionnaire de ressources ........................................................................... 27
r_cree........................................................................................................... 27
r_close ......................................................................................................... 27
r_wait ........................................................................................................... 27
r_signal ........................................................................................................ 27
5.8. Gestionnaire de smaphores ......................................................................... 28
s_cree, s_creeEx, s_openEx ....................................................................... 28
s_close......................................................................................................... 28
s_wait........................................................................................................... 28
s_signal........................................................................................................ 29
5.9. Requtes diverses.......................................................................................... 29
fct_disable.................................................................................................... 29
fct_enable .................................................................................................... 29
5.10. Accs aux ports E/S sous Windows NT....................................................... 30
OpenPort...................................................................................................... 30
InPortb, InPortw, InPortdw ........................................................................... 30
OutPortb, OutPortw, OutPortdw................................................................... 30
ClosePort ..................................................................................................... 30
6. EXEMPLES FOURNIS................................................................................... 31

6. MTR86 OBJET ................................................................................................32


6.1. Prsentation de Mtr86 Win32 noyau objet...................................................... 32
Table des matires

Mtr86 Win32 rvision 2.1

Page -IV-

6.2. Installation et configuration de Mtr86 Win32 Objet ......................................... 32


6.3. Constitution de Mtr86 Win32 Objet................................................................. 32
6.4. Description des classes .................................................................................. 33
Constantes................................................................................................... 33
6.5. Constructeurs de copie et constructeurs par dfaut ....................................... 33
Classe Tache ............................................................................................... 34
Classe TacheRythmee................................................................................. 36
Classe Monitor ............................................................................................. 37
Classe Mutex ............................................................................................... 37
Classe Semaphore ...................................................................................... 37
Classe RendezVous..................................................................................... 38
Classe Evenement ....................................................................................... 39
Classe Pipe.................................................................................................. 39
Classe PipeEx.............................................................................................. 40
Classe Port (N, 2000, XP)............................................................................ 40
6.4. Ecriture des applications................................................................................. 40
Compilation................................................................................................................ 40
Comment crire une application ?.............................................................................. 41

6.4. Taille des objets.............................................................................................. 45


6.5. Diagrammes de classes des exemples .......................................................... 45

Table des matires

Mtr86 Win32 rvision 2.1

Page -1-

1. INTRODUCTION
1.1. Prsentation de Mtr86 Win32
Mtr86Win32 est compos de DLL Mtr86WX.dll et de librairies dimportation Mtr86WX.lib avec X = M
(Visual C++) et B (Borland).
Pour les cibles utilisant Windows NT, il est galement ncessaire d'installer des pilotes en mode noyau.
Mtr86Win32 permet dcrire des programmes multitches temps rels aussi bien en mode console quen
mode graphique de faon indpendante du compilateur utilis pour le dveloppement. Larchitecture dun
programme en mode console utilisant Mtr86Win32 est la mme que celle de Mtr86 pour MsDos. Par
rapport cette dernire version, Mtr86Win32 prsente lavantage de grer de faon transparente les
problmes de rentrances des Bibliothques C et C++, facilitant ainsi llaboration de code fiable.

1.2. Installation de Mtr86 Win32


Pour Windows NT/2000 se loger en superviseur. Par la suite les applications peuvent fonctionner en
mode utilisateur.

Installation sur poste individuel partir des disquettes (ou CD) dinstallation
Insrer la disquette ou le CD dans le lecteur et lancer install. Pour la version licence site, fournir la cl
daccs. Attention : la simple copie des rpertoires ne permet pas de faire fonctionner une application
Mtr86Win32 du fait de linstallation de pilotes en mode noyau. Prciser lors de linstallation loutil de
dveloppement (Visual C++ ou Borland C++), le noyau tant diffrent pour chacun de ces compilateurs.

Installation partir dun rseau


Insrer la disquette ou le CD dans le lecteur et lancer install. Pour la version licence site, fournir la cl
daccs. Prciser comme destination un rpertoire dinstallation sur un disque rseau (le chemin
dinstallation doit obligatoirement possder une lettre de volume : exemples X:\MTR86W32, H:\UNREP).
Attention assurez-vous davoir les droits dcriture dans ce rpertoire.
Une fois linstallation effectue, un utilisateur peut relancer le programme dinstallation install
situ sur le rseau depuis un poste (il suffit davoir les droits en lecture sur le rpertoire rseau).
Linstallation est alors automatique, il suffit de prciser le type de compilateur utiliser.
Linstallation rseau conserve les librairies et les exemples sur le rseau, mais Il est possible de copier en
local tout le rpertoire dinstallation si on le souhaite.
Nota : une fois le logiciel install, en cas de changement de compilateur, il suffit de lier lapplication avec
la bonne librairie Mtr86WX.lib (voir les exemples). Aprs avoir install le logiciel, il est indispensable de
rinitialiser la machine pour assurer le chargement des pilotes en mode noyau.

Rpertoires installs
Rpertoire des exemples non objets
Rpertoire des exemples objets
Noyaux, pilotes E/S, fichiers denttes, librairies non objets
Noyaux objets, fichiers denttes

Rpertoire des exemples non objets


Projets et excutables des diffrents exemples pour BC51
Projets intgrant lensemble des exemples pour Builder
Projets individuels des exemples pour Builder

Ensemble du code source des exemples pour BC51, VC4 et VC6


Binaire des exemples VC4 et VC6
Projets intgrant lensemble des exemples pour VC4
Projets individuels et projet intgrant lensemble des exemples pour VC6

Introduction

Mtr86 Win32 rvision 2.1

Page -2-

Rpertoire des exemples objet


Rpertoire des sources, projets et excutables pour BC5.1

Projet intgrant lensemble des exemples pour Builder


Binaire de lensemble des exemples pour Builder
Projet individuel pour Builder et source de exemple E11 pour VC++ et Builder

Projet intgrant lensemble des exemples et projets individuels pour VC6


Binaire de lensemble des exemples pour VC6

Rpertoire du noyau. Contient le fichier dentte Mtr86w32.H


DLL (copie dans le rpertoire Windows) et lib pour BC5.1 et Builder
Pilote en mode noyau
Pilote pour les ports E/S pour NT et 2000
Contient conio.h et la Dll (copie dans le rpertoire Windows) pour VC4 et VC6
Contient la librairie dimportation et la librairie statique conio pour VC6
Contient les fichiers dentte et les programmes objet
Contient la DLL (copie dans le rpertoire Windows) et sa lib pour BC5.1
Contient la DLL (copie dans le rpertoire Windows) et sa lib pour Builder
Contient la DLL (copie dans le rpertoire Windows) et sa lib pour VC6
Contient galement la librairie statique Conio pour VC6
Contient lensemble des DLL (copis dans le rpertoire Windows)

Rpertoires laisss sur le CD


La

racine du rpertoire contient :


un support de cours et le corrig des exercices en format pdf.
Les fichiers dentte des exemples
Un projet VC6 incorporant lensemble des exemples.

Chaque sous rpertoire contient :

Le code source de lexemple correspondant

Un projet individuel pour lexemple

Lexcutable de lexemple plac dans un rpertoire bin

Introduction

Mtr86 Win32 rvision 2.1

Page -3-

1.3. Accs et installation des ports E/S sous Windows NT et 2000


Laccs aux ports E/S ncessite linstallation
dun pilote de priphrique. Mtr86 est livr
avec
cinq
pilotes
de
ports
E/S :
port1.sys..port5.sys.

Etat dun pilote de port E/S pour NT


Aprs avoir install un port (voir plus loin) et
aprs avoir redmarr assurez-vous quil est
dmarr. Pour ce faire, aller dans le panneau
de configuration pilote de priphrique et
rechercher le pilote portX.sys. Ce pilote doit
tre marqu Dmarr. Si ce nest pas le cas
ou si le pilote nest pas list, cest quil na
pas t trouv (il a t probablement effac
du rpertoire WinNt\System32\Drivers).

Etat dun pilote de port E/S pour 2000


Aprs avoir install un port (voir plus loin) et
aprs avoir redmarr (deux fois) assurezvous quil est dmarr. Pour ce faire, aller
dans le panneau de configuration System/
Gestonnaire de priphrique. Dans affichage
valider afficher les priphriques cachs et
rechercher le pilote portX. Ce pilote doit tre
marqu Dmarr. Si ce nest pas le cas ou si
le pilote nest pas list, cest quil na pas t
trouv (il a t probablement effac du
rpertoire WinNt\System32\Drivers).

Installation dun pilote pour port E/S


Pour installer un pilote, se loger en superviseur. Copier le pilote portx.sys prsent dans le rpertoire
dinstallation de Mtr86W32, Noyau\PortDrivers dans le rpertoire WinNt\System32\Drivers (inutile pour le
premier port install), par dfaut le programme dinstallation a dj copi le fichier port1.sys dans
WinNt\System32\Drivers. Si la copie choue, cest que le pilote est en cours dutilisation. Arrter le pilote
laide du panneau de configuration priphriques ou laide de la commande : net stop portx.sys
exemple : net stop port1.sys
Une fois le pilote copi, diter un fichier portx.ini situ dans le mme rpertoire dinstallation :
\Registry\Machine\System\CurrentControlSet\Services\Port1
Type = REG_DWORD 0x00000001
Start = REG_DWORD 0x00000002
Group = Extended Base
ErrorControl = REG_DWORD 0x00000001
Parameters
IoPortAddress = REG_DWORD 0x00000300
// ajuster ladresse dsire
IoPortCount = REG_DWORD 0x0000000030
// la plage dsire

1. Modifier la ligne 1 pour que le nom du port soit conforme au nom du fichier portx.sys copi dans
WinNt\System32\Drivers,
2. Modifier IoPortAddress et IoPortCount en fonction de vos besoins puis enregistrer le fichier sous le
nom de portX.ini avec X = 1 | 2 ... | 5.
3. Inscrire le pilote dans la base de registre. Pour ce faire ouvrir une fentre console, changer de
rpertoire pour se placer dans le rpertoire dinstallation de Mtr86Win32 Noyau\PortDrv puis inscrire
le pilote dans le registre laide de la commande Regini.exe :
regini portX.ini. Windows NT chargera automatiquement ce pilote au prochain redmarrage .
Il est possible de modifier ladresse de base et la plage E/S dun port une fois le pilote install en ditant
la cl HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Port1\Parameters dans la
base de registre. Cette adresse est prise en compte de faon dynamique condition de relancer
lapplication utilisant le pilote. Attention il faut avoir les droits administrateur.
Si un pilote de port ne dmarre pas linitialisation du systme (voir le journal dvnement laide de
lobservateur dvnements) cest quil y est en conflit dadresse avec un priphrique utilisant dj cette
Introduction

Mtr86 Win32 rvision 2.1

Page -4-

E/S ou avec un pilote de port E/S dj install. Il nest pas possible dattaquer un mme port E/S
simultanment laide de deux pilotes diffrents : le pilote de port est conu de telle sorte quil nautorise
pas le recouvrement dadresses.
Recommandations pour lutilisation des ports E/S sous Windows NT.
Laccs des adresses systme des ports E/S peut mettre en pril le systme dexploitation. Pour cette
raison laccs au port seffectue laide dune adresse relative par rapport ladresse de base. Tout
accs en dehors de la plage prvue est intercepte et provoque une violation daccs ne mettant pas en
danger le systme dexploitation. Pour fiabiliser vos programmes nous vous recommandons de limiter
strictement la plage E./S des ports.
Utilisation des ports E/S sous Windows 9X.
Ce systme dexploitation autorisant laccs aux ports E/S, on utilise les fonctions habituelles daccs aux
ports fournis par la librairie de votre compilateur (inp, outp pour VC, inportb, outportb pour Borland).

1.4. Taille des piles des tches


Pour un processus, une pile de 1Mo est alloue pour lensemble des tches du processus. Un
dbordement de cette pile provoque une exception, et ralloue de la mmoire sans arrter lapplication.
Un dbordement de pile lintrieur dune tche provoque un fonctionnement erron de la tche. La taille
de la pile est arrondie au multiple de 4K immdiatement suprieur. La taille minimale dune pile pour une
tche est donc de 4Ko. Une valeur 0 passe en paramtre comme valeur de taille de pile, fournit une
taille de pile identique la tche parente.

1.5. Utilisation des bibliothques standard C et C++


Les bibliothques C fournies avec les compilateurs, comportent deux types de modles : les modles
single threaded et multithread. Mtr86 est conu pour utiliser les bibliothques DLL multithread. Ces
bibliothques comportent un code dinitialisation permettant de verrouiller les sections critiques (malloc,
printf, ...). Ces mcanismes sont utiliss par Mtr86 de faon transparente pour lapplication, cest dire
que lapplication utilise sans risque les fonctions non rentrantes des sections de code verrouilles.
Malheureusement le code dinitialisation du verrouillage nest pas standard, ce qui ncessite dutiliser une
interface de noyau Mtr86WX.dll dpendante du compilateur. Mtr86W32 est fourni avec deux interfaces de
noyau : Mtr86WM.dll pour le compilateur Visual C++ de Microsoft, Mtr86WB.dll pour le compilateur
Borland C++ 5.x et pour le compilateur Inprise C++ Builder. Linstallation copie toutes les DLL dans le
rpertoire systme.

1.6. Utilisation de la bibliothque E/S console conio


Mtr86 est fourni avec une bibliothque Crt.lib mulant les E/S de la bibliothque conio Borland ( getch(),
cputs(), clrscr(), gotoxy()...). Cette bibliothque permet dcrire des applications en mode console en
utilisant le compilateur de Microsoft et effectuant des appels conio de type Borland. Cette bibliothque ne
doit pas tre utilise avec les compilateurs Borland. Celle-ci a t porte par Borland sous Win32.
Sous Windows 9X les E/S console sont bloquantes (exemple : getch() effectue de lattente active) . Ces
E/S bloquent les tches de priorit infrieure. Sous Windows NT les E/S bloquantes suspendent la
tche et rcuprent ainsi le temps CPU pour les tches moins prioritaires ( pas de bloquage ). Voir les
exemples fournis.

1.7. Gestion des priorits avec Mtr86


Le mcanisme de gestion des priorits est sensiblement diffrent de celui de Mtr86 Dos. Chaque
processus a une classe de priorit au sein de laquelle les tches peuvent avoir 7 niveaux de priorits dont
5 sont relatives la valeur PRIORITE_NORMALE ( +2, +1, 0, -1, -2) et deux niveaux de priorit absolu :
PRIORITE_MAXIMALE et _MINIMALE.
Le niveau de priorit PRIORITE_NORMALE est particulier en ce sens que lorsque le processus est en
avant plan, ce niveau de priorit est dop de faon dynamique de +1 +2. Si on dsire une stricte
gestion des niveaux de priorit, ne pas utiliser le niveau PRIORITE_NORMALE, utiliser des niveaux
PRIORITE_NORMALE 1,2
Les classes de priorits des processus sont rparties en deux catgories : une catgorie de priorit fixe :
la classe CLASSE_TEMPS_REEL et une catgorie dans laquelle les tches de ces processus se voient
attribuer une priorit variant de faon dynamique autour de la valeur initiale de la priorit de la tche : les
classes CLASSE_PRIORITE_HAUTE, CLASSE_PRIORITE_NORMALE, CLASSE_PRIORITE_BASSE.
PRIORITE

Introduction

Mtr86 Win32 rvision 2.1

Page -5-

La classe temps rel possde une priorit suprieure au systme dexploitation. Cette classe ne doit tre
utilise que pour des tches trs courtes trs forte contrainte de temps. Un processus de classe temps
rel comportant une tche effectuant de lattente active bloque tout le systme exploitation (y compris la
souris et le clavier).
Pour permettre dapprhender ces mcanismes de priorits Mtr86Win32 est fourni avec un exemple priorit
permettant de modifier de faon dynamique la priorit du processus et des tches. Une case cocher (suspendre)
permet de simuler une attente active.
Lutilisation de ce programme ne prsente pas de risque de blocage dans le cas o on choisit deffectuer de lattente
active avec un processus de classe temps rel : une tche priorit maximale annule automatiquement lattente
active au bout de 5 secondes (indicateur tches arrtes). Ltude de ce programme permet de bien situer lutilisation
de Mtr86 dans un environnement Windows GUI.

Introduction

Mtr86 Win32 rvision 2.1

Modifie la priorit du processus courant

Indicateur : tches arrtes

Attente active Off


dincrmentation du
suspension (dort).

Page -6-

/ On : Off la boucle
compteur comporte une

Bouton de relance des tches

Modifie la priorit de la tche T1

Rgle la dure de suspension (dort) des taches T1..T5

Utilisation du programme
TP1
Appuyer sur Pause ( les compteurs ne sincrmentent plus ), puis sur RAZ

Modifier la priorit des tches ( bouton .


)
Observation : les taches incrmentent les compteurs du fait que chaque tche se suspend intervalle de
temps rgulier.
TP2
Appuyer sur Pause ( les compteurs ne sincrmentent plus ), puis sur RAZ
Dcocher la case T1 (M ne jamais dcocher plus de deux cases), modifier la priorit de la tche
correspondante +2 , modifier la priorit de la tche T2 -2. Appuyer sur Pause puis au bout de quelques
secondes nouveau sur Pause.
Observation : les taches de priorit infrieure la tche faisant de lattente active ont fini par sexcuter via le
mcanisme de vieillissement des tches.
TP3
Appuyer sur Pause ( les compteurs ne sincrmentent plus ), puis sur RAZ
Dplacer la boite de dialogue au milieu de lcran et lancer un nouveau processus laide du bouton.
Modifier la priorit du premier processus ( classe de priorit haute )
Appuyer sur Pause
Observation : le processus cre est bloqu par un processus de priorit suprieure faisant de lattente active .

TP4
Cochez / dcocher la case T1. Observation : le processus cre sexcute / sarrte.
Fermer une application.
Assurer vous que lapplication restante est en mode pause ( les compteurs de sincrmentent pas).
Modifier la priorit processus en classe temps rel.
Dcocher la case T1, modifier la priorit de la tche correspondante priorit maximale , modifier la priorit de

la tche T2 1, T3 2, T4 normale, T5 +1.


Appuyer sur Pause. Lapplication prmpte le systme dexploitation ( la souris est bloque ) puis au bout de 5
secondes lapplication revient en pause.
Observation : les taches de priorit normale et suprieure ont fini par sexcuter via le mcanisme de
vieillissement des tches. Les tches de priorit infrieure normale ne se sont jamais excutes.

Introduction

Mtr86 Win32 rvision 2.1

Page -7-

1.8. Rsolution de l'horloge


La rsolution de l'horloge a une influence directe sur la prcision de toutes les temporisations.. Par dfaut
l'horloge possde une rsolution de 10 millisecondes. Celle-ci peut tre ajuste l'aide de la primitive
d_tic. Exemple :
d_tic(10);// rsolution 10ms
...
dort(1); // tempo de 10 ms
...
dort(3); // tempo de 10 ms
...
dort(5); // tempo de 10 ms

d_tic(3); // rsolution 3 ms
...
dort(1); // tempo de 3 ms
...
dort(3); // tempo de 3 ms
...
dort(5); // tempo de 6 ms

d_tic(1); // rsolution 1 ms
...
dort(1); // tempo de 1 ms
...
dort(3); // tempo de 3 ms
...
dort(5); // tempo de 5 ms

Les rsolutions infrieures 10 ms surchargent le processeur sur les configurations peu puissantes.
La primitive d_tic semble poser problme pour le processeur Pentium IV

2. DIAGRAMME D'ETAT DE MTR86

Les transitions notes sur le diagramme correspondent des primitives Mtr86. Ce diagramme est celui
d'une application comportant plusieurs tches au mme niveau de priorit. Dans une application
comportant une tche par priorit, l'tat virtuel EXEC n'existe pas.

Introduction

Mtr86 Win32 rvision 2.1

Page -8-

3. COMPILATION DES PROGRAMMES


La structure d'un fichier programme Mtr86 Win32 en mode console est la suivante:
#include
<windows.h>
#include
<winNT.h>
#include
<stdio.h>
#include
<stddef.h>
#include
<time.h>
#ifdef __TURBOC__
#include
<conio.h>
// Si utilisation de conio
#define
_init_video()
#else
#include
"conio.h"
// Si utilisation de conio
#pragma comment(linker, "/nodefaultlib:LIBCMT")
#endif
#include
"mtr86w32.h"
/* Dclaration des variables globales

*/

/* Dclaration des prototypes des tches

*/

/* Tche d'initialisation
*/
TACHE init( void )
{
/* crer les tches */
/* crer les smaphores, ressources, tubes ... s'il y a lieu */
/* lancer les tches*/
}
/* Autres tches */
main()
{
int code;
_init_video();
/* Si utilisation sous VC++ de la librairie conio */
code = start(init, 4096);
/* lancement de l'application,
*/
/* avec 4Ko octets de pile pour init()
*/
.........
/* section effectue la fin du programme.*/
exit(code);
/* retour au systme
*/
}
IMPORTANT
Le programme doit tre reli aux librairies dimportation suivantes :
1. Mtr86WX.lib spcifique au compilateur utilis. Cette librairie est situe dans le rpertoire :
pour Borland (BC5X et Builder)
<rpertoire dinstallation>\Noyau\Borland
pour Microsoft VC++4
<rpertoire dinstallation>\Noyau\VisualC\Vc6
pour Microsoft VC++6
<rpertoire dinstallation>\Noyau\VisualC\Vc4
2. Pour les programme effectuant les E/S conio avec un compilateur VisualC++, une librairie conio
compatible avec la librairie Borland est fourni : crt.lib, Le programme dinstallation copie cette
librairie dans :
<rpertoire dinstallation>\Noyau .
3. Aux librairies runtime C ou C++ multithread dynamique (DLL) (voir configuration des
compilateurs).
Mtr86Win32 est fourni avec des exemples de programmes en mode console et en mode GUI. Selon le
compilateur utilis, charger les exemples partir des fichiers de projet situs dans Exemples\Borland,
Exemples\Builder, Exemples\VisualC\Vc4, Exemples\VisualC\Vc6.

Introduction

Mtr86 Win32 rvision 2.1

Page -9-

Configuration des compilateurs


Borland 5.x

Dynamique
GUI ou Console
Multithread

Se relier Mtr86WB.lib
spcifique au compilateur
VisualC++ V4X..V6X
Choisir une librairie
multithread parmi
les suivantes.
(obligatoirement des
DLL)

Se relier Crt.lib (si vous utilisez les E/S


console compatible Borland)
Se relier toujours Mtr86WM.lib
Ces librairies sont situes dans :
<rpertoire dinstallation>\Noyau\VisualC

Introduction

Mtr86 Win32 rvision 2.1

Page -10-

C++ Builder

Se relier toujours Mtr86WB.lib


Ces librairies sont situes dans :
<rpertoire dinstallation>\Noyau\Borland

Dans Options du projet /


Lieur, cocher Utiliser la
RTL Dynamique.

Introduction

Mtr86 Win32 rvision 2.1

Page -11-

4. LISTES DES REQUETES PAR CATEGORIE


Requtes du noyau classes par ordre alphabtique (# nouvelle requte, ! requte supprime)
active
: lire une tche.
cree
: crer une tche.
d_tic
: dfinir la rsolution de l'horloge.
detruit ( !)
: dtruire une tche ( non implment dans la version Win32).
supprime
: supprimer une tche.
dort
: suspendre une tche.
fc_enable
: active CTRL BREAK et CTRL C (mode console).
fc_disable
: inhibe CTRL BREAK et CTRL C (mode console).
m_signal
: dfinir la fin d'une section de code verrouille.
m_wait
: dfinir une section de code verrouille.
mtr86exit
: sortir du systme.
num_tache
: obtenir le handle d'une tche.
tache_id (#)
: obtenir le numro dune courante.
tache_priorite (#)
: modifie la priorit dune tche.
classe_priorite (#)
: modifie la priorit dun processus.
priorite_processus (#): obtient la priorit dun processus.
tache_c
: obtenir le handle de la tche courante.
reveille
: rveiller une tche.
start
: lancer le systme.
startEx (#)
: lancer le systme.
suspend
: suspend une tche.
thread_id (#)
: fourni le handle dune tche partir de son numro.
verrouille (#)
: verrouille une section critique.
deverrouille (#)
: deverrouille une section critique.
Gestionnaire de messages
m_send
: lire une tche en lui envoyant un message.
Gestionnaire de tches rythmes
t_cree
: crer une tche rythme.
t_start
: lancer une tche rythme.
t_stop
: arrter une tche rythme.
Gestionnaire d'vnements
e_cree
: crer un groupe d'vnements.
e_close
: supprimer un groupe d'vnements.
e_wait
: attendre un groupe d'vnements.
e_signal
: signaler un vnement au groupe d'vnements.
Gestionnaire de rendez-vous
rv_cree
: crer une variable rendez-vous.
rv_init
: initialiser une variable rendez-vous.
rv_close
: supprimer une variable de rendez-vous.
rv_signal
: se rendre au rendez-vous.
Gestionnaire de tubes
p_open
:
p_close
:
p_write
:
p_read
:
p_plein
:
p_vide
:
p_openEx (#)
:
p_closeEx (#)
:
p_writeEx (#)
:
p_readEx (#)
:
p_pleinEx (#)
:
p_videEx (#)
:

crer une zone de communication inter-tches ( tube ).


dtruire un tube.
crire dans un tube.
lire dans un tube.
obtenir la quantit de places restant dans le tube.
obtenir la quantit de places occupes dans le tube.
crer une zone de communication inter-processus ( tube IPC).
dtruire le tube IPC.
crire dans un tube IPC.
lire dans un tube IPC.
obtenir la quantit de places restant dans le tube IPC.
obtenir la quantit de places occupes dans le tube IPC.
Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -12-

Gestionnaire de ressources
r_cree
: crer une variable ressource.
r_close
: supprimer une variable ressource.
r_wait
: rserver une ressource.
r_signal
: signaler la libration d'une ressource.
Gestionnaire de smaphores
s_cree
: crer un smaphore.
s_creeEx (#)
: crer un smaphore utilisable entre plusieurs processus.
s_openEx (#)
: ouvre un smaphore dj cre.
s_close
: supprimer un smaphore.
s_wait
: P(s).
s_signal
: V(s).
Accs aux ports E/S Windows NT
OpenPort (#)
: Ouvrir un port E/S
InPortb (#)
: Lire un octet sur le port spcifi
InPortw (#)
: Lire un mot de 16 bits sur le port spcifi
InPortdw (#)
: Lire un mot de 32 bits sur le port spcifi
OutPortb (#)
: Ecrire un octet sur le port spcifi
OutPortw (#)
: Ecrire un mot de 16 bits sur le port spcifi
OutPortdw (#)
: Ecrire un mot de 32 bits sur le port spcifi
ClosePort (#)
: Fermer un port E/S

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -13-

5. PRIMITIVES DE MTR86
5.1. Formalisme utilis

Nom de la requte
ACTION

Description des actions associes la requte.

SYNTAXE

Prototype 'C'

PARAMETRES

Description des paramtres passs.

VAL. RETOURNE

Description de la valeur retourne.

ERREUR FATALE

M Conditions pouvant provoquer l'arrt de l'application.

DESCRIPTION

Description de la requte.

VOIR AUSSI

Fonctions apparentes.

EXEMPLE 'C'

Exemples d'appels, rfrence des exemples.

5.2. Requtes du noyau

start, startEx
ACTION

Lance le noyau et active la tche d'initialisation.

SYNTAXE

int start (TACHE_ADR tache_adr, int taille_pile );


int startEx(TACHE_ADR tache_adr, int taille_pile, DWORD dwPriorite);

PARAMETRES

VAL. RETOURNE

Entier code d'erreur :


94; erreur fatale dtecte par le noyau
89..0; valeur passe par l'application en paramtre mtr86exit.

ERREUR FATALE

Mtr86 non install, version de mtr86 non conforme.

DESCRIPTION

Cette appel cre la tche la tche d'init en lui allouant:


une pile, un numro (le numro 1), la priorit maximale (CLASSE_PRIORITE_TEMPS_REEL).
Puis lance le systme et active la tche d'initialisation. La tche d'initialisation est
charge de crer les tches et les objets (smaphores, ressources, tubes ...) utiliss par
l'application. Les tches rythmes possdent la mme priorit que la tche d'initialisation.
Il est donc prfrable, si l'application utilise ce type de tches, de n'effectuer la cration
et leur lancement qu'en fin d'initialisation.
A la fin du programme, le retour se fait aprs start.

VOIR AUSSI

mtr86exit, mtr86fatal.

EXEMPLE C

#include "mtr86w32.h"
TACHE t( void )
{
...
}
TACHE init()
{
int i;
for (i=0; i < 20; i++)
active(cree( t, PRIORITE_NORMALE, 10000));
}
int main()
{
exit(start( init, 8192 ));/* active le noyau
*/
}

Adresse de premire tche lancer (nom de la tche),


Taille de la pile (minimum 4096).
Classe de priorit du processus pour startEx :
CLASSE_PRIORITE_TEMPS_REEL, CLASSE_PRIORITE_HAUTE
CLASSE_PRIORITE_NORMALE, CLASSE_PRIORITE_BASSE

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -14-

mtr86exit
ACTION

Stoppe l'excution de l'application.

SYNTAXE

void

PARAMETRES

DESCRIPTION

mtr86exit est une des trois faons de terminer une application (avec mtr86fatal ou par
appui sur les touches ^BREAK ou ^C (si ses touches sont valides). Les objets utiliss
par mtr86 sont librs. Le retour s'effectue par la primitive start avec pour valeur, le
paramtre pass mtr86exit. Les valeurs comprises entre 90..99 sont rserves par
mtr86. mtr86exit peut tre utilis sans restriction dans tous les types de tches.

VOIR AUSSI

start, mtr86fatal.

EXEMPLE 'C'

Tous les exemples Ex.c

mtr86exit( unsigned n );

Code d'erreur.

cree
ACTION

Cr une tche.

SYNTAXE

HANDLE

PARAMETRES

Adresse (nom) de la tche,


Priorit de la tche :

Taille de la pile ( 4ko).

cree(TACHE_ADR adr_tache, unsigned priorite,


unsigned size);

PRIORITE_NORMALE [0..2], PRIORITE_MINIMALE, PRIORITE_MAXIMALE

VAL. RETOURNE

ERREUR FATALE

M Priorit errone.

DESCRIPTION

La tche n'est pas lance. Pour la lancer utiliser la primitive active.

VOIR AUSSI

mtr86exit, start, num_tache.

EXEMPLE 'C'

Tous les exemples Ex.c

Handle de la tche cre. Ce handle est compatible avec les objets Win32 et
peut tre utilis avec toutes les fonctions Win32.

active
ACTION

Fait passer une tche l'tat prt.

SYNTAXE

void

PARAMETRES

ERREUR FATALE

M Tche non cr.

DESCRIPTION

Activer un tche consiste faire passer celle-ci de l'tat cre l'tat prt. Cette
procdure place une tche dans la file d'attente des tches ligibles au niveau de priorit
de la tche. Si la tche active est plus prioritaire que la tche ayant effectue la requte,
la tche active est immdiatement lance. Une activation ne correspond pas
obligatoirement au lancement de la tche. La tche active n'est effectivement lance
lorsque sa priorit est suprieure ou gale celle de toutes les tches prtes ou en
excution. Une tche cre peut recevoir un signal d'activation tout moment. Lorsque
la tche n'est pas en mesure d'accepter le signal d'activation, celui-ci est mmoris
jusqu' concurrence de 232.

VOIR AUSSI

cree, detruit, m_send.

EXEMPLE 'C'

Tous les exemples Ex.c

active( HANDLE tache );

handle de la tche.

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -15-

tache_priorite
ACTION

Modifie la priorit dune tche.

SYNTAXE

void tache_priorite ( HANDLE hTache, DWORD dwPrioriteTache );

PARAMETRES

DESCRIPTION

Modifie la priorit dune tche de faon dynamique.

VOIR AUSSI

classe_priorite.

EXEMPLE 'C'

priorite.c

Handle de la tche.
Priorit de la tche (voir cree).

classe_priorite
ACTION

Modifie la priorit du processus courant.

SYNTAXE

void classe_priorite ( DWORD dwPrioriteTache );

PARAMETRES

DESCRIPTION

Modifie la priorit du processus courant de faon dynamique.

VOIR AUSSI

start

EXEMPLE 'C'

priorite.c

Classe de priorit (voir startEx).

priorite_processus
ACTION

Retourne la valeur de la priorit du processus courant.

SYNTAXE

unsigned priorite_processus (void );

VAL. RETOURNE

DESCRIPTION

Permet dobtenir la valeur de priorit du processus courant.

VOIR AUSSI

classe_priorite.

EXEMPLE 'C'

priorite.c

Classe de la priorit du processus (voir startEx) .

d_tic
ACTION

Modifie la rsolution de l'horloge

SYNTAXE

DWORD

VAL. RENVOYEE

DESCRIPTION

d_tic permet de modifier la rsolution de l'horloge utilise dans toutes les oprations
caractre temporel ( dort, ...).
Le paramtre tic doit tre : 1ms tic 10ms. Sous windows NT/2000, la prcision des
temporisations atteint 1ms avec un tic de 1ms. La temporisation est arrondie sur des
multiples de la rsolution. Exemple : pour d_tic(3)
dort(1); // tempo de 3 ms
dort(3); // tempo de 3 ms
dort(5); // tempo de 6 ms

EXEMPLE 'C'

d_tic.c

d_tic( unsigned tic );

tic ou 0 en cas de paramtre incorrect.

cvrtic
ACTION

Sans action

SYNTAXE

unsigned

PARAMETRES

Dure en millisecondes (entier long).

VAL. RENVOYEE

Valeur fournie.

DESCRIPTION

Cette primitive nest prsente que pour des raisons des comptabilits avec Mtr86 Dos.
Avec Mtr86 Win32 tous les temps sont exprims en ms.

cvrtic( unsigned ms );

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -16-

dort
ACTION

Suspend la tche ayant effectu cette requte.

SYNTAXE

unsigned dort( unsigned timeout );

PARAMETRES

Dure de la suspension en ms. Si dure=0 la tche est suspendue de


faon permanente et ne peut tre relance que par la requte rveille.

VAL. RENVOYEE

OK si la tche est relance par la requte rveille TIM si la tche est


relance par le noyau au bout de la temporisation programme.

DESCRIPTION

Lors de l'appel de la primitive dort, la tche effectuant la requte est immdiatement


suspendue et le processeur est attribu la tche ligible prioritaire ou la prochaine
tche prsente dans le file des processus en excution (voir diagramme page 5). Lorsque
le paramtre de dort est gal 0, le rveil de la tche doit obligatoirement tre effectu
par une autre tche l'aide de reveille. Dans ce cas cette requte est utilise pour
effectuer une synchronisation. La valeur passe en paramtre peut tre gale une valeur
diffrente de 0 si on dsire une synchronisation borne. Lorsque dort est utilis comme
moyen de temporisation, la valeur passe en paramtre doit obligatoirement tre
diffrente de 0. La dure de la temporisation est exprime en millisecondes. Les
primitives dort et reveille sont des interfaces directes avec le noyau et permettent
l'application d'implmenter des primitives non ralises par Mtr86.

VOIR AUSSI

d_tic, cvrtic, reveille.

EXEMPLE C

TACHE tache_1( void ) {


if ( (dort(1000))==TIM ) cputs("Timeout");
else puts("Tche rveille par une autre tche");
}
Tous les exemples Ex.c et priorite.c

suspend
ACTION

Suspend une tche.

SYNTAXE

unsigned suspend( HANDLE htache);

PARAMETRES

Handle de la tche suspendre.

VAL. RENVOYEE

valeur du compteur de suspension ou 1 en cas derreur. Une description


dtaille de lerreur peut tre obtenue avec le programme Error Lookup
(ERRLOOK.EXE) fourni avec VC++ 6.X.

DESCRIPTION

Suspend fait passer une tche de l'tat d'excution l'tat suspendu. Les signaux de
suspension sont mmoriss. Il faut viter d'utiliser cette requte avec une tche
susceptible de se bloquer l'aide d'un mcanisme faisant intervenir plusieurs tches
(smaphores, moniteurs, ressources, tubes) cause du risque potentiel d'interbloquage
que prsente cette requte. Une tche suspendue peut tre relance avec la primitive
active.

VOIR AUSSI
EXEMPLE 'C'

active, dort, reveille


tubeIPC.cpp

reveille
ACTION

Relance une tache suspendue.

SYNTAXE
PARAMETRES

void
reveille( HANDLE htache );

Handle de la tche relancer.

DESCRIPTION

reveille est une primitive de bas niveau qui permet de relancer toute tche suspendue. Si
la tche rveille est de priorit suprieure la tche courante, cette dernire est
suspendue la fin du quantum jusqu' ce qu'elle redevienne son tour prioritaire. Seul le
premier signal de rveil est mmoris, les signaux suivant sont perdus.

VOIR AUSSI
EXEMPLE 'C'

dort.
voir exemples Mtr86 Dos

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -17-

detruit
ACTION

Cette fonction n'est pas implmente dans Mtr86W32, utiliser la place


supprime.

supprime
ACTION

Supprime une tche.

SYNTAXE

void supprime( HANDLE htache );

PARAMETRES

DESCRIPTION

Cette primitive arrte l'excution de la tche dsigne. La tche dtruire peut tre dans
un tat CREE, SUSP, EXEC, PRET. A la fin de cette requte la tche dtruite passe
l'tat non cre et le handle ne peut plus tre utilis. La suppression d'une tche doit
toujours tre envisag avec circonspection : si la tche est dtruite alors qu'elle utilise un
objet en exclusion mutuelle, cet objet n'est pas libr et la programme complet peut se
bloquer.

EXEMPLE 'C'

voir exemple E8

Handle de la tche.

tache_c
ACTION

Fourni le vrai handle de la tche courante.

SYNTAXE

HANDLE tache_c( void );

VAL. RENVOYEE

EXEMPLE 'C'

tous les exemples

Handle vritable (et le non pseudo handle) de la tche en excution.

tache_id
ACTION

Fourni le numro de la tche courante.

SYNTAXE

unsigned tache_id( HANDLE htache );

PARAMETRES

Handle de la tche.

VAL. RENVOYEE

Numro de la tche de la tche.

DESCRIPTION

tache_id permet de dterminer le numro de la tche dans laquelle est utilis cette
requte. Cette primitive est gnralement utilise pour quune tche sidentifie lorsqu'il
existe plusieurs instances d'une mme tche (voir exemple e17). La tche lance par start
possde le n 1.

EXEMPLE 'C'

tous les exemples

thread_id
ACTION

Fourni le handle dune tche.

SYNTAXE

HANDLE thead_id( unsigned tache );

PARAMETRES

id de la tche.

VAL. RENVOYEE

handle de la tche (compatible avec Win32).

DESCRIPTION

thread_id permet de dterminer le handle dune tche laide de son entier lidentifiant.
La tche lance par start possde la valeur id = 1.

EXEMPLE 'C'

pas dexemples

num_tache
ACTION

Donne le numro d'une tche partir de son adresse.

SYNTAXE

unsigned

PARAMETRES

Nom de la tche.

VAL. RENVOYEE

Handle de la tche

num_tache( TACHE_ADR adr_tache );

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -18-

DESCRIPTION

num_tache permet de retrouver le handle d'une tche lorsqu'il n'a pas t mmoris lors
de la cration de la tche. La recherche du numro d'une tche est bas sur la
comparaison de l'adresse de la tche avec les valeurs mmorises dans les structures de
donnes de mtr86. Par consquent num_tache ne peut tre utilis lorsque plusieurs
instances d'une mme tche sont cres. num_tache est un processus itratif
consommateur de temps CPU et ne doit pas tre la mthode gnrale d'obtention du
numro d'une tche.
NOTA : num_tache ne peut tre utilis lorsqu'il existe plusieurs instances d'une mme
tche car num_tache utilise l'adresse de celle-ci pour dterminer son numro.

VOIR AUSSI

cree, tache_c.

EXEMPLE 'C'

la plupart des exemples

m_wait, MONITOR
ACTION

Dclare un segment moniteur.

SYNTAXE

void
#define

DESCRIPTION

Les moniteurs sont utiliss pour assurer l'exclusion mutuelle lors de l'accs aux sections
critiques. Un seul processus utilisant la primitive moniteur peut tre actif un instant
donn. m_wait est la procdure d'exclusion mutuelle la plus rapide. m_wait est
galement implant sous la forme de la macro MONITOR dans la version C (voir
mtr86W32.h) Cette macro doit tre utilise avec ENDM dans le mme bloc. La macro
MONITOR effectue un contrle minimal de la smantique de la primitive. Lors de la
destruction de tches utilisant un moniteur, il est indispensable que la tche fournissant
le signal de destruction effectue la squence m_waitdetruitm_signal. Aprs
destruction des tches, m_signal autorise l'limination du numro de la tche dtruite de
la file des tches moniteurs.

VOIR AUSSI

r_wait, s_wait, ENDM, m_signal, s_signal, r_signal.

EXEMPLE 'C'

E32, E4

m_wait( void );
MONITOR m_wait(); {

m_signal, ENDM
ACTION

Libre un segment moniteur.

SYNTAXE

void
#define

DESCRIPTION

L'utilisation des macros MONITOR et ENDM en 'C' permet au compilateur de raliser un


contrle smantique minimal mais provoque des erreurs de syntaxe si le couple
MONITOR ENDM n'est pas utilis dans le mme bloc.

VOIR AUSSI

r_wait, s_wait, MONITOR, m_wait, s_signal, r_signal.

EXEMPLES

Voir m_wait.

m_signal( void );
ENDM m_signal(); }

verrouille
ACTION

Verrouille une section critique.

SYNTAXE

void

PARAMETRES

DESCRIPTION

Permet de verrouiller une section critique de faon efficace. Alternative m_wait


lorsque
le
programme
possde
plus
dune
section
critique.
Mtr86 met disposition les sections critiques 0..MAX_SECTIONS_CRITIQUES-1.

VOIR AUSSI

deverouille, r_wait, s_wait, m_wait.

EXEMPLES

Pas dexemples

verrouille( unsigned n ) ;

numro de la section critique 0..MAX_SECTIONS_CRITIQUES-1.

deverrouille
Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -19-

ACTION

Dverrouille une section critique.

SYNTAXE

void

PARAMETRES

DESCRIPTION

Permet de dverrouiller une section critique.

VOIR AUSSI

verrouille, r_signal, s_signal, m_signal.

EXEMPLES

Pas dexemples

deverrouille( unsigned n ) ;

numro de la section critique 0..MAX_SECTIONS_CRITIQUES-1.

m_send
ACTION

Active une tche par passation de messages.

SYNTAXE

void

PARAMETRES

ERREUR FATALE

M Tche non cre.

DESCRIPTION

m_send active une tche en lui passant le message point par le deuxime paramtre. Le
message est recopi dans une file de messages limite. Le comportement de cette requte
est identique active(). Le message pass doit tre un pointeur vers la donne
transmettre.
La taille totale du message doit tre infrieure ou gale 8 octets. Le type du message
est dtermin par la tche active. m_send recopie l'objet dans la pile de la tche juste
avant de lancer celle-ci. En consquence la donne doit exister jusqu'au moment de sa
transmission effective la tche autorise le passage de tous les types de donnes.
Transmission de variables: c'est l'adresse de la variable qui doit tre fournie.
Transmission de l'adresse d'un tableau: dclarer un pointeur sur le tableau, et
passer l'adresse du pointeur m_send.
Transmission d'une constante: il n'est pas possible de transmettre directement une
constante (comme pour l'adresse d'un tableau), celle-ci n'ayant pas d'adresse disponible
en Pascal ou en C. La solution consiste alors l'affecter une variable, puis de
transmettre l'adresse de celle-ci. Pour une chane de caractres, lorsque celle-ci est
infrieure 8 caractres, l'adresse de la chane peut tre directement transmise, la tche
reoit la chane complte en paramtre. Pour une chane de taille suprieure il faut
affecter l'adresse de la chane un pointeur et passer l'adresse de ce pointeur m_send.
La tche reoit alors l'adresse de la chane.

VOIR AUSSI

active.

EXEMPLE C

Voir exemple E5

m_send( HANDLE htache, void* message );

Handle de la tche activer, pointeur vers le message.

5.3. Gestionnaire de tches rythmes

t_cree
ACTION

Cr une tche rythme.

SYNTAXE

HANDLE

PARAMETRES

Adresse de la tche
Taille de la pile (minimum 4Ko),
Intervalle d'excution en ms

VAL. RENVOYEE

Handle de la tche.

DESCRIPTION

t_cree cr une tche excute automatiquement intervalle rgulier (tche rythme). Ce


type de tche doit tre utilis pour effectuer des travaux des instants garantis. Une
tche rythme possde la priorit maximale des tches du processus. Une tche rythme
ne doit faire appel aucune requte susceptible de la bloquer, elle ne doit pas tre
reboucle et doit s'excuter dans l'intervalle du rythme prvu. Elle ne doit donc pas
utiliser les requtes m_wait, r_wait, e_wait, s_wait, rv_signal, dort. Les tubes peuvent
tre utiliss dans une tche rythme condition de vrifier auparavant leur tat (par

t_cree( TACHE_ADR adr_tache, unsigned size,


unsigned ms);

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -20-

p_plein et p_vide). Une tche rythme est lance par la primitive t_start et arrte par
t_stop toujours la fin de celle-ci.

VOIR AUSSI

t_start, t_stop.

EXEMPLE

E7

t_start
ACTION

Lance une tche rythme.

SYNTAXE

void

PARAMETRES

DESCRIPTION

t_start lance une tche cre par t_cree. Une fois lance la tche est automatiquement
relance avec l'intervalle de temps dfini par t_cree.

VOIR AUSSI

t_cree, t_stop.

t_start( HANDLE htache );

Handle de la tche.

t_stop
ACTION

Stoppe une tche rythme

SYNTAXE

void

PARAMETRES

DESCRIPTION

t_stop arrte l'excution d'une tche rythme, mais ne dtruit pas la tche. Une tche
rythme ne doit pas tre dtruite..

t_stop( HANDLE htache );

Handle de la tche rythme.

5.4. Gestion des vnements

e_cree
ACTION

Crer un groupe d'vnements.

SYNTAXE

EVENEMENT e_cree ( void );


FUNCTION
e_cree : EVENEMENT;

VAL. RENVOYEE

Numro du groupe d'vnement cr.

DESCRIPTION

Un groupe d'vnements est constitu de 32 bits vnements. Les oprations possibles


sur ces bits sont l'attente d'une ou plusieurs configurations d'vnements (opration
m_wait), et l'envoie de signaux vers un groupe d'vnements (opration m_signal). Pour
viter de signaler des vnements non encore crs, il est prfrable de crer les
variables vnements dans la tche d'init..

VOIR AUSSI

e_close, e_wait, e_signal

EXEMPLE C

EVENEMENT numero_event_1;
TACHE f1( void )
{
...
numero_event_1 = e_cree();
}
Exemple E4

e_close
ACTION

Dtruit un groupe d'vnements.

SYNTAXE

void
e_close( EVENEMENT ev );
PROCEDURE e_close( evn : EVENEMENT );

PARAMETRES

DESCRIPTION

Dans une application taille critique, la requte e_close permet de rcuprer la mmoire
alloue lorsque le groupe n'est plus utilis. Les groupes vnements sont
automatiquement clos lors de l'arrt de l'application.

Numro du groupe.

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

VOIR AUSSI

Page -21-

e_cree, e_wait, e_close.

e_wait
ACTION

Synchronise une tche sur un vnement.

SYNTAXE

unsigned e_wait( EVENEMENT evn, unsigned valeur, unsigned mask,


unsigned code, unsigned timeout );

PARAMETRES

Numro du groupe d'vnement.


Valeur du groupe vnement attendu
Masque spcifiant les bits vnements du groupe
Code spcifiant le type d'opration entre les bit:
Opration EAND:
Les bits attendus doivent avoir la valeur des bits signals pour que la tche
ayant effectue la requte e_wait soit relance.
Opration EOR:
Un des bits attendus doit avoir la valeur du bit correspondant au bit
signal
pour que la tche ayant effectu la requte e_wait soit relance. Si l'attente est
borne, au bout de timeout ms le systme relance
la tche avec une
indication TIM.
Timeout = 0 attente de dure indtermine
Timeout <> 0 attente durant ms timeout

VAL. RENVOYEE

DESCRIPTION

L'opration e_wait permet une tche d'attendre une combinaison particulire de bits.
Contrairement Mtr86Dos, les vnements sont mmoriss. Lorsqu'une tche se
met en attente d'un vnement, elle ne se bloque pas lorsque lvnement est dj
signal. Il n'est pas possible d'attendre simultanment une combinaison EAND et EOR.
La solution consiste utiliser un bit vnement combinant cette opration.
Exemple: vnement attendu : bit3 OU (bit2 ET bit1).
Combiner bit2 ET bit1 = bitx dans la requte m_signal et attendre bit3 OU bitx.
A partir de la version 2.11 il est possible de connatre la combinaison de bits
ayant satisfait la requte en testant la valeur retourne par e_wait (ne prsente un
intrt dans le cas EOR).

ERREUR FATALE

M Evnement non cr.

VOIR AUSSI

e_cree, e_close, e_signal.

EXEMPLE C

L'exemple suivant attend la configuration des bits suivant:


xxxx 0011 xxxx xxxxb durant un temps maximal d'une seconde.

Combinaison des bits vnements ayant satisfait la requte,


ETM (0) si dpassement du temps imparti.

EVENEMENT e;
TACHE f1( void ) {
if ( e_wait( e, 0x0300,0x0F00,EAND,cvrtic(1000) )
puts("Evnement reus");
else puts("Dpassement du temps d'attente pour e");
}
L'exemple suivant indfiniment la figuration des bits suivant:
xxxx xx11 xxxx xxxx b
xxxx xx01 xxxx xxxx b,
xxxx xx10 xxxx xxxx b
TACHE f1( void ) {
e_wait( e, 0x0300, 0x0300, EOR, 0);
...
}

e_signal
ACTION

Signale un vnement au groupe.

SYNTAXE

unsigned

e_signal( EVENEMENT evn, unsigned vs );


Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

PARAMETRES

VAL. RENVOYEE

DESCRIPTION

Page -22-

Numro du groupe,
Valeur du groupe

PAE si pas de tche en attente de cet vnement ou


nombre de tches effectivement en attente.
Le gestionnaire d'vnements recherche une concordance entre la valeur signale (vs) et
la valeur attendue.
Tche en attente sur une opration EAND:
Si [valeur ET mask = vs] l'vnement signal est celui attendu, le gestionnaire
d'vnements relance alors la tche en attente.
Tche en attente sur une opration EOR:
Si [((valeur ET mask) OU (vs ET mask) ) <> 0] l'vnement signal est celui attendu, le
gestionnaire d'vnements relance alors la tche en attente.
Les vnements signals sont mmoriss. La signalisation des vnements est
relativement coteuse en temps CPU (fonction du nombre de tche en attente de ces
vnements). Il est prfrable de ne signaler les vnements que si leur valeur a chang.
Lorsqu'une tche signale un vnement, celui-ci est perdu si aucune tche n'est en
attente. Il est possible de connatre combien de tches sont effectivement en attente en
testant la valeur retourne par e_signal. Une valeur nulle (PAE) indique qu'il n'y a
aucune tche en attente, une valeur non nulle donne le nombre de tches en attente de cet
vnement. Le test de la valeur retourne permet ventuellement de grer les pertes de
signaux.

ERREUR FATALE

M Evnement non cr.

VOIR AUSSI

e_cree, e_close, e_wait.

5.5. Gestionnaire de rendez-vous

rv_cree
ACTION

Cr et initialise un rendez-vous.

SYNTAXE

RV

PARAMETRES

VAL. RENVOYEE

numro de la variable rendez-vous.

DESCRIPTION

Les rendez-vous permettent de rsoudre la plupart des problmes de synchronisation.


Lorsqu'un rendez-vous a eu lieu, le gestionnaire de rendez-vous rinitialise
automatiquement les structures de donnes utilises pour permettre un nouveau rendezvous avec le nombre dfini lors de l'allocation de la variable. Il est donc inutile de
rinitialiser un nouveau rendez-vous. Si le rendez-vous n'a pas lieu (sortie sur timeout)
ou si le nombre de rendez est fix de faon dynamique, il convient d'effectuer une
rinitialisation.

ERREUR FATALE

M Dpassement du nombre maximal de variables autorises, dbordement du


tas.

VOIR AUSSI

rv_close, rv_signal.

EXEMPLE C

RV rv;

rv_cree( unsigned n, unsigned timeout ) ;


n = nombre de tches se donnant rendez-vous
timeout : attente maximale en ms.

TACHE init( void ){


...
rv = rv_cree( 3, cvrtic(10000));
...
}
Exemple E11

rv_close
ACTION

Dtruit une variable rendez-vous.

SYNTAXE

void

rv_close( RV n );
Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -23-

PARAMETRES

DESCRIPTION

Libre les structures de donnes utilises pour la gestion du rendez-vous concern. Ce


requte n'est utiliser que si l'application doit utiliser un minimum de mmoire.

VOIR AUSSI

rv_cree, rv_signal.

numro de la variable de rendez-vous.

rv_signal
ACTION

Signale l'arrive au rendez-vous.

SYNTAXE

unsigned

PARAMETRES

numro de la var de rendez-vous.

VAL. RENVOYEE

OK si rendez-vous,
TIM en cas de dpassement du temps autoris.

DESCRIPTION

rv_signal suspend la tche effectuant cet appel sauf si elle est la dernire tche se
rendre au rendez-vous. Le gestionnaire de rendez-vous relance alors toutes les autres
tche et rinitialise la variable rendez-vous. Si le rendez-vous n'a pas lieu dans les dlais
prvus, les tches sont relances avec une indication de timeout.

VOIR AUSSI

rv_close, rv_cree.

rv_signal( RV num );

rv_init
ACTION

Rinitialise un rendez-vous.

SYNTAXE

void

PARAMETRES

numro de la var de rendez-vous.


nb de tches au rendez-vous

VAL. RENVOYEE

OK si rendez-vous,
TIM en cas de dpassement du temps autoris.

DESCRIPTION

rv_init permet dinitialiser des rendez-vous de faon dynamique.

VOIR AUSSI

rv_close, rv_cree.

rv_cree( RV n, unsigned val ) ;

5.6. Gestionnaire de tubes

p_open
ACTION

Cr un tube de communication inter-tches.

SYNTAXE

TUBE

PARAMETRES

DESCRIPTION

Un tube tabli un modle dchange producteur consommateur.

VAL. RENVOYEE

ERREUR FATALE

M Plus de tube disponible.

VOIR AUSSI

p_close, p_write, p_read, p_plein, p_vide, detruit.

EXEMPLE C

TUBE t1, t2;


TACHE init( void )
{
unsigned nf1, nf2, nf3;
nf1=cree(f1, 2, 4096); /* crer d'abord les tches */
nf2=cree(f2, 2, 4096); /* avant d'allouer les tubes*/
nf3=cree(f3, 1, 4096);
t1 =p_open ( nf1, nf2, 500 );

p_open(HANDLE producteur, HANDLE consommateur,


unsigned timeout);

Handle du produteur
Handle du consommateur
Timeout sur l'accs au tube en ms:
0
= dure d'une transaction indtermine
n
= dure d'une transaction limite tics timeout

Numro du tube cr.

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -24-

t2 =p_open ( nf1, nf3, 500 );


}
Exemple E6

p_close
ACTION

Dtruit un tube.

SYNTAXE

void

PARAMETRES

DESCRIPTION

Libre les structures de donnes utilises par le tube spcifi. En dsallouant un tube,
p_close peut tre utilis pour vider un tube (squences p_closep_open). p_close ne
relance pas les tches bloques sur un tube vide ou plein.

VOIR AUSSI

p_open, p_write, p_read, p_plein, p_vide, detruit.

EXEMPLE

p_close( t1 );

p_close ( TUBE tube );

Numro du tube.

p_write
ACTION

Ecrit dans un tube.

SYNTAXE

unsigned

PARAMETRES

Numro du tube.
Pointeur vers la zone source.
Nombre d'octets crire.

VAL. RENVOYEE

OK si donne crite, TIM si dpassement du temps imparti.

DESCRIPTION

p_write crit dans le tube de numro spcifi. Lorsque le tube est plein, le rdacteur est
suspendu jusqu' ce qu'une donne soit extraite du tube. Si aucune donne n'est extraite
du tube avant tics timeout, la tche est relance avec une indication de temps dpass.
Les tubes utilisent des tampons de 4Ko octets, mais rien interdit d'crire des donnes de
taille quelconque.

ERREUR FATALE

M Producteur non propritaire du tube.

VOIR AUSSI

p_open, p_close, p_read, p_plein, p_vide.

EXEMPLE C

TACHE f1( void ) {


long tableau[ 250 ]; int j;
...
if (( p_write ( t1, tableau, sizeof(tableau))==TIM)
puts("Donnes non crites dans le temps imparti");
}

p_write(TUBE tube, void* buf, unsigned size);

p_read
ACTION

Lit dans un tube.

SYNTAXE

unsigned

PARAMETRES

Numro du tube.
Pointeur vers la zone destination.
Nombre d'octets lire.

VAL. RENVOYEE

OK si donne lue, TIM si dpassement du temps imparti.

DESCRIPTION

p_read lit le tube de numro spcifi. Lorsque le tube est vide, le lecteur est suspendu
jusqu' ce qu'une donne soit crite du tube. Si aucune donne n'est crite dans le tube
avant tics timeout, la tche est relance avec une indication de temps dpass.

ERREUR FATALE

M Consommateur non propritaire du tube.

VOIR AUSSI

p_open, p_close, p_read, p_plein, p_vide.

EXEMPLE C

TACHE f1( void ){


long tableau[ 250 ]; int

p_read(TUBE tube, void *buf, unsigned size);

j;

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -25-

...
if (( p_read ( t1, tableau, sizeof(tableau))==TIM)
puts("Donnes non lues dans le temps imparti");
}

p_plein
ACTION

Places restantes dans un tube.

SYNTAXE

unsigned

PARAMETRES

Numro du tube.

VAL. RENVOYEE

Place disponible dans le tube.

DESCRIPTION

Cette requte ne se justifie que pour les tches ne devant pas se bloquer (tche
matrielle). En permettant le test de la place disponible dans un tube, cette requte vite
au gestionnaire de tubes de suspendre la tche sur un tube plein.

VOIR AUSSI

p_open, p_close, p_write, p_read, p_vide.

p_plein( TUBE tube );

p_vide
ACTION

Nombre de donnes prsentes dans un tube.

SYNTAXE

unsigned

PARAMETRES

Numro du tube.

VAL. RENVOYEE

Nombres d'octets dans le tube.

DESCRIPTION

Cette requte ne se justifie que pour les tches ne devant pas se bloquer (tche
matrielle). En permettant le test de la quantit de donnes disponibles dans un tube,
cette requte vite au gestionnaire de tubes de suspendre la tche sur un tube vide.

VOIR AUSSI

p_open, p_close, p_write, p_read, p_plein.

p_vide( TUBE tube ) ;

p_openEx
ACTION

Cr un tube de communication entre deux processus.

SYNTAXE

TUBE_EX p_openEx(char* szNomTube, DWORD dwTimout)

PARAMETRES

DESCRIPTION

Un tube tabli un modle dchange producteur consommateur entre deux processus.

VAL. RENVOYEE

ERREUR FATALE

M Plus de tube disponible.

VOIR AUSSI

p_closeEx, p_writeEx, p_readEx, p_pleinEx, p_videEx.

EXEMPLE C

tubeIPC.cpp

tableau de caractre ASCIIZ attribuant un nom au tube (max 31 caractres),


Timeout sur l'accs au tube en ms:
0
= dure d'une transaction indtermine
n
= dure d'une transaction limite tics timeout
Numro du tube cr.

p_closeEx
ACTION

Dtruit un tube.

SYNTAXE

void p_closeEx(TUBE_EX dwTube);

PARAMETRES

DESCRIPTION

Libre les structures de donnes utilises par le tube spcifi. En dsallouant un tube,
p_close peut tre utilis pour vider un tube (squences p_closep_open). p_close ne
relance pas les tches bloques sur un tube vide ou plein.

VOIR AUSSI

p_writeEx, p_readEx, p_pleinEx, p_videEx.

Numro du tube.

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -26-

p_writeEx
ACTION

Ecrit dans un tube IPC.

SYNTAXE

DWORD p_writeEx(TUBE_EX dwTube, void* lpVoidBuffer,


DWORD dwSize);

PARAMETRES

Numro du tube.
Pointeur vers la zone source.
Nombre d'octets crire.

VAL. RENVOYEE

OK si donne crite, TIM si dpassement du temps imparti.

DESCRIPTION

p_write crit dans le tube de numro spcifi. Lorsque le tube est plein, le rdacteur est
suspendu jusqu' ce qu'une donne soit extraite du tube. Si aucune donne n'est extraite
du tube avant tics timeout, la tche est relance avec une indication de temps dpass.
Les tubes utilisent des tampons de 4Ko octets, mais rien interdit d'crire des donnes de
taille quelconque.

ERREUR FATALE

M Producteur non propritaire du tube.

VOIR AUSSI

p_writeEx, p_readEx, p_pleinEx, p_videEx.

p_readEx
ACTION

Lit dans un tube.

SYNTAXE

DWORD p_readEx(DWORD TUBE_EX, void* lpVoidBuffer,


DWORD dwSize);

PARAMETRES

Numro du tube.
Pointeur vers la zone destination.
Nombre d'octets lire.

VAL. RENVOYEE

OK si donne lue, TIM si dpassement du temps imparti.

DESCRIPTION

p_read lit le tube de numro spcifi. Lorsque le tube est vide, le lecteur est suspendu
jusqu' ce qu'une donne soit crite du tube. Si aucune donne n'est crite dans le tube
avant tics timeout, la tche est relance avec une indication de temps dpass.

ERREUR FATALE

M Consommateur non propritaire du tube.

VOIR AUSSI

p_writeEx, p_readEx, p_pleinEx, p_videEx.

p_pleinEx
ACTION

Places restantes dans un tube.

SYNTAXE

DWORD

PARAMETRES

Numro du tube.

VAL. RENVOYEE

Place disponible dans le tube.

DESCRIPTION

Cette requte ne se justifie que pour les tches ne devant pas se bloquer (tche
matrielle). En permettant le test de la place disponible dans un tube, cette requte vite
au gestionnaire de tubes de suspendre la tche sur un tube plein.

p_pleinEx( TUBE_EX tube );

p_videEx
ACTION

Nombre de donnes prsentes dans un tube.

SYNTAXE

DWORD

PARAMETRES

Numro du tube.

VAL. RENVOYEE

Nombres d'octets dans le tube.

DESCRIPTION

Cette requte ne se justifie que pour les tches ne devant pas se bloquer (tche
matrielle). En permettant le test de la quantit de donnes disponibles dans un tube,
cette requte vite au gestionnaire de tubes de suspendre la tche sur un tube vide.
Liste des requtes par catgorie

p_videEx( TUBE_EX tube ) ;

Mtr86 Win32 rvision 2.1

Page -27-

5.7. Gestionnaire de ressources

r_cree
ACTION

Cr une ressource.

SYNTAXE

RESSOURCE r_cree( void );

VAL. RENVOYEE

DESCRIPTION

Le gestionnaires de ressources comporte des requtes destines raliser l'exclusion


mutuelle (zone de donne globale, fonction non rentrante, priphrique non
partageable). Elle sont alors similaires aux smaphores binaires avec les exceptions
suivantes : l'attribution de la ressource s'effectue selon le critre d'ordre d'arrive et non
en fonction de la priorit de la tche et seule la tche en possession de la ressource, est
autorise la librer.
Lors de la destruction de tches utilisant des variables ressources, il est indispensable
que la tche fournissant le signal de destruction s'approprie la ressource en effectuant la
requte r_wait. Aprs destruction des tches, r_signal autorise alors l'limination du
numro de la tche dtruite de la file des tches en attente de la ressource. Ce processus
ne fonctionne pas correctement si la tche dtruite est immdiatement relance puis
suspendue. Dans le cas gnral il vaut mieux dtruire toutes les tches associes la
ressource, puis recrer la ressource et ractiver les tches.

ERREUR FATALE

M Nombre maximal de ressources dpass.

VOIR AUSSI

r_close, r_wait, r_signal.

EXEMPLE C

E8

Numro de la ressource cre.

r_close
ACTION

Dtruit une ressource.

SYNTAXE

void

PARAMETRES

DESCRIPTION

Libre les structures de donnes utilises par le gestionnaire de ressources. Cette requte
est effectue automatiquement la fin d'une application.

ERREUR FATALE

M Ressource non cre.

VOIR AUSSI

r_cree, r_wait, r_signal

r_close( RESSOURCE nr );

Numro de la ressource.

r_wait
ACTION

Rserve une ressource.

SYNTAXE

void

PARAMETRES

DESCRIPTION

r_wait rserve une ressource. Si la ressource est occupe, la tche ayant effectue la
requte est place dans une file d'attente jusqu' la libration de celle-ci. Si la ressource
est attribue la tche, elle devient la proprit exclusive de la tche et elle seule peut la
librer par r_signal. Une tche matrielle ne doit pas effectuer cette requte.

ERREUR FATALE

M Ressource non cre.

VOIR AUSSI

r_cree, r_close, r_signal.

r_wait( RESSOURCE nr );;

Numro de la ressource.

r_signal
ACTION

Libre une ressource.

SYNTAXE

void

PARAMETRES

r_signal( RESSOURCE nr );

Numro de la ressource.
Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -28-

DESCRIPTION

Le gestionnaire libre la ressource nr accapare avec r_wait. Si d'autres tches sont en


attente de cette ressource, le gestionnaire l'attribue la tche suivante en attente de cette
ressource.

ERREUR FATALE

M Tche non propritaire de la ressource.

VOIR AUSSI

r_cree, r_close, r_wait.

5.8. Gestionnaire de smaphores

s_cree, s_creeEx, s_openEx


ACTION

Cr un smaphore ordinaire (s_cree) ,


Cr un smaphore utilisable entre processus.
Ouvre un smaphore dj cre entre processus.

SYNTAXE

HANDLE
HANDLE

s_cree ( DWORD valeurInit );


s_creeEx ( DWORD valeurInit, DWORD MaxCount,
char* szNom );

HANDLE

s_openEx ( char* szNom );

PARAMETRES

Valeur initiale du smaphore (0).


Valeur maximale du smaphore ( 1 et valeurInit).
Nom attribu au smaphore (max 32 caractres) ou NULL si le smaphore est
utilis dans le mme processus.

VAL. RENVOYEE

handle du smaphore cr ou NULL.

DESCRIPTION

s_cree, cr et initialise un smaphore. Lors de la destruction de tches utilisant les


smaphores, il est indispensable que la tche fournissant le signal de destruction effectue
d'abord la requte s_wait avec le smaphore considr. Dans le cas gnral il vaut mieux
dtruire toutes les tches associes au smaphore, puis recrer le smaphore et ractiver
les tches.
s_creeEx, cr et initialise un smaphore qui peut tre utilis entre plusieurs processus.
Chaque processus voulant utiliser le mme smaphore fait appel a s_creeEx en lui
attribuant le mme nom, puis utilise le handle retourn dans les primitives de
synchronisation. Le premier processus faisant appel s_creeEx cre le smaphore, les
processus suivants ouvrent le smaphore de mme nom dj cre.
s_openEx, ouvre le smaphore cre par s_creeEx (mme nom). Une utilisation possible
de cette requte est de dterminer si une instance de processus et dj active (voir
exemple tubeIPC).

VOIR AUSSI

s_cree, s_close, s_wait, s_signal.

s_close
ACTION

Dtruit un smaphore.

SYNTAXE

void

PARAMETRES

DESCRIPTION

Cette requte permet de rcuprer un smaphore.

VOIR AUSSI

s_cree, s_wait, s_signal.

EXEMPLE

s_close ( sem )

s_close( HANDLE sem );

Numro du smaphore.

s_wait
ACTION

ralise l'opration P(s).

SYNTAXE

unsigned

PARAMETRES

Numro du smaphore
Timeout=0 attente de dure indtermine.
Timeout<> 0 attente borne de tic timeout.

VAL. RENVOYEE

OK si opration P(s) russie, TIM si dpassement du temps imparti.

s_wait( HANDLE s, unsigned timeout );

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -29-

DESCRIPTION

s_wait effectue l'opration P(s) sur le smaphore s. Si le smaphore est < 0, la tche
ayant effectue la requte est place dans la file d'attente du smaphore considr. Dans
le cas ou la tche se bloque, timeout permet de spcifier la dure maximale d'attente
en nombre de quantum.
Algorithme de principe de la primitive s_wait(sem):
P(sem):
sem := sem - 1
si sem < 0 alors
bloquer la tche courante
et la placer dans la file d'attente du smaphore
is

ERREUR FATALE

VOIR AUSSI

s_cree, s_close, s_signal.

EXEMPLE

Voir les exemples e2, e14

Smaphore non cr.

s_signal
ACTION

ralise l'opration V(s)

SYNTAXE

void
void

PARAMETRES

DESCRIPTION

s_wait effectue l'opration V(s) sur le smaphore s. Si le smaphore est gal 0 la tche
en tte de la file d'attente est attribue au processeur.
Algorithme de principe de la primitive s_signal(sem):
V(sem) :
sem := sem + 1
si sem <= 0 alors
sortir une tche de la file d'attente du smaphore
activer cette tche
is

ERREUR FATALE

M Smaphore non cr.

VOIR AUSSI

s_cree, s_close, s_wait

EXEMPLE

Voir les exemples e2, e14

s_signal( HANDLE sem );


s_signalEx( HANDLE sem, unsigned val );

Handle du smaphore.
Valeur ajouter au smaphore.

5.9. Requtes diverses

fct_disable
ACTION
SYNTAXE
PARAMETRES

Inhibe des fonctionnalits.


void
fct_disable( unsigned fonc );

Fonctionnalit dsigne par les constantes:


CTRL_C_EVENT
Interdit la touche CTRL C
CTRL_BREAK_EVENT
Interdit la touche CTRL BREAK

DESCRIPTION

fct_disable est utilise pour interdire les fonctionnalits dsignes par fonc.

VOIR AUSSI
EXEMPLE

fct_disable(CTRL_BREAK_EVENT);

fct_enable.

fct_enable
ACTION

Autorise des fonctionnalits.

SYNTAXE

void

PARAMETRES

DESCRIPTION

Utilise pour autoriser les fonctionnalits dsignes par la valeur du paramtre fonc.

fct_enable( unsigned fonc );

Fonctionnalit dsigne par les constantes:


CTRL_C_EVENT
Autorise t la touche CTRL C
CTRL_BREAK_EVENT
Autorise la touche CTRL BREAK

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

VOIR AUSSI

fct_disable.

EXEMPLE

fct_enable(CTRL_BREAK_EVENT);

5.10.

Page -30-

Accs aux ports E/S sous Windows NT

OpenPort
ACTION

Ouvre une plage de port E/S

SYNTAXE

HANDLE OpenPort (char* szDev);

PARAMETRES

DESCRIPTION

OpenPort retourne un handle vers le pilote de priphrique en mode noyau permettant


daccder aux adresses entres-sorties spcifies par le pilote concern (voir
installation). Le pilote doit tre install et tre dans l'tat dmarr (voir installation des
pilotes E/S).

VAL. RETOURNEE

EXEMPLE

hPort1 = OpenPort("\\\\.\\port1");

Nom du priphrique : Port1..Port5 prcd de \\.\

Handle du port ou 1 si pilote non charg

InPortb, InPortw, InPortdw


ACTION

Lit un port E/S

SYNTAXE

BYTE
InPortb ( HANDLE hPort, DWORD dwOffset );
WORD
InPortw ( HANDLE hPort, DWORD dwOffset );
DWORD InPortdw ( HANDLE hPort, DWORD dwOffset) ;

PARAMETRES

handle du pilote retourn par OpenPort


adresse relative par rapport ladresse de base prcise dans le pilote (voir
installation).

VAL. RETOURNEE

Valeur lue ladresse E/S spcifie.

OutPortb, OutPortw, OutPortdw


ACTION

Ecrit un port E/S

SYNTAXE

void OutPortb ( HANDLE hPort, DWORD dwOffset, DWORD dwData);


void OutPortw ( HANDLE hPort, DWORD dwOffset, DWORD dwData);
void OutPortdw( HANDLE hPort, DWORD dwOffset, DWORD dwData);

PARAMETRES

handle du pilote retourn par OpenPort


adresse relative par rapport ladresse de base prcise dans le pilote (voir
installation).
Valeur crire ladresse E/S spcifie par la valeur relative dwOffset .

ClosePort
ACTION

Ferme une plage de port E/S

SYNTAXE

void ClosePort (HANDLE hPort);

PARAMETRES

handle du pilote retourn par OpenPort

Liste des requtes par catgorie

Mtr86 Win32 rvision 2.1

Page -31-

6. EXEMPLES FOURNIS
Les exemples illustrant l'utilisation des requtes sont fournis dans le rpertoire exemples et traitent les
thmes suivant :
e0 :

cration dinstance multiples de tches.

e32 :

exemple de rsolution du problme des lecteurs et rdacteurs.

e4 :

synchronisations par vnements, utilisation des groupes d'vnements.

e5 :

mise en uvre des primitives d'activation par passation de messages.

e6 :

communication par tubes.

e7 :

cration de tches rythmes.

e8 :

exclusion mutuelle l'aide du gestionnaire de ressources.

e11 :

synchronisation par rendez-vous.

e14 :

lment de solution du dner des philosophes (utilisation des smaphores pour la synchronisation
et l'exclusion mutuelle).

e17 :

exemple de cration d'instances multiples d'une mme tche.

priorite :

exemple Mtr86Win32 de type GUI mettant en vidence les mcanismes dordonnancement des
tches en entre tches et entre processus.

tubeIPC :

exemple en code C++ de type GUI mettant en uvre lchange de donnes entre deux processus
l'aide de tubes.

d_tic :

mise en vidence de l'inflence de la rsolution de l'horloge sur la prcision des temporisations.

t_com :

valuation du temps de commutation.

Liste des requtes par catgorie

Mtr86 Win32 noyau objet -32-

6. MTR86 OBJET
6.1. Prsentation de Mtr86 Win32 noyau objet
Mtr86 Win32 noyau objet encapsule les primitives de Mtr86Win32 et possde des caractristiques
similaires Mtr86Win32. Mtr86 Win32 objet est fourni sous forme de librairie dynamique et de pilote de
priphrique en mode noyau (NT). Les librairies dynamiques : Mtr86WOM.dll ( Visual C6 ) et Mtr86WOI.dll
(Borland 5.X, Inprise Builder C++) sont copis dans le rpertoire systme de windows.
Diffrences avec Mtr86Win32
Bien que conu de faon trs diffrente de Mtr86Win32, Mtr86Objt reste trs semblable son homologue
mais prsente dans l'ensemble plus d'efficacit en particulier grce l'utilisation de la STL dans le gestion
des listes. Les diffrences essentielles concernent les primitives suivantes :
Primitive
send

Version Objet
Envoie un message (256 octets) vers une
tche sans activer celle-ci. La rception du
message se fait par receive.
fc_xxx
Non implment.
Utiliser SetConsoleCtrlHandler de l'api Win32
num_tache Non implment.
tache_id
Retourne un identificateur unique de tche
thread_id
Non implment.

Version non Objet


(m_send). Envoie un message la tche et
l'active. Le message est reu en tant que
paramtre de tche.
Gre les CTRL BREAK
Retourne le numro de la tche
Retourne le numro de la tche 1..n
Fourni le handle dune tche partir de son
numro

6.2. Installation et configuration de Mtr86 Win32 Objet


Voir installation de Mtr86Win32, ajouter au projet les librairies dimportation Mtr86WOM.Lib (Visual
C++) et Mtr86WOI.lib (Borland). Linstallation copie toutes les DLL dans le rpertoire Windows. Utiliser
les mmes options du lieur ( utiliser la RTL dynamique) que pour Mtr86W32.

6.3. Constitution de Mtr86 Win32 Objet


Mtr86Win32 objet est constitu de 10 classes :
Classe

Description

Tache

Classe virtuelle pure servant de classe de base toutes les tches. Toutes les taches doivent
hriter de cette classe et doivent surcharger la fonction virtuelle pure void main(void*)

TacheRythmee Classe virtuelle pure servant de classe de base toutes les tches rythmes.
Toutes les tches rythmes doivent hriter de cette classe et doivent surcharger la fonction
virtuelle pure : void main(DWORD* dwIntervalle)
Monitor

Classe permettant de crer des objets dexclusion mutuelle l'intrieur d'un mme processus.

Mutex

Classe permettant de crer des objets dexclusion mutuelle l'intrieur d'un mme processus et
entre processus diffrents.

Semaphore

Classe permettant de crer des objets smaphores lintrieur dun mme processus.

RendezVous

Classe permettant de crer des objets de synchronisation lintrieur dun mme processus et
entre processus diffrents.

Evenement

Classe permettant de crer des objets de synchronisation lintrieur dun mme processus.

Pipe

Classe permettant de crer des objets utilisant le modle producteur consommateur lintrieur
dun mme processus.

PipeEx

Classe permettant de crer des objets utilisant le modle producteur consommateur tendus aux
processus.

Port

Classe permettant de crer des objets accdant aux ports E/S (Windows NT).
Ecriture des applications

Mtr86 Win32 noyau objet -33-

6.4. Description des classes

Constantes
Priorit des tches

Description

priorite_normale

Priorit de base. Variations possibles de 2..2

priorite_minimale

Priorit minimale.

priorite_maximale

Priorit maximale.

Priorit processus

Description

classe_priorite_temps_reel

Classe priorit temps rel. Priorit suprieure celle


du systme dexploitation.
Sous NT, toute attente active avec ce niveau de priorit
bloque le systme dexploitation.

classe_priorite_haute

Priorit un cran au dessus de la classe normale.

classe_priorite_normale

Priorit par dfaut.

classe_priorite_basse

Priorit minimale du processus

6.5. Constructeurs de copie et constructeurs par dfaut


Toutes les classes ont un constructeur de copie prive non dfini. Par consquent toute copie dobjet
Mtr86 est impossible
Toutes les classes dfinissent un constructeur par dfaut. Ce constructeur est indispensable pour agrger
les objets. Certains constructeurs par dfaut produisent des objets inutilisables tels quels . La classe
dfinit alors une mthode de construction cree.
Constructeurs par dfaut

Description

Tache

Cre un objet Tache valide, de priorit normale et non activ.

TacheRythmee

Crer un objet TacheRytmee incomplet.


Doit tre utilis avec cree.

Monitor

Crer un objet monitor valide.

Mutex

Crer un objet Mutex valide. Si celui-ci ne doit uniquement tre instanci sans tre
cre, driver une classe appelant le constructeur Mutex(NO_CREATE)(voir exemple
PipeInterProcess).

Semaphore

Cre un objet Semaphore incomplet.


Doit tre utilis conjointement avec cree.

RendezVous

Cre un objet RendezVous incomplet.


Doit tre utilis conjointement avec init.

Evenement

Cre un objet Evenement valide.

Pipe

Cre un objet Pipe incomplet.


Doit tre utilis conjointement avec open

PipeEx

Cre un objet PipeEx incomplet.


Doit tre utilis conjointement avec openEx

Port

Cre un objet Pipe incomplet.


Doit tre utilis conjointement avec open

Ecriture des applications

Mtr86 Win32 noyau objet -34-

Classe Tache
Types dfinis

Description

Valeurs

RUNNING

Utilis comme paramtre de constructeur

WAIT : cration sans activation


RUN : cration suivi d'activation

WAIT_RESULT

Type de valeur retourne par les primitives


effectuant une attente borne temporelle
(dort, wait, ...).

OK : tche relance par un signal de rveil.


TIM : tche relance au bout du temps spcifi.

Membres non statiques

Description

Tache()

Constructeur par dfaut. Cre une tche de priorit normale avec une tous
taille de pile par dfaut. La tche nest pas active.

Tache(int priorite)

Cre une tche de priorit spcifie. La tche nest pas active.

Tache(int priorite,
RUNNING running)

Cre une tche de priorit spcifie avec possibilit d'activation


e11, e17,
immdiate (running==RUN, compteur de suspension = 0) ou diffre
(running==WAIT, compteur de suspension = 1).

Tache(int priorite,
RUNNING running,
void* param)

Cre une tche de priorit spcifie avec possibilit d'activation


immdiate( running==RUN) ou diffre (running==WAIT) et de
passation dun paramtre la tche (voir exemple e17.cpp).

e17, e32,
philo

Tache(int priorite,
RUNNING running,
void* param,
unsigned pile)

Cre une tche de priorit spcifie avec possibilit d'activation


immdiate( running==RUN) ou diffre (running==WAIT), de
passation dun paramtre la tche (voir exemple e17.cpp) et de
spcification de taille de pile (minimum 4K).

tous

void cree()

Mmes paramtres que le constructeur Tache.


Cette requte est utilise pour crer une tche aprs suppression de
celle-ci.

e19

void active()

Active la tache rfrence. Les signaux dactivation sont mmoriss.


Chaque activation dcrmente le compteur de suspension de la tche.
Lorsque celui-ci arrive 0, la tche est effectivement active.

DWORD suspend()

Incrmente le compteur de suspension (voir active). Suspend la tache PipeInterP..,


rfrence quand le compteur passe de 0 1. Une tche suspendue
priorite
peut tre relance par active. Retourne 0xFFFFFFFF en cas
derreur.

HANDLE handle()

Retourne lidentificateur systme de la tche.

DWORD tache_id()

Retourne lidentificateur entier de la tche.

DWORD dort(DWORD ms)

Suspend la tche courante pour ms * 10-3 secondes. La valeur 0


e19,
correspond une suspension de dure indtermine. Se diffrencie de
suspend par le fait que les signaux ne sont pas mmoriss.
Retourne TIM ou OK si la tche a reu un signal de rveil.

void reveille()

Relance une tche suspendue par dort

int priorite()

Retourne la priorit de la tache courante.

Ecriture des applications

Exemples

e11, e17,

Mtr86 Win32 noyau objet -35void supprime()

Fait passer une tche ltat non cre.

e19

BOOL fixe_priorite(
int priorite )

Fixe la priorit dune tche. Retourne 0 en cas dchec.

priorite

void send(const void* buff)

Envoie un message une tche. Attention, la tche doit avoir t


instancie. La taille maximale du message est de 256 octets.

e19, e19_0

void receive(void* buf)

e19, e19_0
Rceptionne un message dune tche. Attention, la tche doit avoir
t instancie. Prvoir un tampon de 256 octets ( taille du message).

Membres statiques

Description ( description plus complte plus haut )

Exemples

void active(Tache& t)

Active la tache t.

tous

DWORD suspend(Tache& t)

Suspend la tache t. Celle ci est relance par active.

PipeInterP..,
priorite

void reveille(Tache& t)

Relance la tache t endormie par dort.

void supprime(Tache& t)

Fait passer la tache t ltat non cre.

e19

BOOL fixe_priorite(Tache& t,
int priorite )

Fixe la priorit la tache t.

priorite

void send(Tache& t,
const void* buff)

Envoie un message une tche. Attention, la tche doit avoir t


instancie. La taille maximale du message est de 256 octets.

e19

HANDLE tache_c()

Retourne lidentificateur de la tche courante.

Membres statiques

Membres statiques nutilisant pas dobjet tache

Exemples

DWORD d_tic(DWORD tic)

Permet de modifier la rsolution de l'horloge pour les oprations


temporelles.

d_tic

int wait_for_terminate()

Indispensable dans tous les programmes. Attend le signal mtr86exit,


retourne la valeur retCode fournie par mtr86exit.

tous

void mtr86exit(int retCode);

Envoie un signal de terminaison vers wait_for_terminate.

tous

BOOL priorite_processus(
CLASSE_PRIORITE priorite)

Fixe la priorit du processus courant. Retourne 0 en cas dchec.

priorite

DWORD

Retourne la priorit du processus courant.

priorite

void MONITOR()

Dbut de section critique.

philo, e32

void ENDM()

Fin de section critique.

philo, e32

Membre virtuel pur

Description

Exemples

void main( void* param )

Point dentre dans la tche. Doit tre surcharg.

tous

priorite_processus()

Ecriture des applications

Mtr86 Win32 noyau objet -36-

Classe TacheRythmee
Types dfinis

Description

Valeurs

RUNNING

Utilis comme paramtre de constructeur

WAIT : cration sans activation


RUN : cration suivi d'activation

Membres non statiques

Description

TacheRythmee( )

Constructeur par dfaut.

TacheRythmee( DWORD ms )

Cre une tche rythme (priorit maximale) avec une taille de pile
par dfaut. La tche nest pas active.

e7

TacheRythmee(DWORD ms,
RUNNING running)

Cre une tche rythme (priorit maximale ) avec une taille de pile
par dfaut avec possibilit d'activation immdiate (running==RUN )
ou diffre (running==WAIT ).

e7

TacheRythmee( DWORD ms,


RUNNING running,
unsigned pile)

Cre une tche rythme (priorit maximale) avec une taille de pile
par dfaut avec possibilit d'activation immdiate (running==RUN)
ou diffre (running==WAIT) et de spcification de taille de pile
(minimum 4K).

e7

void cree()

Mmes paramtres et mme signature que TacheRythmee.


Cette requte est utilise aprs instanciation dun objet par le
constructeur par dfaut, peut tre galement utilis pour crer une
tche aprs suppression.

void supprime(Tache& t)

Fait pass une tche ltat non cre.

void active()

Active la tache rfrence. Celle est lance avec une priodicit


spcifie par ms (voir constructeur)

BOOL fixe_rythme(DWORD dwMs)

Fixe la priodicit de la tache rythme rfrence.

void t_start()

Dmarre la tche rythme rfrence.

e7

void t_stop()

Stoppe la tche rythme rfrence.

e7

Membres statiques

Description

Exemples

void active(Tache& t)

Active la tache t.

e7

void supprime(Tache& t)

Fait pass la tache t ltat non cre.

BOOL fixe_rythme(
TacheRytmee& t,
DWORD dwMs )

Fixe la priodicit la tache t rythme.

void t_start(TacheRytmee& t)

Dmarre la tache t rythme.

e7

void t_stop(TacheRytmee& t)

Stoppe la tache t rythme.

e7

Membre virtuel pur

Description

Exemples

void main(DWORD* dwms)

Point dentre dans la tche rythme. Doit tre surcharg.


Reoit comme paramtre (en lecture/criture) lintervalle
dactivation.

e7

Ecriture des applications

Exemples

e7

Mtr86 Win32 noyau objet -37-

Classe Monitor
Membres

Description

Exemples

Monitor()

Cre un objet dexclusion mutuelle de porte intra processus.

philo

void lock()

Dbut de section critique.

philo

void unlock()

Fin de section critique.

philo

Classe Mutex
Types dfinis

Description

Valeurs

MODE

Utilis comme paramtre de constructeur

OPEN : accde un mutex existant.


CREATE : accde ou cre un mutex
NO_CREATE : utilis pour la dclaration
dobjets statiques (voir tubeIPC.cpp)

Membres

Description

Exemples

Mutex()

Cre un objet dexclusion mutuelle de porte intra processus.

e32

Mutex(char* sNom, MODE mode)

Cre un objet dexclusion mutuelle de porte interprocessus. Si le


mutex est dj cre dans un autre processus il est uniquement ouvert.

e32

void open(char* sNom,


MODE mode)

Cre (mode=CREATE) ou accde (mode=NO_CREATE) un objet pipeInterproc


dexclusion mutuelle de porte interprocessus.

void lock()

Dbut de section critique.

void lock(DWORD timeout)

Dbut de section critique avec borne temporelle timeout ms.

unlock()

Fin de section critique.

HANDLE handle()

Retourne lidentificateur systme du mutex.

e32

e32

Classe Semaphore
Types dfinis

Description

Valeurs

MODE

Utilis comme paramtre de constructeur

OPEN : accde un smaphore existant.


CREATE : accde ou cre un smaphore

Membres

Description

Exemples

Semaphore()

Constructeur par dfaut. Ne cre pas de smaphore.

e32, philo

Cre un objet smaphore de porte intra processus de valeur_init

e32, philo

Semaphore(DWORD
Semaphore(DWORD
DWORD
Semaphore(DWORD
DWORD
char*

valeur_init)
valeur_init,
valeur_max )
valeur_init,
valeur_max,
szNom)

Cre un objet smaphore, en prcise sa valeur initiale & maximale. e32, philo
Cre un objet smaphore de porte interprocessus, en prcise sa
valeur maximale et le nomme.

Ecriture des applications

Mtr86 Win32 noyau objet -38Semaphore(DWORD


DWORD
char*
MODE
void cree(DWORD

valeur_init,
valeur_max,
szNom,
mode)
valeur_init)

void cree(DWORD valeur_init,


DWORD valeur_max )
void cree(DWORD valeur_init,
DWORD valeur_max,
char* szNom)

Cre ou accde un objet smaphore de porte interprocessus, en


prcise sa valeur maximale et le nomme.

e32, philo

Utilis conjointement avec le constructeur par dfaut.


Cre un objet smaphore et en prcise sa valeur initiale.

e32

Utilis conjointement avec le constructeur par dfaut.


e32, philo
Cre un objet smaphore, en prcise sa valeur initiale & maximale.
Utilis conjointement avec le constructeur par dfaut.
Cre un objet smaphore de porte interprocessus, en prcise sa
valeur initiale & maximale et le nomme.

DWORD wait()

P(s). Retourne OK

e32, philo

DWORD P()

P(s). Retourne OK

e32, philo

DWORD wait(DWORD dwtimeout)

P(s) avec borne temporelle. Retourne OK ou TIM.

e32, philo

DWORD P(DWORD dwtimeout)

P(s) avec borne temporelle. Retourne OK ou TIM.

e32, philo

BOOL

signal()

V(s). Retourne 0 en cas derreur.

e32, philo

BOOL

V()

V(s). Retourne 0 en cas derreur.

e32, philo

BOOL

signal(long nCount)

nCount * V(s). Retourne 0 en cas derreur.

BOOL

V(long nCount)

nCount * V(s). Retourne 0 en cas derreur.

long

val()

Retourne la valeur du smaphore.

HANDLE handle()

Retourne lidentificateur du smaphore.

Classe RendezVous
Membres

Description

Exemples

RendezVous( )

Constructeur par dfaut. Doit tre utilis conjointement avec init.

e11

RendezVous( DWORD n )

Cre un objet rendez_vous pour n taches.

e11

RendezVous( DWORD n,
DWORD dly_max )

Cre un objet rendez_vous pour n taches avec borne temporelle.

e11

void init ( DWORD n )

Initialise ou cre (si non cree) un objet rendez_vous pour n taches

e11

void init ( DWORD n,


DWORD dly_max )

Initialise ou cre (si non cree) un objet rendez_vous avec borne


temporelle pour n taches

e11

DWORD signal( Tache& t )

Effectue le rendez-vous. Retourne OK ou TIM

e11

Ecriture des applications

Mtr86 Win32 noyau objet -39-

Classe Evenement
Types dfinis

Description

Valeurs

CODES

code de retour

PAE : pas de tache en attente


ETM : dpassement de borne temporelle

MODE

code opration

EOR : opration OU entre avnements


EAND: opration ET entre avnements

Membres

Description

Exemples

Evenement()

Cre un objet vnement

e4

DWORD wait( DWORD valeur,


DWORD mask,
DWORD op )

Attend une vnement ( voir description e_wait )

e4

DWORD wait( DWORD


DWORD
DWORD
DWORD

Attend une vnement avec borne temporelle


( voir description e_wait )

e4

Signale vs. Retourne le nombre de tches en attentes.

e4

Membres

Description

Exemples

Pipe( )

Constructeur par dfaut doit tre utilis avec open.

e6

Pipe( Tache& tache_w,


Tache& tache_r )

Cre un objet communiquant local (tube) entre le producteur


tache_w et le consommateur tache_r

e6

Pipe( Tache& tache_w,


Tache& tache_r,
DWORD dwtimeout )

Cre un objet communiquant local (tube) entre le producteur


tache_w et le consommateur tache_r avec borne temporelle

e6

void open( Tache& tache_w,


Tache& tache_r )

Cre un objet communiquant local (tube) entre le producteur


tache_w et le consommateur tache_r. Utilis avec le
constructeur par dfaut.

e6

void open( Tache& tache_w,


Tache& tache_r,
DWORD dwtimeout )

Cre un objet communiquant local (tube) entre le producteur


tache_w et le consommateur tache_r avec borne temporelle.
Utilis avec le constructeur par dfaut.

e6

DWORD write( const void* buf,


DWORD size )

Ecrit size octets dans le tube. Retourne OK ou TIM.

e6

DWORD read( void* buf,


DWORD size )

Lit size octets depuis le tube. Retourne OK ou TIM.

e6

DWORD plein( )

Place restant dans le tube.

e6

DWORD vide( )

Place occupe dans le tube.

e6

valeur,
mask,
op,
timeout )

DWORD signal( DWORD vs )

Classe Pipe

Ecriture des applications

Mtr86 Win32 noyau objet -40-

Classe PipeEx
Membres

Description

Exemples

PipeEx( )

Constructeur par dfaut. doit tre utilis avec open.

tubeIPC.cpp

PipeEx( char* szNomTube )

Cre un tube de communication interprocessus et le nomme.

tubeIPC.cpp

PipeEx( char* szNomTube,


DWORD dwTimout )

Cre un tube de communication interprocessus et le nomme. Fixe


avec borne temporelle aux transactions.

tubeIPC.cpp

void open( char* szNomTube )

Cre un tube de communication interprocessus. Utilis avec le


constructeur par dfaut.

tubeIPC.cpp

void open( char* szNomTube,


DWORD dwTimout )

Cre un tube de communication interprocessus avec borne


temporelle. Utilis conjointement avec le constructeur par dfaut.

tubeIPC.cpp

DWORD write( const void* buf,


DWORD size )

Ecrit size octets dans le tube. Retourne OK ou TIM.

tubeIPC.cpp

DWORD read( void* buf,


DWORD size )

Lit size octets depuis le tube. Retourne OK ou TIM.

tubeIPC.cpp

DWORD plein( )

Place restant dans le tube.

tubeIPC.cpp

DWORD vide( )

Place occupe dans le tube.

tubeIPC.cpp

Classe Port (NT, 2000, XP)


Membres

Description

Port()

Constructeur par dfaut. Ne fait rien.

Port( char* szDev )

Ouvre le port E/S dsign.

void open( char* szDev )

Ouvre le port E/S dsign.

BYTE InPortb( DWORD Offset ) Lit un octet ladresse E/S relative offset
USHORT InPortw(DWORD Offset) Lit un mot de 16 bits ladresse E/S relative offset
DWORD InPortdw(DWORD Offset) Lit un mot de 32 bits ladresse E/S relative offset
void OutPortb(DWORD Offset,
DWORD dwData)

Ecrit les 8 bits de poids faible de dwData E/S relative offset

void OutPortW(DWORD Offset,


DWORD dwData)

Ecrit les 16 bits de poids faible de dwData E/S relative offset

void OutPortdw(DWORD Offset, Ecrit dwData E/S relative offset


DWORD dwData)

6.4. Ecriture des applications


Compilation
Utiliser les mmes options de compilation que pour Mtr86 Win32 (voir page 7-8).
Ecriture des applications

Exemples

Mtr86 Win32 noyau objet -41Ajouter au projet le fichier dimportation Mtr86WOX.lib correspondant au compilateur utilis. Pour les
applications Visual C++ (uniquement) utilisant les E/S console de type conio Borland ajouter la librairie
statique crt.lib. Ces fichiers sont situs dans les rpertoires :
NoyauObj\Borland
( Mtr86WOI.lib ) // BC5.X
NoyauObj\Builder
( Mtr86WOI.lib ) // Builder 4.X..5.X
NoyauObj\VC6
( Mtr86WOM.lib et Crt.lib ) // Visual C++ 6.X
Fichiers inclure au minimum
#include
"<chemin>\conio.h"
// pour les applications ne mode console (VISUAL C++)
#include
"<chemin>\mtrobj.h"
// pour les dfinitions des classes
Pragma pour applications Visual C++ en mode console
#pragma comment(linker, "/nodefaultlib:LIBCMT")

Comment crire une application ?


Instanciation dune tche
Les classes Tache et TacheRythmee sont des classes abstraites. Pour pouvoir instancier un objet tche il faut
driver une nouvelle classe et surcharger la fonction membre virtuelle pure main. Exemple :
La classe ci dessous constitue une drivation minimale.
class Producteur : public Tache {
public :
Producteur() {};
// Constructeur
virtual void main(void*); // Point dentre dans la tche
};

Le constructeur Producteur appelle le constructeur de la classe Tache avec tous les paramtres par dfaut :
Tache( int priorite = priorite_normale,
RUNNING running = WAIT,
void*
pParam = NULL,
unsigned Taille_Pile = 0 );

//
//
//
//

priorit normale
tche non active
pas de paramtre pass
taille de pile par dfaut

Une classe dfinie suivant ce mode peut tre utilis pour instancier un objet global ou statique (constructeur appel
avant la fonction main du programme C++). Ici lappel du constructeur Producteur ne provoquera pas (et ne doit
jamais provoquer) le dmarrage de la tche avant lexcution de la fonction main. Le paramtre running du
constructeur de la classe Tache prenant ici la valeur WAIT.

Modification de la priorit dune tche et puis activation.


Producteur
p1;
Consommateur c1;
void Producteur::main(void*)
{
//...
}

// Tache producteur

int main()
{
//...
Tache::fixe_priorite(p1, priorite_normale+2);
// ou
p1.fixe_priorite(priorite_normale+2);
Tache::active(p1);
// ou
p1.active();
//...

// lance la tche
// idem

Les requtes des classes Tache et TacheRythmee existent sous deux formes :
une forme statique : exemple active(p1);
une forme utilisant un objet tche : exemple p1.active();
La deuxime forme prsente un risque dutilisation errone lorsquelle est employe dans une tche. Exemple :
Ecriture des applications

Mtr86 Win32 noyau objet -42Consommateur c1;


...
void Producteur::main(void*) // Tache producteur
{
// On dsire activer la tche consommateur
active(); // (*this).active() : active nouveau la tche producteur !!!
// A la place de c1.active() ou active(c1)
}

La forme statique ne prsente pas cet inconvnient : il faut absolument prciser la tche sur laquelle porte la requte.
Pour viter une maladresse de ce type, il suffit dutiliser le fichier _mtrobj.h la place mtrobj.h.
Dans ce fichier, les fonctions non statiques dangereuses sont prfixes par le caractre soulign.

Passage dun paramtre une tche


Le constructeur de la classe Tache et la requte cree possdent un paramtre void* pParam. Ce paramtre est
transmis la fonction main. Ce paramtre peut tre utilis par lapplication pour identifier une tche ( voir exemples
philo.cpp, e17.cpp, ...) .
Extraits de e17.cpp. Cet exemple clone 130 taches qui chacune incrmente et affiche un compteur indpendant :
#define NB_TACHES 130
class T : public Tache {
public :
// on commence par dclarer un constructeur par dfaut afin de pouvoir
// instancier un objet tableau de tches.
T() : Tache(priorite_normale-2, // basse priorit (par exemple)
RUN,
// tche immdiatement lance (par exemple)
(void*)n++)
// un numro est de tche est fabriqu depuis 0
{ };
// rien le corps de la fonction
virtual void main(void*);
// main reoit le paramtre numro de tche ( n )
private :
static int n;
// mmorise le numro de la tche
};
int T::n = 0;
// alloue la variable statique pour contenir le n
void T::main(void* num)
// main reoit un numro de tche
{
int j=0;
int x, y, tache = (DWORD) num;
// la tche sauto identifie 0..129
for (;;) {
// Calcul de la coordonne X dun compteur
x=((tache%10)+1)*7;
// 10 compteurs par ligne espacs de 7 caractres
// Calcul de la coordonne Y dun compteur
y=(tache/10)+1;
Tache::MONITOR();
// Dbut de section critique
GotoXY(x,y+8);
cprintf("%5d", j++);
// Affiche le compteur (variable locale)
Tache::ENDM();
// Fin de section critique
}
}
void main()
{
T t[NB_TACHES];
// Cre et lance 129 taches
...
Tache::wait_for_terminate();
// indispensable pour tous les programmes
}

Modification de rsolution de l'horloge


Par dfaut l'horloge possde une rsolution de 10 millisecondes. La rsolution de l'horloge a une influence
directe sur la prcision des temporisations obtenues par la primitive dort. Exemple :
d_tic(1);
...
dort(1);
...
dort(3);
...
dort(5);

// rsolution 1 ms d_tic(3);
...
// tempo de 1 ms
dort(1);
...
// tempo de 3 ms
dort(3);
...
// tempo de 5 ms
dort(5);

// rsolution 3 ms d_tic(10);//
...
// tempo de 3 ms
dort(1); //
...
// tempo de 3 ms
dort(3); //
...
// tempo de 6 ms
dort(5); //

rsolution 10ms
tempo de 10 ms
tempo de 10 ms
tempo de 10 ms

Les rsolutions infrieures 10 ms surchargent le processeur sur les configurations peut puissantes.
Ecriture des applications

Mtr86 Win32 noyau objet -43-

Encapsulation des tches dans une application


Une classe application est gnralement drive de la classe Tache (si celleci doit faire appel aux services du noyau),
dans le cas contraire la classe application peut tre une classe autonome. Dans les deux cas, la classe application
comportera des objets Tache, soit par gnralisation (hritage), soit par association ou par agrgation.
Considrons les applications e19x.cpp qui illustrent le modle producteur-consommateur (en utilisant les primitives
send et receive du noyau) ainsi que les requtes de suppression et de cration de tches. La premire application
nutilise pas dobjet application, la tche producteur et consommateur sont des objets globaux.

// e19_0.cpp (extraits)
class Producteur : public Tache {
public :
Producteur() {};
virtual void main(void*);
};

class Consommateur : public Tache {


public :
Consommateur() {};
virtual void main(void*);
};

Producteur

Consommateur consommateur;

producteur;

void Producteur::main(void* num)


void Consommateur::main(void* num)
{
{
char Message[Msg::SIZE];
...
...
supprime(producteur);
// (2)
send(consommateur, Message); // (1)
...
}
producteur.cree(priorite_normale, RUN);// (3)
}
void main()
{
...
Tache::active(producteur);
// active est une fonction membre statique publique de
Tache::active(consommateur); // la classe Tache. Comme on est plus dans la classe
Tache::wait_for_terminate(); // Indispensable
}

Dans ce premier exemple le producteur accde lobjet global consommateur (1) et le consommateur
lobjet global producteur (2) et (3). Cet accs noffre aucune difficult puisque producteur et
consommateur sont globaux. Cette technique de programmation nest en gnral pas souhaitable.
Une autre approche consiste encapsuler lapplication dans une classe comportant les tches de services.
Considrons le cas suivant ( e19.cpp) :
class Application {
public :
Application();
...
private :
Producteur
producteur;
Consommateur consommateur;
...
};

La classe Application utilise ici lagrgation pour


incorporer les tches producteur et consommateur ce qui
est possible car tous deux possdent un constructeur par dfaut
(si ce ntait pas le cas on utiliserait lassociation).
On voit que se pose ici le problme de laccs du producteur
vers le consommateur et vise versa.

La classe Application peut utiliser librement les mthodes publiques de lobjet producteur et de lobjet
consommateur, mais le contraire nest possible que via un objet application global. Dautre part si les objets
producteur et consommateur sont privs ces classes doivent tre dclares amies de la classe Application
(voir code ci-dessous) :
class Producteur : public Tache {
public :
Producteur() {};
virtual void main(void*);
};

class Consommateur : public Tache {


public :
Consommateur() {};
virtual void main(void*);
};

Ecriture des applications

Mtr86 Win32 noyau objet -44class Application {


public :
Application() { }
void run() {
Tache::active(producteur);
Tache::active(consommateur);
Tache::wait_for_terminate();
}
private :
Producteur
producteur;
Consommateur consommateur;
friend class Producteur;
friend class Consommateur;
}
Application TheApp;
// Le seul objet global de lapplication
void Consommateur::main(void* num)
void Producteur::main(void * )
{
{
...
...
supprime(TheApp.producteur);
send(TheApp.consommateur, Message); ...
TheApp.producteur.cree(priorite_normale, RUN);
...
}
...
}
void main(){
TheApp.run();
Tache::wait_for_terminate() ;
}

Lobjet dans le quel sont encapsuls les tches nest pas forcment global, laccs aux fonctions des objets agrgs
reste possible via un pointeur statique.
class Producteur : public Tache {
public :
Producteur() {};
virtual void main(void*);
};
class Consommateur : public Tache {
public :
Consommateur() {};
virtual void main(void*);
};
class Application {
public :
Application() { TheApp = this; }
void run() {
Tache::active(producteur);
Tache::active(consommateur);
Tache::wait_for_terminate();
}
static Application* GetApp() { return TheApp; }
private :
Producteur
producteur;
Consommateur consommateur;
static Application* This;
// static pour tre accessible une fonction static
friend class Producteur;
friend class Consommateur;
};
Application* Application::TheApp;
// Allocation du pointeur statique
void Producteur::main(void * )
{
...
send(Application::GetApp()->consommateur, Message);
...
}

Ecriture des applications

Mtr86 Win32 noyau objet -45void Consommateur::main(void* num)


{
...
supprime(Application::GetApp()->producteur);
...
Application::GetApp()->producteur.cree(priorite_normale, RUN);
...
}
void main()
{
Application TheApp;
// Lobjet application est local main
TheApp.run();
Tache::wait_for_terminate() ;
}

6.4. Taille des objets


Tache
TacheRythmee
Monitor
Mutex
Semaphore

28
28
28
04
08

RendezVous
Evenement
Pipe
PipeEx
Port

6.5. Diagrammes de classes des exemples


E4 : mise en uvre des objets vnements.

E6 : mise en uvre des tubes locaux. Application objet.

Ecriture des applications

56
32
64
44
04

Mtr86 Win32 noyau objet -46E7 : mise en uvre des tches rythmes. Application objet.

E11 : mise en uvre de rendez-vous. Application objet.

E17 : cration dinstances multiples du mme objet tche

E19_0 : Mise en uvre du modle producteur consommateur : passation de messages (version 1)

E19 : Mise en uvre du modle producteur consommateur : passation de messages. Application objet.

Ecriture des applications

Mtr86 Win32 noyau objet -47E32 : programmation du modle lecteur - rdacteur. Application objet.

Philo : un classique, le dner des philosophes.

PipeInterProcess : Application GUI objet. Mise en uvre du modle producteur consommateur en utilisant
un tube de communication interprocessus.

Ecriture des applications

Mtr86 Win32 noyau objet -48priorits : Application GUI objet. Mise en uvre des priorits des tches et processus.

Ecriture des applications