Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parAntoine Neveu Modifié depuis plus de 10 années
1
jc/md/lp-01/05TTY_IT : présentation1 TTY_IT Présentation
2
jc/md/lp-01/05TTY_IT : présentation2 Objectif du chapitre Écrire un programme qui va communiquer avec 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
3
jc/md/lp-01/05TTY_IT : présentation3 Rappel : principe des interruptions Deux composants logiciels pour gérer les interruptions –ISR : Interrupt Service Routine Code très court qui fait le traitement le plus court possible retourne un numéro logique dIT –IST : Interrupt Service Thread Traite linterruption
4
jc/md/lp-01/05TTY_IT : présentation4 Rappel : déroulement du traitement Une IT physique se produit Le gestionnaire dexception lance lISR associé à cette interruption LISR retourne le numéro logique au noyau Le noyau arme un événement pour déclencher lIST associé LIST est déclenchée La commande IOCTL est exécutée
5
jc/md/lp-01/05TTY_IT : présentation5 Rappel : IST Thread en mode user de forte priorité En attente dun événement associé à lIT logique Réveillé lorsque le Kernel signale lévénement Traite linterruption Acquitte linterruption
6
jc/md/lp-01/05TTY_IT : présentation6 Synchronisation IST/DRIVER L IST va faire lacquisition du caractère reçu et le stockera dans un buffer temporaire ucBufIn Pour signaler au driver quun caractère a été acquis, nous utiliserons un autre EVENT géré par un handle nommé hMonEvent LIST positionne cet EVENT Le driver fait le traitement demandé puis acquitte lEVENT
7
jc/md/lp-01/05TTY_IT : présentation7 Gestion du port série en IT On utilise le port 2 IT physique 0x3 (IRQ 3) IT logique (dwSYSINTR_A_Moi) Adresse du port 0x2F8
8
jc/md/lp-01/05TTY_IT : présentation8 IOCTL On va définir deux IOCTL internes au driver –IOCTL_PUTC envoi de caractère en polling –IOCTL_GETC réception de caractère sous IT On va définir un IOCTL pour la communication driverISR (envoi du numéro logique de lIT) –IOCTL_VAL_SYSINTR
9
jc/md/lp-01/05TTY_IT : présentation9 plate-forme de travail Générer une nouvelle plate-forme standard Nom : z_CEPC_TTY_IT Retirer de la configuration de base la gestion des ports série présente par défaut pour éviter des conflits
10
jc/md/lp-01/05TTY_IT : présentation10 Retirer le port série (1) Onglet Features Dérouler larborescence Z_CEPC_TTY_IT features CEPC: x86 Devices Drivers Serial Cliquer à droite pour ouvrir le menu Cliquer Delete
11
jc/md/lp-01/05TTY_IT : présentation11 Retirer le port série (2) Dérouler jusquà Serial puis clic droit Cliquer
12
jc/md/lp-01/05TTY_IT : présentation12 Configuration obtenue
13
jc/md/lp-01/05TTY_IT : présentation13 DRIVER
14
jc/md/lp-01/05TTY_IT : présentation14 Création du driver Dans File : Choisir New Project or File Nommer Choisir Valider
15
jc/md/lp-01/05TTY_IT : présentation15 Choix du projet Valider Choisir
16
jc/md/lp-01/05TTY_IT : présentation16 Fichier source obtenu
17
jc/md/lp-01/05TTY_IT : présentation17 Création du fichier.def (1) Nous devons créer TTYIT_DRV.def Puis lajouter au projet On peut –Créer directement dans le projet un nouveau fichier de type Text File –Ajouter un fichier créé à lavance dans un répertoire
18
jc/md/lp-01/05TTY_IT : présentation18 Création directe du fichier.def (1) Onglet Files Nommer Cocher Valider Choisir
19
jc/md/lp-01/05TTY_IT : présentation19 TTYIT_DRV.def LIBRARY TTYIT_DRV EXPORTS TTY_Init TTY_Deinit TTY_Open TTY_Close TTY_IOControl
20
jc/md/lp-01/05TTY_IT : présentation20 Insertion de TTYIT_DRV.def (1) Créer le fichier Enregistrer ce fichier dans le répertoire …\WINCE420\PUBLIC\z_CEPC_TTY_IT\TTYIT_DRV Ajouter ce fichier au projet –Cliquer à droite sur le répertoire Source Files –Dans le menu choisir Add Files to Folder… –Dans la fenêtre ouverte, choisir le fichier à insérer –Valider
21
jc/md/lp-01/05TTY_IT : présentation21 Insertion de TTYIT_DRV.def (2)
22
jc/md/lp-01/05TTY_IT : présentation22 Insertion de TTYIT_DRV.def (3)
23
jc/md/lp-01/05TTY_IT : présentation23 Structure du driver
24
jc/md/lp-01/05TTY_IT : présentation24 Entête du driver (1) #include nécessaires #include "stdafx.h" #include
25
jc/md/lp-01/05TTY_IT : présentation25 Entête du driver (2) // Définitions et réservations // Définition des bits de status du sérialiseur #define LS_TSR_EMPTY0x40 #define LS_THR_EMPTY0x20 #define LS_RX_BREAK0x10 #define LS_RX_FRAMING_ERR0x08 #define LS_RX_PARITY_ERR0x04 #define LS_RX_OVERRRUN0x02 #define LS_RX_DATA_READY0x01
26
jc/md/lp-01/05TTY_IT : présentation26 Entête du driver (3) // Définition des offsets des registres du sérialiseur #define comRxBuffer0 #define comTxBuffer0 #define comDivisorLow0 #define comDivisorHigh1 #define comIntEnable1 #define comFIFOControl2 #define comLineControl3 #define comModemControl4 #define comLineStatus5
27
jc/md/lp-01/05TTY_IT : présentation27 Entête du driver (4) // Définition des IOCTL #define IOCTL_PUTC \ CTL_CODE(FILE_DEVICE_UNKNOWN,2048,\ METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_GETC \ CTL_CODE(FILE_DEVICE_UNKNOWN,2049,\ METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_VAL_SYSINTR \ CTL_CODE(FILE_DEVICE_UNKNOWN,2050,\ METHOD_BUFFERED,FILE_ANY_ACCESS)
28
jc/md/lp-01/05TTY_IT : présentation28 Entête du driver (5) // Adresse de base du sérialiseur #define IoPortBase ((PUCHAR) 0x02F8) // Interruptions #define ItPhysique 0x3 // Définition de la structure à passer à lIST typedef struct _ISTDATA { HANDLE hThread; // IST Handle DWORD sysIntr; // Logical ID HANDLE hEvent; // Handle to the EVENT volatile BOOL bAbort; // Flag de fin }ISTDATA;
29
jc/md/lp-01/05TTY_IT : présentation29 Entête du driver (6) // Prototype de l'IST DWORD TTYIST(void *); DWORD dwSYSINTR_A_Moi; // TODO: Réservations diverses
30
jc/md/lp-01/05TTY_IT : présentation30 Entrée du driver BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; }// Fin DllMain
31
jc/md/lp-01/05TTY_IT : présentation31 TTY_Init (1) DWORD TTY_Init(DWORD dwContext) { // TODO: Déclarations diverses // TODO: Initialisation des registres du sérialiseur 16550 // pas d'IT sur Receiver Ready (sera fait dans Open) // 9600 bauds, 8 bits, pas de parité, DTR, RTS // pas de FIFO // TODO: Mettre OUT2 du 16550 à 1 pour autoriser // les IT globalement (pas indiqué dans la // documentation du 16550 !)
32
jc/md/lp-01/05TTY_IT : présentation32 TTY_Init (2) // TODO: Récupération d'un numéro dIT logique // TODO: Chaînage de l'ISR // TODO: Passage du numéro IT Logique à l'ISR // TODO: Création de lévénement de lien pour lIST // handle pour EVENT à nommer hIstEvent
33
jc/md/lp-01/05TTY_IT : présentation33 TTY_Init (3) // TODO : Création de lévénement de synchro // IST/driver à nommer hMonEvent // TODO : Initialisation de la structure // TODO : Inhibition (Disable) de linterruption logique // TODO : Création et démarrage du thread IST
34
jc/md/lp-01/05TTY_IT : présentation34 TTY_Init (4) // TODO : Connexion de lIT logique avec lévénement // TODO : Mise en priorité maximale du thread }// Fin TTY_Init
35
jc/md/lp-01/05TTY_IT : présentation35 TTY_Deinit BOOL TTY_Deinit(DWORD hDeviceContext) { // TODO: Mise du flag bAbort à TRUE pour arrêter l'IST // TODO: Inhibition (Disable) de lIT physique // InterruptDisable // TODO: Fermeture des handles }// Fin TTY_Deinit
36
jc/md/lp-01/05TTY_IT : présentation36 TTY_Open DWORD TTY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { // TODO: Initialisations complémentaires du périphérique // TODO: Vidage du buffer de réception si nécessaire // TODO: Autoriser l'IT Receiver Ready return !0; }// Fin TTY_Open
37
jc/md/lp-01/05TTY_IT : présentation37 TTY_Close BOOL TTY_Close(DWORD hOpenContext) { // TODO: Inhiber l'IT Receiver Ready }// Fin TTY_Close
38
jc/md/lp-01/05TTY_IT : présentation38 TTY_IOControl (1) BOOL TTY_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) { switch(dwCode) {
39
jc/md/lp-01/05TTY_IT : présentation39 TTY_IOControl (2) case IOCTL_PUTC: // TODO: Attente transmetteur Ready // TODO: Envoi du caractère break;
40
jc/md/lp-01/05TTY_IT : présentation40 TTY_IOControl (3) case IOCTL_GETC: // TODO: Attente de lEvent hMonEvent // TODO: Écriture du caractère dans le buffer // de sortie. Le caractère lu sur IT est dans // ucBufIn, variable globale // TODO: Reset de lEVENT hMonEvent break;
41
jc/md/lp-01/05TTY_IT : présentation41 TTY_IOControl (4) }// Fin du switch // Informe lapplication quun caractère a été lu *pdwActualOut=1; return TRUE; }// Fin TTY_IOControl
42
jc/md/lp-01/05TTY_IT : présentation42 IST
43
jc/md/lp-01/05TTY_IT : présentation43 IST (1) DWORD TTYIST(void *p) { ISTDATA *pData; pData=(ISTDATA*)p; // TODO: Boucle tant que bAbort = FALSE { // TODO: Attente de lévénement associé à lIT // TODO: Traitement de l'interruption // TODO: Lecture du caractère reçu; // on le met dans ucBufIn
44
jc/md/lp-01/05TTY_IT : présentation44 IST (2) // TODO: Positionner hMonEvent pour prévenir // le driver // TODO: Informer lOS que lIT est traitée // InterruptDone }// Fin boucle return 0; }// Fin TTYIST
45
jc/md/lp-01/05TTY_IT : présentation45 Structure de lISR
46
jc/md/lp-01/05TTY_IT : présentation46 Création du projet ISR (1) Nommer Valider Choisir
47
jc/md/lp-01/05TTY_IT : présentation47 Création du projet ISR (2) Choisir Valider
48
jc/md/lp-01/05TTY_IT : présentation48 TTYISR.cpp
49
jc/md/lp-01/05TTY_IT : présentation49 Création de TTYISR.def Mettre le fichier TTYISR.def dans le projet par lune des méthodes déjà rencontrées –Création dun nouveau fichier de type texte sous Platform Builder (directement inséré dans le projet) –Création du fichier sous un éditeur de texte dans le répertoire TTYISR puis addition au projet
50
jc/md/lp-01/05TTY_IT : présentation50 TTYISR.def LIBRARY TTYISR EXPORTS ISRHandler IOControl
51
jc/md/lp-01/05TTY_IT : présentation51 ISR (1) #include "stdafx.h" #include // Définition de lIOCTL de communication driver/ISR #define IOCTL_VAL_SYSINTR \ CTL_CODE(FILE_DEVICE_UNKNOWN,2050,\ METHOD_BUFFERED,FILE_ANY_ACCESS)
52
jc/md/lp-01/05TTY_IT : présentation52 ISR (2) DWORD dwSYSINTR_A_Moi; // Entrée de l'ISR BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; }
53
jc/md/lp-01/05TTY_IT : présentation53 ISR (3) BOOL IOControl( DWORD InstanceIndex, DWORD IoControlCode, LPDWORD pInBuf, DWORD InBufSize, LPDWORD pOutBuf, DWORD OutBufSize, LPDWORD pBytesReturned) { switch(IoControlCode) {
54
jc/md/lp-01/05TTY_IT : présentation54 ISR (4) case IOCTL_VAL_SYSINTR: // TODO: Récupérer la valeur de // dwSYSINTR_A_Moi break; }// Fin switch // Informe lapplication quun caractère a été lu *pBytesReturned = 1; return TRUE; }// Fin IOControl
55
jc/md/lp-01/05TTY_IT : présentation55 ISR (5) DWORD ISRHandler(DWORD InstanceIndex) { //Test que IT bien active,status en 0x2F8 +5, RxRdy bit 0 __asm { mov dx,02FDh in al,dx and al,01h jnz it_a_moi } //it_pas_a_moi: return SYSINTR_CHAIN; it_a_moi: return dwSYSINTR_A_Moi; }
56
jc/md/lp-01/05TTY_IT : présentation56 Application
57
jc/md/lp-01/05TTY_IT : présentation57 Applicaton Application qui utilise le driver TTYIT_DRV Le programme est très simple, il doit : –Écrire un $ avec IOCTL_ PUTC –Boucler jusquà la réception du caractère ESCAPE (0x1B) Attendre la réception dun caractère avec IOCTL_GETC Envoyer lécho avec IOCTL_PUTC –Se terminer après la réception de ESCAPE
58
jc/md/lp-01/05TTY_IT : présentation58 Création de lapplication (1) Choisir New Project or File Choisir Nommer Valider
59
jc/md/lp-01/05TTY_IT : présentation59 Création de lapplication (2) Valider Choisir
60
jc/md/lp-01/05TTY_IT : présentation60 TTYIT_APP.cpp
61
jc/md/lp-01/05TTY_IT : présentation61 Application (1) // TODO: #include nécessaires // Définition des IOCTL #define IOCTL_PUTC \ CTL_CODE(FILE_DEVICE_UNKNOWN,2048,\ METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_GETC \ CTL_CODE(FILE_DEVICE_UNKNOWN,2049,\ METHOD_BUFFERED,FILE_ANY_ACCESS)
62
jc/md/lp-01/05TTY_IT : présentation62 Application (2) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // TODO: Initialisations et réservations // TODO: Chargement du driver // TODO: Ouverture du driver
63
jc/md/lp-01/05TTY_IT : présentation63 Application (3) // Envoi d'un $ // TODO: Appel de IOCTL_PUTC // TODO: Boucle tant que pas caractère Escape { // TODO: Appel de IOCTL_GETC // TODO: Appel de IOCTL_PUTC }// Fin boucle
64
jc/md/lp-01/05TTY_IT : présentation64 Application (4) // TODO: Déchargement du driver // TODO: Fermeture des handles }// WinMain
65
jc/md/lp-01/05TTY_IT : présentation65 Configuration pour lapplication Choisir Valider Choisir Settings…
66
jc/md/lp-01/05TTY_IT : présentation66 Configuration pour lISR Choisir Valider Choisir Settings… Vérifier
67
jc/md/lp-01/05TTY_IT : présentation67 Configuration pour le driver Choisir Valider Choisir Settings…
68
jc/md/lp-01/05TTY_IT : présentation68 Option pour la génération LISR doit être généré sans les « C Run Times » Il faut modifier les options pour lédition de lien pendant la génération
69
jc/md/lp-01/05TTY_IT : présentation69 Configuration de lédition de liens Choisir puis click droit Choisir
70
jc/md/lp-01/05TTY_IT : présentation70 Options de lédition de liens Modifier Choisir Valider
71
jc/md/lp-01/05TTY_IT : présentation71 Project Options pour lISR coredll.lib/nologo /base:"0x00100000" /base:"0x00100000" /stack:0x10000,0x1000/entry:"DllMain"/dll/incremental:no/pdb:"CEPC__X86Rel/TTYISR.pdb" /machine:IX86 /nodefaultlib:"OLDNAMES.lib" /nodefaultlib:"$(CENoDefaultLib)" /machine:IX86 /nodefaultlib:"OLDNAMES.lib" /nodefaultlib:"$(CENoDefaultLib)" /def:".\TTYISR.def" /out:"CEPC__X86Rel/TTYISR.dll" /implib:"CEPC__X86Rel/TTYISR.lib" /out:"CEPC__X86Rel/TTYISR.dll" /implib:"CEPC__X86Rel/TTYISR.lib" /subsystem:$(CESubsystem)
72
jc/md/lp-01/05TTY_IT : présentation72 Insertion dans le noyau Contrairement aux exécutables et aux drivers, lISR ne sexécute pas en mode user mais en mode superviseur Il faut empêcher le système dopérer des translations dadresse sur les zones de code et de données des ISR Pour obtenir ce résultat il faut préciser que lISR doit être dans une section « FILES » au lieu dune section « MODULES » dans les listes du fichier project.bib
73
jc/md/lp-01/05TTY_IT : présentation73 Insertion de lISR dans project.bib Choisir Dérouler Ouvrir (double clic) Vérifier (clic droit)
74
jc/md/lp-01/05TTY_IT : présentation74 Ajouter TTYISR.dll Bloc mémoire Options RépertoireNom du fichier
75
jc/md/lp-01/05TTY_IT : présentation75 Génération noyau et driver Il ny a plus qua faire le build … Et tester
76
jc/md/lp-01/05TTY_IT : présentation76 Debug Mettre le mode Debug et modifier les options –Platform Settings Build Options Cocher Enable Event Tracking During Boot Enable Full Kernel Mode Enable Kernel Debugger Enable Profiling Vérifier toutes les options –Platform Settings (Build avec ou sans image) –Project Settings (Link…)
77
jc/md/lp-01/05TTY_IT : présentation77 Options de débogage Choisir Ouvrir Mode Debug Choisir Valider Cocher les options
78
jc/md/lp-01/05TTY_IT : présentation78 Configuration pour lISR Choisir Valider Choisir Settings… Choisir
79
jc/md/lp-01/05TTY_IT : présentation79 Configuration pour lapplication Choisir Valider Choisir Settings…
80
jc/md/lp-01/05TTY_IT : présentation80 Configuration pour le driver Choisir Valider Choisir Settings…
81
jc/md/lp-01/05TTY_IT : présentation81 Configuration de lédition de liens Choisir puis click droit Choisir
82
jc/md/lp-01/05TTY_IT : présentation82 Options pour lédition de liens Choisir Valider Choisir Modifier
83
jc/md/lp-01/05TTY_IT : présentation83 Project Options pour lISR coredll.lib coredll.lib/nologo /base:"0x00100000" /base:"0x00100000" /stack:0x10000,0x1000/entry:"DllMain"/dll/incremental:no /pdb:"CEPC__X86Dbg/TTYISR.pdb« /pdb:"CEPC__X86Dbg/TTYISR.pdb« /debug /debug /machine:IX86 /nodefaultlib:"OLDNAMES.lib" /nodefaultlib:"$(CENoDefaultLib)" /machine:IX86 /nodefaultlib:"OLDNAMES.lib" /nodefaultlib:"$(CENoDefaultLib)" /def:".\TTYISR.def" /out:"CEPC__X86Dbg/TTYISR.dll" /implib:"CEPC__X86Dbg/TTYISR.lib" /out:"CEPC__X86Dbg/TTYISR.dll" /implib:"CEPC__X86Dbg/TTYISR.lib" /subsystem:$(CESubsystem)
84
jc/md/lp-01/05TTY_IT : présentation84 Kernel Debugger Utiliser le Kernel Debugger pour visualiser les interruptions Vérifier les numéros de process et de threads Examiner la chronologie des threads application, driver, ISR et IST Mesurer les temps dexécution
85
jc/md/lp-01/05TTY_IT : présentation85 Conclusion Nous avons : Réalisé un ensemble driver/ISR/IST pour gérer une interruption provenant du sérialiseur Réalisé une application recevant un caractère du sérialiseur avec une gestion par IT Examiné avec le Kernel Debugger les différents threads et leur chronologie
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.