La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Jc/md/lp-01/05TTY_IT : présentation1 TTY_IT Présentation.

Présentations similaires


Présentation au sujet: "Jc/md/lp-01/05TTY_IT : présentation1 TTY_IT Présentation."— Transcription de la présentation:

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


Télécharger ppt "Jc/md/lp-01/05TTY_IT : présentation1 TTY_IT Présentation."

Présentations similaires


Annonces Google