Title: Cours Windows CE
1Cours Windows CE
2Plan de la présentation
- Windows CE pour qui, pour quoi ?
- Description du cours réalisé
- Exemple dapplication et de debuggage
- Exemple de driver port parallèle
- Conclusion et questions
3Windows CE
- Interface classique de Windows
- Système dexploitation modulaire et compact
- Nest pas un sous ensemble de NT ou XP
- Système réécrit entièrement pour optimiser la
taille et la performance - Répond à plus de 90 des applications temps réel
- Environnement de développement performant
- Adaptable à de nombreux processeurs
4Applications
- Téléphonie
- PDA
- Bornes interactives
- Machine à coudre (Bernina)
- Machine à voter (Unisys)
- Robot domestique (Fujitsu)
- Chaudières, réfrigérateur
5Pourquoi ce cours ?
- Besoin pour lESIEE
- Demande de Laurent Ellerbach et de son équipe
- Cours en français
- Accessible aux non informaticiens purs et durs
- Basé sur lexemple
- Mis à la disposition des enseignants
6Groupe ESIEE
- École dingénieurs BAC5
- École de technologues BAC3
- Domaines de compétence
- Électronique et microélectronique
- Informatique
- Systèmes embarqués
- Télécommunications
7Équipe
- Conception et rédaction
- Jean CALLOT Ingénieur ESIEE
- Michel DUPLESSY Ingénieur INPG
- Liliane PIEDFORT Agrégée de physique
- Conseiller
- Olivier COME Technologue ESTE et EMVP
- (Embedded Most Valuable Professional)
8Les informaticiens
- Formation orientée applications haut niveau
- Peu intéressés par les couches basses
- Développent souvent sur la machine sur laquelle
tournera lapplication (PC ou station de travail) - Développent avec des outils puissants qui cachent
en général les problèmes liés à la cible (UML,
Visual Studio)
9Les électroniciens
- Spécialistes de lélectronique, pas de
linformatique - Dans le meilleur des cas ils ont des
connaissances - En assembleur
- En langage C
- Sur les microcontrôleurs
- Peu ou pas de connaissances des langages objets
- Peu ou pas de connaissances système
10Évolution de lélectronique
- Arrivée de nouveaux produits nécessitant un noyau
temps réel - Temps réel non critique (plus de 90 des cas)
- Interface homme/machine important
- Importance du coût
- Le matériel et une bonne partie du logiciel
devront être réalisés par les électroniciens - Nécessité dune double compétence
11Électroniciens BAC2/BAC3
- Enseignement très cloisonné
- Évolution lente pour mettre en place un nouveau
cours il faut en supprimer un autre - Budget réduit pour léquipement des salles
- Nécessité de formation des enseignants
- Difficulté pour lélaboration de nouveaux cours
- Formations type constructeur non adaptées à ce
genre de public
12Électroniciens BAC5
- Évolution plus rapide
- Corps enseignant plus polyvalent
- Plus de temps accordé aux projets et stages
permettant de diversifier les domaines abordés - Actions de recherche et développement
- Proches des besoins de lindustrie
13Pédagogie
- Les étudiants supportent de moins en moins les
cours théoriques en amphi - Caractéristiques du cours développé
- Magistral très peu
- Participatif les étudiants manipulent au fur et
à mesure du passage des diapositives - Basé sur des exercices simples à réaliser
- Présentation de lexercice
- Correction de lexercice
- Pédagogie adaptée à de petits groupes
14Caractéristiques du cours
- Cours de base simple, mais concret
- Permet de comprendre les grandes fonctions dun
OS à travers des exemples gradués - Permet daborder ultérieurement un cours standard
du marché ou une auto formation - Objectifs
- Formation de BAC3
- Premier niveau pour des BAC5
- Reconversion déquipes industrielles
- Auto formation
15Organisation du cours
- Deux grandes parties
- Émulateur
- Cible
- La partie émulateur permet de se familiariser
avec les outils et dacquérir des connaissances
de base sans se soucier des problèmes liés au
matériel - La partie cible complète ces connaissances et
introduit les bases de la gestion de
périphériques
16Émulateur
- Permet de développer et de visualiser le résultat
sur le PC de développement - Ne nécessite pas de matériel externe
- Couvre une bonne partie des connaissances
fondamentales - Chapitres 101 à 112
17Cible
- La cible ou target est un matériel sur lequel
tournent le noyau et les applications. - La cible peut être de type
- x86 (STPC, Géode), ARM (Intel, Freescale), SHx
(Hitachi) - Un PC standard peut servir de cible sil dispose
dune interface vidéo de type VESA et dune carte
réseau Ethernet compatible NE2000. - Le cours a été développé sur une cible STPC
STMicroelectronics - Chapitres 201 à 209
18Cible STPC
19101 Installation de Platform Builder
- Installation de loutil de développement Platform
Builder - Réparation de Platform Builder
- Désinstallation de Platform Builder
20102 Généralités
- Présentation de notions de base
- Système temps réel
- Système embarqué
- Configurations de base
- Process, thread, tâche
- Description de lOperating System (OS)
- Architecture mémoire
21103 Génération dune plate-forme
- Prise en main de Platform Builder
- Réalisation dun noyau
- Configuration de la cible
- Essai du noyau
22Exemple
- Génération de plate-forme
23File?New Platform
24Accueil de lassistant ? Next
25BSP?Emulator X86
26Choix du type de plate-forme
- Pour la plupart des essais de base prendre
loption - Industrial Controller
- Industrial Controller est très simple et
assez passe-partout pour des commandes
dautomates industriels ou de petites
applications.
27Nom de la plate-forme
- Par défaut les plates-formes sont sauvées dans
..\WINCE420\PUBLIC dans un dossier qui
correspond au nom saisi dans la boîte de dialogue - Afin de différencier les fichiers de PUBLIC et
ceux des plates-formes créées, nous ferons en
général commencer les noms par z_
28Choix type et nom de plate-forme
29Choix des options de plate-forme
30Choix du réseau
31Fin ?Finish
32Configuration obtenue
33104_1 Génération dapplications
- Génération dapplications
- WCE Console Application
- WCE Application
- Téléchargement des applications
- Test des applications
34104_2 Debugging élémentaire
- Premier contact avec les outils de mise au point
- Génération en vue de debug
- Usage des points darrêt, pas à pas
- Visualisations diverses
- Code
- Variables
- Mémoire
- Pile
35105 Clavier français
- Montrer comment ajouter ou remplacer un driver à
la plate-forme fournie dorigine - Configuration par défaut claviers Anglais,
Japonais et Coréens, pas de clavier français - ? Ajout à notre catalogue dun driver pour un
clavier français - ? Remplacement dans notre plate-forme du driver
par défaut par le driver ajouté au catalogue
36106_1 Threads
- Génération dune application avec thread
- Création dun thread
- Identification dun thread
- Suspension/Reprise dun thread
- Destruction dun thread
- Contrôle de lexécution
- Exemples de threads
37106_2 Synchronisation
- Création dune application ayant plusieurs
threads - Synchronisations entre threads
- Section critique
- Mutex
- Événement
- Sémaphore
- Exemples pratiques
38106_3 Kernel Tracker
- Écrire un programme multithread en mode debug
- Explorer Kernel Tracker, outils avancé de mise au
point - Visualisation des threads
- Visualisation des événements
- ...
39107_1 107_2 Problème des trains
- Présentation du problème
- Application des chapitres threads et
synchronisation à un exemple concret - Corrigé
40108_1 Principe des drivers
- Architecture dun driver sous Windows CE
- Fonctions système disponibles
- Fonctions système à créer
- Écriture dun driver élémentaire
- Génération du driver
- Écriture dune application élémentaire
- Génération de lapplication
- Essai du driver
41108_2 - 108_3 DRIVERexercice et corrigé
- Sous une plate-forme de type Industrial Controler
préparer un driver STR capable de gérer un
buffer en mémoire - Écrire une chaîne de caractères en majuscules
dans le buffer du driver par STR_Write - Lire le buffer par STR_Read
- Modifier le buffer par des STR_IOControl (par
exemple, passage majuscule/minuscule, cryptage) - Renvoyer le buffer modifié
42109_1 109_2 Gestion mémoire exercice et corrigé
- Organisation de la mémoire
- Découpage en slots
- Rôle du slot 0
- Passage dadresses entre le slot 0 et le slot de
lapplication - Passage à un driver de pointeurs créés
dynamiquement dans le slot 0
43110-1 110_2 Communication inter Process
- Notions de mémoire locale, publique
- Passage dadresses entre deux process
- Mapping des adresses
- Gestion des droits
44111 Accès Internet
- Réalisation dune plate-forme permettant laccès
à Internet - Paramétrages réseau
45112 Gestion de fichiers
- Exemple de gestion de fichiers directement sur
une plate-forme diskless - Accès aux zones mémoire réservées pour les
fichiers - Création, lecture, écriture, fermeture de fichiers
46201 Boot CEPC
- CEPC plate-forme de référence pour architecture
PC x86 - Création de la disquette damorçage de la cible
- Préparation du téléchargement par le port
éthernet - Paramétrage de la carte réseau
- Configuration du PC hôte
47202 génération de plate-forme
- Générer une plate-forme à télécharger dans une
cible CEPC - Configurer les connexions de lhôte et de la
cible - Télécharger Windows CE dans la cible
- Recueillir les informations de debug fournies
pendant le téléchargement
48203 OALOEM Adaptation Layer
- Présentation de la couche OAL
- Survol de linitialisation de la plate-forme
- Fonctionnement des interruptions dans une
architecture PC classique à base de x86 - Interruptions dans Windows CE
- Étude de lexemple de la liaison série
- Contrôleur de ligne série 16550
- Contrôleur dinterruption 8259
- Programmes dinitialisation du 16550 et du 8259
49204 Boot Loader
- Introduction de la notion de Boot Loader
- Donner un aperçu de lorganisation proposée avec
Platform Builder - Présenter des variantes utilisables avec une
architecture à base de x86
50205_1 205_2 Serial en pollingexercice et
corrigé
- Écrire un driver rudimentaire et lintégrer dans
Windows CE pour prendre connaissance des
mécanismes - Le driver choisi est le gestionnaire dune
liaison série classique dans le monde PC à base
de lUART 16550 - Ce composant présent sur la cible utilisé de la
façon la plus simple, en polling, nous permettra
dessayer notre driver
51206_1 Généralités sur les IT
- Présentation des notions nécessaires pour aborder
le traitement des interruptions - Organisation générale des interruptions sous
Windows CE - Étude des composants principaux
- Handler
- ISR
- IST
- Fonctions utiles
52206_2 206_3 Serial en ITexercice et corrigé
- Écrire un programme qui va communiquer par une
liaison série - La transmission se fera en polling
- La réception sera gérée par interruption
- On utilisera la deuxième liaison série connectée
sur lIRQ3 de la STPC
53207_1 207_2 Utilisation de COM1exercice et
corrigé
- Utiliser la ligne série de la plate-forme CEPC
avec les logiciels fournis en standard par
Windows CE - Configurer le port série
54208_1 208_2 Gestion du port parallèle
- Faire fonctionner un module daffichage LCD
couplé sur le port parallèle de la cible CEPC - Étude sommaire du port parallèle standard des PC
- Étude sommaire du module LCD
- Écriture dun driver pour ce module
- Écriture dune application pour afficher deux
lignes sur le module LCD - Téléchargement dans le CEPC
- Exécution
55209 Web Pad
- Installation dun serveur Web élémentaire sur la
plate-forme CEPC - Envoi dune page daccueil
- Utilisation dInternet Explorer sur la cible
56DEBOGGAGE
- Problème des trains
- Michel DUPLESSY
57Threads et synchronisation
58Objectif de la présentation
- Application à un exemple concret des chapitres
Threads et Synchronisation - Exemple de débogage avec Kernel Tracker
- Rappel des notions nécessaires présentées dans
des chapitres précédents - Process
- Thread
- Synchronisation
59Process
- Un process ou processus est une instance
dapplication en cours ou en attente dexécution - Un process démarre avec un seul thread (Primary
Thread) mais il peut créer dautres threads - Un process peut avoir plusieurs threads en cours
dexécution simultanément
60Thread
- Thread
- Séquence obtenue par décomposition dun process
- Séquence de code exécutable et autonome
- Accède à lensemble des ressources du process
- Une priorité est attribuée à chaque thread
- Windows CE
- 256 niveaux de priorités
- Ordonnancement (scheduling) par le noyau
- Système préemptif
- Priorité tournante pour des threads de même
priorité
61Synchronisation des tâches
- Dès que plusieurs threads sont en jeu, il faut
coordonner les exécutions - Problème classique du verrou mortel
- Différentes techniques sont disponibles section
critique, Mutex, Événement, Sémaphore - On peut nommer les objets
62Synchronisation par événement
- Gestion des événements
- Création
- Prise de possession
- Restitution
- Transmission de données
63Sémaphore
- Contrôle le nombre des accès à une ressource par
la distribution de jetons - Valeur maximale fixée à la création du sémaphore
- Chaque utilisateur prend (si possible) et
restitue un ou plusieurs jetons sur le sémaphore - Chaque fois quun jeton est pris, le compteur de
jeton est décrémenté - Chaque fois quun jeton est restitué, le compteur
de jeton est incrémenté - Lorsque le nombre de jetons disponibles est 0, la
ressource nest plus disponible et le demandeur
attend
64Trains problème
- Des trains doivent circuler sur une voie ferrée à
sens unique - De A vers B
- De B vers A
- Au plus, trois trains (dans le même sens !)
peuvent se suivre sur la voie unique - Cinq trains sont en attente de chaque côté
- Objectif faire passer les trains sans collision
65Trains solution (1)
- Plusieurs trains pouvant se suivre dans le même
sens, il ny a pas exclusion mutuelle entre les
trains - ? Contrôle par un sémaphore
- La voie étant à sens unique
- ? Contrôle par des événements de sens
66Trains solution (2)
- Chaque train sera un thread
- 5 threads AB_MAIN (A vers B)
- 5 threads BA_MAIN (B vers A)
- Pour quun train puisse entrer sur la voie il lui
faudra obtenir - lévénement de sens
- un des jetons du sémaphore
- Lors de la création des threads (fonction
CreateThread) on passera un numéro de 1 à 5 pour
différencier les threads de chaque sens
(seulement deux threads à écrire au lieu de dix)
67Trains programme (1)
- Programme principal
- Créer les 10 trains (10 threads)
- Créer deux événements de sens, A ? B et B ? A
- Créer un sémaphore à 3 jetons
- Gérer le passage des trains
- Fermer tout ce qui a été ouvert
68Trains programme (2)
- Boucle de gestion des trains
- Libérer les jetons
- Positionner A vers B pendant 500 ms
- Attendre larrivée des trains en récupérant les
jetons - Faire la même chose pour lautre sens
- Sarrêter quand tous les trains sont passés
69Trains programme (3)
- Thread train
- Récupérer le numéro du train
- Attendre le sémaphore et lévénement de sens
- Envoyer un message train numéro x parti
- Attendre 1 seconde (durée du trajet)
- Envoyer un message train numéro x arrivé
- Rendre le jeton
70Trains main (1)
- include "stdafx.h"
- include "winbase.h"
- DWORD WINAPI AB_MAIN (LPVOID p)
- DWORD WINAPI BA_MAIN (LPVOID p)
- HANDLE SEM
- HANDLE SENS_AB,SENS_BA
-
- int WINAPI WinMain(HINSTANCE hInstance,
- HINSTANCE
hPrevInstance, - LPTSTR
lpCmdLine, - int
nCmdShow)
71Trains main (2)
- // Définitions et réservations
- // Paramètres passés aux threads numéros de
1 à 5 - DWORD ThPa1 1
- DWORD ThPa2 2
- DWORD ThPa3 3
- DWORD ThPa4 4
- DWORD ThPa5 5
- DWORD val
- // Handles utilisés
- HANDLE AB_11, AB_12, AB_13, AB_14, AB_15,
- BA_21, BA_22, BA_23, BA_24,
BA_25
72Trains main (3)
- // Création d'un sémaphore à 3 jetons
possibles, vide au départ - SEMCreateSemaphore(NULL,0,3,NULL)
- // Création des événements de sens
- SENS_ABCreateEvent(NULL,TRUE,FALSE,NULL)
- SENS_BACreateEvent(NULL,TRUE,FALSE,NULL)
- printf("début du main\n\n")
73Trains main (4)
- // Création des 10 threads
- AB_11CreateThread(0,0,AB_MAIN,ThPa1,0,0)
- AB_12CreateThread(0,0,AB_MAIN,ThPa2,0,0)
- AB_13CreateThread(0,0,AB_MAIN,ThPa3,0,0)
- AB_14CreateThread(0,0,AB_MAIN,ThPa4,0,0)
- AB_15CreateThread(0,0,AB_MAIN,ThPa5,0,0)
- BA_21CreateThread(0,0,BA_MAIN,ThPa1,0,0)
- BA_22CreateThread(0,0,BA_MAIN,ThPa2,0,0)
- BA_23CreateThread(0,0,BA_MAIN,ThPa3,0,0)
- BA_24CreateThread(0,0,BA_MAIN,ThPa4,0,0)
- BA_25CreateThread(0,0,BA_MAIN,ThPa5,0,0)
74Trains main (5)
- // Boucle principale
- do
-
- // Attente avant départ de A vers B
- Sleep(1000)
- // Libération des 3 jetons
- ReleaseSemaphore(SEM,3,NULL)
- // Set de lévénement de sens de A vers B
- SetEvent(SENS_AB)
- // Attente de 500 tics
- Sleep(500)
- // Reset de lévénement de sens de A vers
B - ResetEvent(SENS_AB)
75Trains main (6)
- // Attente de l'arrivée des trains et
récupération des 3 jetons - WaitForSingleObject(SEM,INFINITE)
- WaitForSingleObject(SEM,INFINITE)
- WaitForSingleObject(SEM,INFINITE)
- // Attente avant les départs de B vers A
- Sleep(1000)
- // Libération des 3 jetons
- ReleaseSemaphore(SEM,3,NULL)
76Trains main (7)
- // Set de lévénement de sens de B vers A
- SetEvent(SENS_BA)
- // Attente de 500 tics
- Sleep(500)
- // Reset de lévénement de sens de B vers
A - ResetEvent(SENS_BA)
- // Attente de l'arrivée des trains et
récupération des 3 jetons - WaitForSingleObject(SEM,INFINITE)
- WaitForSingleObject(SEM,INFINITE)
- WaitForSingleObject(SEM,INFINITE)
77Trains main (8)
- // Vérification de l'arrivée du dernier
train - GetExitCodeThread(BA_25,val)
- printf("code du thread d\n",val)
-
- while(val259) // Tant que le dernier train
nest pas arrivé - printf("fin du main\n")
- getchar()
78Trains main (9)
- // Fermeture des handles
- CloseHandle(AB_11)
- CloseHandle(AB_12)
- CloseHandle(AB_13)
- CloseHandle(AB_14)
- CloseHandle(AB_15)
- CloseHandle(BA_21)
- CloseHandle(BA_22)
- CloseHandle(BA_23)
- CloseHandle(BA_24)
- CloseHandle(BA_25)
79Trains main (10)
- CloseHandle(SEM)
- CloseHandle(SENS_AB)
- CloseHandle(SENS_BA)
- return 0
80Trains AB_MAIN (1)
- DWORD WINAPI AB_MAIN(LPVOID p)
-
- // Initialisation des variables de retour
- // de la fonction WaitForSingleObject
- DWORD SENS1,SEMA1
- // Récupération du numéro du thread (DWORD
pp) - // p est un pointeur de 'void'
- // p pointe sur le paramètre passé au thread
- DWORD pp(DWORD)p
81Trains AB_MAIN (2)
- // Attente de l'obtention du sens et du
sémaphore - // Les 2 valeurs doivent être égales à zéro
- while(SENS!0 SEMA!0)
-
- SENSWaitForSingleObject(SENS_AB,INFINITE)
- SEMAWaitForSingleObject(SEM,1)
-
82Trains AB_MAIN (3)
- // Traitement
- printf("départ du train AB d\n",pp)
- Sleep(1000) // Durée du trajet
- printf("arrivée du train AB d\n",pp)
- // Libération du sémaphore
- ReleaseSemaphore(SEM,1,NULL)
-
- return 0
83Trains BA_MAIN (1)
- DWORD WINAPI BA_MAIN(LPVOID p)
-
- // Initialisation des variables de retour
- // de la fonction WaitForSingleObject
- DWORD SENS1,SEMA1
- // Récupération du numéro du thread DWORD pp
- // p est un pointeur de 'void'
- // p pointe sur le paramètre passé au thread
- DWORD pp(DWORD)p
84Trains BA_MAIN (2)
- // Attente de l'obtention du sens et du
sémaphore - // Les 2 valeurs doivent être égales à zéro
- while(SENS!0 SEMA!0)
-
- SENSWaitForSingleObject(SENS_BA,INFINITE)
- SEMAWaitForSingleObject(SEM,1)
-
85Trains BA_MAIN (3)
- // Traitement
- printf("départ du train BA d\n",pp)
- Sleep(1000) // Durée du trajet
- printf("arrivée du train BA d\n",pp)
- // Libération du sémaphore
- ReleaseSemaphore(SEM,1,NULL)
- return 0
-
86Résultat
On a un peu triché avec les accents
87Plate-forme de travail
88Outils de Platform Builder
- Platform Builder propose un ensemble doutils
spécialisés et un générateur de macro pour aider
à la mise au point dapplications, vérifier le
bon fonctionnement temporel, étudier les
performances, visualiser les fenêtres, etc. - Parmi ces outils, le Remote Kernel Tracker
permet de visualiser graphiquement la chronologie
dune application création des process,
threads, événements, enchaînement des événements,
mutex, etc.
89Modification de lexemple
- Dans notre exemple de programme les impressions
par printf sont elles-mêmes gérées par des
événements, sections critiques, etc. - Pour simplifier sous Kernel Tracker la
visualisation des résultats qui nous intéressent,
nous avons reconstruit lexemple en supprimant
des impressions
90Découverte de Kernel Tracker
- Téléchargement du noyau
- Lancement de Remote Kernel Tracker
- Lancement de TRAINS
- Collecte des données
- Attente de quelques secondes
- Fin de TRAINS après click sur OK
- Fin de la collecte après quelques secondes
- Déconnexion de la cible
- Analyse des données
91Démarrage de Remote Kernel Tracker
92Accepter le choix par défaut OK
93Début de Remote Kernel Tracker
94Exemple de visualisation
Menus
Échelle de temps
Info Bulle
Fenêtre de visualisation
Threads
Légende
95Phase de démarrage de TRAINS
Prologue
96Positionnement du curseur
Click gauche
97Positionnement du marqueur 1
Ouverture du menu par un click droit
98Positionnement du marqueur 2
Marqueur 1 positionné
Curseur déplacé
99Mesure du temps entre marqueurs
Écart visualisé par une hachure
Écart mesuré numériquement
100Démarrage des threads
101Circulation des premiers trains
3 trains partent
2 trains attendent
3 trains arrivent
2 trains prêts
Démarrage des threads
3 trains attendent
102Détail du départ dun train
Libération du sémaphore
Autorisation donnée A?B
Autorisation reçue
Train circule
103Fin des premiers threads
Restitution dun jeton
Fin du thread 1
Fin du thread 2
Fin du thread 3
104Action directe sur les threads
Ouverture du menu par click droit sur le nom du
thread
105Circulation des trains suivants
106Arrivée du dernier train
107Fin du programme
Attente du getchar()
108Conclusion
- Nous avons exploré quelques aspects de Kernel
Tracker - Visualisation de lenchaînement des tâches
- Visualisation des objets
- Mesure des temps
- Utilisation en tant quanalyseur logique
109DRIVER Port Parallèle
- Commande de LCD
- Liliane PIEDFORT
110EXEMPLE DE DRIVER PORT PARALLELE
- Commande dun module
- daffichage LCD
111Plan
- Fonctionnement du port parallèle
- Fonctionnement du LCD
- Signaux
- Commandes
- Notion de driver
- Driver du LCD
- Programme dapplication
112Port Parallèle dun PC (1)
- Le port parallèle standard (SPP) est un port
prévu dès lorigine du PC pour obtenir une
liaison plus rapide que la liaison série de
lépoque, utile pour commander une imprimante - 0x378 Parallel Printer 1 (LPT1) associé à
lIRQ7
113Port Parallèle dun PC (2)
- Registre de données (D7-D0)
- à ladresse de base du port
- Registre de Status (S7-S3)
- à ladresse de base du port 1
- utilisé pour ses cinq bits de poids forts
seulement S7-S3, - S2-S0 inutilisés ou inexistants
- Registre de commande (C4-C0)
- à ladresse de base du port 2
- Utilisé pour ses cinq bits de poids faibles
C4-C0, - C7-C5 inutilisés ou inexistants
- Pour le LCD nous nutilisons que les bits C3 et C0
114Registres du port parallèle
Registre de données
Adresse de base
D7
D0
D6
D5
D4
D3
D2
D1
Poids fort
Poids faible
Registre de status (lecture)
Adresse de base 1
S7
S5
S6
S4
S3
Registre de contrôle
Adresse de base 2
C0
C3
C2
C1
C4
115Registres données et commande
D0
D0
C0
C0
D1
D1
C1
C1
D2
D2
C2
C2
D3
D3
C3
C3
D4
D4
D5
D5
D6
D6
D7
D7
Registre données
Buffer
Registre commande
Buffer
116Écriture sur un port
- VOID WRITE_PORT_UCHAR(PUCHAR Port,
UCHAR Value) - Parameters
- Port
- in Pointer to the port that must be a mapped
memory range in I/O space. - Value
- in Byte to be written to the port.
- Return Values
- None.
117Module daffichage LCD
- Le module HD44780 possède
- Une mémoire de 80 caractères
- Display Data RAM (DD RAM)
- Un générateur de police de caractère
- Deux registres internes DR et IR
- Taille de lafficheur utilisé
- Nombre de lignes daffichage 2
- Nombre de caractères par ligne 20
118Signaux du module LCD
- Port de données D7-D0
- RS Register Select
- E Enable
- R/nW Lecture/écriture, ici écriture
seule 0 - VDD Alimentation 5V
- VSS Masse
- VL Contrôle du contraste, maximal 0
119Câblage du module LCD sur le port parallèle
Module daffichage LCD
R/W VSS VL VDD
D7 D6 D5 D4 D3 D2 D1 D0
RS
E
VDD
VDD
10 KO
10 KO
VDD
VL à la masse donne le contraste maximum
D7 D6 D5 D4 D3 D2 D1 D0
C0
C3
Port parallèle
9
8
6
7
5
3
4
2
17
1
120Registres internes du module LCD
- Deux registres internes
- IR registre dinstruction
- DR registre de données
- Commande des registres par deux signaux
- RS Register Selector relié à la broche nC3 du
port parallèle différencie ces deux registres - RS 0 accès à IR
- RS 1 accès à DR
- E Enable relié à la broche nC0 du port
parallèle, - E 1 valide lintroduction des données
dans les registres
121Séquence décriture dans IR et DR
Repos DRRS1 E0
Repos IRRS0 E0
Donnée ? DR RS1 E?0
Donnée ? IR RS0 E?0
122Commandes pour écrire dans IR
- Signaux de commande en position de repos RS
relié à nC3 et E relié à nC0 mais état - complémenté des bits C3 et C0 doù
commande . . . . 1 x x 1 (RS0 E0) - Mettre linstruction sur le port parallèle D7-D0
- Écrire cette instruction dans le registre IR
- commande . . . . 1 x x 0 (RS0 E1)
- Retour à létat de repos
- commande . . . . 1 x x 1 (RS0 E0)
123Commandes pour écrire dans DR
- Signaux de commande en position de repos RS
relié à nC3 et E relié à nC0 mais état - complémenté des bits C3 et C0 doù
commande . . . . 0 x x 1 (RS1 E0) - Mettre la donnée sur le port parallèle D7-D0
- Écrire cette donnée dans le registre DR
- commande . . . . 0 x x 0 (RS1 E1)
- Retour à létat de repos
- commande . . . . 0 x x 1 (RS1 E0)
124Détail des commandes IR et DR
- Afficheur LCD à deux lignes (C1 inutilisé, à 0 )
- C2 inutilisé, mis à 1
- Repos en prévision dune commande pour IR1101
0xD CTRL RS0 E0 - Entrée de la commande dans IR1100 0xC
CTRLEN RS0 E1 - Repos en prévision dune commande pour DR0101
0x5 DATA RS1 E0 - Entrée de la commande dans DR0100 0x4
DATAEN RS1 E1
125DDRAM du module LCD
- Le module LCD contient une DDRAM gérée
automatiquement par les écritures dans le
registre DR - La donnée écrite dans le registre DR est
transférée systématiquement dans la DDRAM à une
adresse définie par un compteur dadresse interne
(AC) - AC incrémenté à chaque écriture dans DR
- AC initialisé par écriture de linstructionSet
DDRAM address dans le registre IR
126LCD à 2 lignes de 20 caractères
DDRAM
0x00
Première ligne
20 caractères
0x13
20 caractères
0x27
Seconde ligne
0x40
20 caractères
0x53
0x54
20 caractères
0x67
127Instructions pour le LCD (1)
- Clear Display 0x01
- Return Home 0x02
- Entry Mode Set 0x04 à 0x07 (000001 I/D S)
- I/D 1 incrément
- S 0 pas de décalage
- Display ON/OFF 0x08 à 0x0F (00001 D C B)
- D 0 display OFF
- C 0 cursor OFF
- B 0 blink OFF
128Instructions pour le LCD (2)
- Function Set 0x38 ici (001 DL N F 00)
- DL1 Interface 8 bits
- N1 LCD à deux lignes (0 pour une ligne)
- F0 Matrice 5x7
- 0x30 au reset
- Set DDRAM address 0x80 à 0xFF (bit 7 à 1)
(1AAAAAAA) - AAAAAAA Adresse sur 7 bits à placer dans le
compteur AC
129Initialisation du LCD
- Timing à respecter après la mise sous tension
- Séquence de commande obligatoire de configuration
du LCD
130Timing à respecter après Power On
131Séquence dinitialisation
- RESETInstruction 0x30 (Function Set
interface 8 bits) envoyée 3 fois - Display OFF
- Display ON
- Clear Display
- Function Set taille réelle de linterface,
nombre de lignes et police. (non
modifiable ensuite) - Mode Set gestion affichage (décalage texte,
incrément dadresse mémoire)
132Exemple denvoi de commande
- // Mise du port dans létat repos commande
- WRITE_PORT_UCHAR(PARCOMMAND, CTRL)
- Sleep(15) // Attente de 15ms après la mise
sous tension. - // Function Set 1 (interface 8 bits)
- WRITE_PORT_UCHAR(PARDATA, 0x30)
- WRITE_PORT_UCHAR(PARCOMMAND, CTRLEN)
- Sleep(2) // Attente de 2 ms (signal ENABLE
actif) - WRITE_PORT_UCHAR(PARCOMMAND, CTRL)
- Sleep(5) // Attente de 5 ms avant la
commande suivante.
133Notion de driver
134Driver
- Driver raccourci pour device driver ,
souvent traduit par pilote ou contrôleur de
périphérique - Device dispositif physique (périphérique) ou
logique (protocole, service, périphérique
virtuel, fichier) dont le fonctionnement
nécessite des commandes et des ressources au sens
large, mémoire, temps, port, etc. - Device driver module logiciel qui assure
linterface entre le système et le device
135Règle de nommage
- Nom commençant par un préfixe (XXX de façon
symbolique) de trois caractères pour le driver,
par exemple TTY pour une ligne série ou PAR pour
lexemple présenté suivi du caractère underscore
et du nom de la fonction réalisée. - ex PAR_Init
136Fichier .def
- Sert à décrire un module pour orienter le travail
de léditeur de liens lors de la création dun
exécutable .exe ou dune dll - Fichier à créer en respectant une structure
particulière - Structure décrite dans la documentation sous
lentrée Module-Definition Files - Nous nutiliserons que le paragraphe LIBRARY et
lentrée EXPORT dans notre fichier .def
137Fonctions dun driver
- XXX_Init
- XXX_Deinit
- XXX_Open
- XXX_Close
- XXX_Read
- XXX_Write
- XXX_IoControl
- XXX_Seek
- XXX_PowerUp
- XXX_PowerDown
138Lien Driver Application
- XXX_Init appelé par RegisterDevice
- XXX_Open appelé par CreateFile
- XXX_IOControl appelé par DeviceIOControl
- XXX_Close appelé par CloseHandle
- XXX_Deinit appelé par DeregisterDevice
139Driver de gestion du LCD
140PARA.def
141Driver (1)
- // include nécessaires
- include "stdafx.h"
- include lttchar.hgt
- include ltnkintr.hgt
- include ltwdm.hgt
- include ltwindev.hgt
142Driver (2)
- // Définition des IOCTL
- define IOCTL_PUTC \ CTL_CODE(FILE_DEVICE_
UNKNOWN,2048,\ METHOD_BUFFERED,FILE_ANY_AC
CESS) - define IOCTL_CURSEUR \
CTL_CODE(FILE_DEVICE_UNKNOWN,2049,\ - METHOD_BUFFERED,FILE_ANY_ACCESS)
143Driver (3)
- // Définition des adresses du port parallèle
- define PARBASE ((PUCHAR) 0x0378)
- define PARDATA PARBASE
- define PARCOMMAND PARBASE2
- // Définition des mots de commande
- define CTRL 0xD
- define CTRLEN 0xC
- define DATA 0x5
- define DATAEN 0x4
144Driver (4)
- BOOL APIENTRY DllMain(HANDLE hModule,
- DWORD
ul_reason_for_call, - LPVOID
lpReserved) -
- return TRUE
-
145Driver (5)
- DWORD PAR_Init(DWORD dwContext)
- // Mise du port dans létat repos
commande - DWORD dwRet 1
- WRITE_PORT_UCHAR(PARCOMMAND,CTRL)
- Sleep(15)
// Envoi des trois Function Set de RESET //
Positionnement de la donnée 0x30 WRITE_PORT_UCHA
R(PARDATA,0x30) // Function Set 1
WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN) Sleep(2) WR
ITE_PORT_UCHAR(PARCOMMAND,CTRL) Sleep(5)
146Driver (6)
- // Function Set 2
- WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN)
- Sleep(2)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRL)
- Sleep(1)
- // Function Set 3
- WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN)
- Sleep(2)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRL)
- Sleep(10)
147Driver (7)
- // Display OFF
- WRITE_PORT_UCHAR(PARDATA,0x08)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN)
- Sleep(2)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRL)
- Sleep(10)
- // Display ON
- WRITE_PORT_UCHAR(PARDATA,0x0F)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN)
- Sleep(2)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRL)
- Sleep(10)
148Driver (8)
- // Clear Display
- WRITE_PORT_UCHAR(PARDATA,0x01)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN)
- Sleep(2)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRL)
- Sleep(10)
- // Function Set (2 lignes, 8 bits)
- WRITE_PORT_UCHAR(PARDATA,0x38)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN)
- Sleep(2)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRL)
- Sleep(10)
149Driver (9)
- // Mode Set (incrément, pas de décalage)
- WRITE_PORT_UCHAR(PARDATA ,0x06)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN)
- Sleep(2)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRL)
- Sleep(10)
- // Mise du port dans létat repos data
- WRITE_PORT_UCHAR(PARCOMMAND,DATA)
- return dwRet
150Driver (10)
- BOOL PAR_Deinit(DWORD hDeviceContext)
-
- BOOL bRet TRUE
- return bRet
-
151Driver (11)
- DWORD PAR_Open(DWORD hDeviceContext,
DWORD AccessCode,DWORD ShareMode) -
- DWORD dwRet 1
- return dwRet
-
BOOL PAR_Close(DWORD hOpenContext) BOOL
bRet TRUE return bRet
152Driver (12)
- BOOL PAR_IOControl(DWORD hOpenContext,
- DWORD dwCode,
- PBYTE pBufIn,
- DWORD dwLenIn,
- PBYTE pBufOut,
- DWORD dwLenOut,
- PDWORD pdwActualOut)
-
- int val
- BOOL bRet 1
153Driver (13)
- switch(dwCode)
-
- case IOCTL_PUTC
- WRITE_PORT_UCHAR(PARDATA,pBufIn0)
- WRITE_PORT_UCHAR(PARCOMMAND, DATAEN)
- Sleep(2)
- WRITE_PORT_UCHAR(PARCOMMAND,DATA)
- break
154Driver (14)
- case IOCTL_CURSEUR
- // Positionnement du curseur à définir dans
lapplication - val pBufIn0
- // Commande 1xxxxxxx (xxxxxxx 7 bits)
- val val 0x80
- // Mise du port en repos commande
- WRITE_PORT_UCHAR(PARCOMMAND,CTRL)
- Sleep(2)
155Driver (15)
- // Envoi de la commande de positionnement
- WRITE_PORT_UCHAR(PARDATA,val)
WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN) - Sleep(2)
- WRITE_PORT_UCHAR(PARCOMMAND,CTRL)
- // Mise du port en repos data
- WRITE_PORT_UCHAR(PARCOMMAND,DATA)
- break
- // switch
156Driver (16)
- pdwActualOut 1
- return bRet
- // Fin du Driver LCD
157ApplicationLCD Écriture dun message sur 2
lignes
158Application (1)
- // include nécessaires
- include "stdafx.h"
- include ltwindev.hgt
- // Définition des IOCTL
- define IOCTL_PUTC \
CTL_CODE(FILE_DEVICE_UNKNOWN,2048,\
METHOD_BUFFERED,FILE_ANY_ACCESS) - define IOCTL_CURSEUR \
CTL_CODE(FILE_DEVICE_UNKNOWN,2049,\ - METHOD_BUFFERED,FILE_ANY_ACCESS)
159Application (2)
- int WINAPI WinMain(HINSTANCE hInstance,
- HINSTANCE
hPrevInstance, - LPTSTR
lpCmdLine, - int nCmdShow)
-
160Application (3)
- // Déclarations et réservations
- HANDLE hDevice
- CHAR carac11
- DWORD dwNb
- HANDLE hPara
- CHAR pstring1 " journées académiques"
- CHAR pstring2 " 2005"
- unsigned int i
161Application (4)
- // Chargement du driver
- hDevice RegisterDevice(TEXT("PAR"),1,
-
TEXT("PARA_DRV.dll"),NULL) - if(hDevice 0)
-
- MessageBox(NULL,_T("Pb Register PAR1"),
-
_T("PARA_APP"),MB_OK) - return 0
-
162Application (5)
- // Ouverture du driver
- hPara CreateFile(TEXT("PAR1"),GENERIC_WRITE,
0,NULL,OPEN_EXISTING,0,0) - if (hPara INVALID_HANDLE_VALUE)
-
- MessageBox(NULL,_T("Pb Ouverture
PAR1"), -
_T("PARA_APP"),MB_OK) - DeregisterDevice(hDevice)
- CloseHandle(hDevice)
- return 0
-
163Application (6)
- // Envoi première chaîne de caractères
- for(i 0 i ltstrlen(pstring1) i)
-
- carac10 pstring1i
- DeviceIoControl(hPara,IOCTL_PUTC,carac1,1,
-
carac1,1,dwNb,NULL) - Sleep(10)
-
164Application (7)
- // Positionnement du curseur au début de la
ligne 2 - carac100x40
- DeviceIoControl(hPara,IOCTL_CURSEUR,
- carac1,1,carac1,1,
dwNb,NULL) - // Envoi deuxième chaîne
- for(i0iltstrlen(pstring2)i)
-
- carac10pstring2i
- DeviceIoControl(hPara,IOCTL_PUTC,carac1,1,
- carac1,1,dwNb,NULL)
- Sleep(10)
-
165Application (8)
- // Fermeture des handles
- CloseHandle(hPara)
- DeregisterDevice(hDevice)
- CloseHandle(hDevice)
- MessageBox(NULL,_T("Fin application PARA_APP"),
-
_T("PARA_APP"),MB_OK) - return 0
- // Fin de lapplication
166Téléchargement du noyau et de lapplication sur
la cible
Ligne ethernet
Adresse IP de lhôte
Cible CEPC
Carte réseau locale 1
Carte réseau locale 192.168.0.100 Non en
DHCP Pas de DNS
Passerelle vue par défaut
Câble Ethernet croisé
PC hôte
Carte Locale 2 192.168.0.1. Netgear
Port parallèle
Journées Académiques 2005
167Conclusion
168Cours disponible
- Version V1.0
- www.esiee.fr/callotj
- www.msdnaa.net/search/advancedsearch.aspx
169Développements en cours
- Cible Dragon Ball Mx21
- Portage CE5.0
- Applications vidéo
- Réalisation dune maquette pédagogique
170iMX21
171Questions