Jc/md/lp-01/05TTY_IT : corrigé1 TTY_IT Corrigé. jc/md/lp-01/05TTY_IT : corrigé2 Objectif du chapitre Proposer une solution pour les exercices suggérés.

Slides:



Advertisements
Présentations similaires
Génération de plate-forme
Advertisements

Les procédures et interruptions en Assembleur (Tasm)
Journées académiques Microsoft 2005
Formation C débutant. Notion de compilation source.c executable Phase de compilation Fichier de texte brut, inexploitable directement par la machine Fichier.
Synchronisation des processus père - fils
OTB Analog module: Input configuration with TSX PREMIUM (TSXCPP110)
Formation CCNA 07- La commutation LAN. Sommaire 1) Concepts et fonctionnement 2) Commutateurs a - Présentation b - Démarrage c - Configuration de base.
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Plan du cours 5:Threads introduction Définition Création des Threads
Liste générique dans Linux 2.6 Source : Understanding the Linux kernel Chap3 processes p.87.
PILOTE - Sous Projet PILOTE SOUS-PROJET 5 Cyril Carrez, Elie Najm, Alexandre Tauveron.
Revision.
Driver de port parallèle
Jc/md/lp-01/06Threads1. jc/md/lp-01/06Threads2 Objectif du chapitre Génération dune application avec thread –Création dun thread –Identification dun thread.
jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours.
Jc/md/lp-01/05TTY_IT : présentation1 TTY_IT Présentation.
Jc/md/lp-01/06Applications1 Émulateur. jc/md/lp-01/06Applications2 Objectif du chapitre Génération dapplications –WCE Console Application –WCE Application.
Jc/md/lp-01/05Essai ligne série COM1 : présentation1 Essai ligne série CEPC Application écho sur COM1 Présentation.
Gestion mémoire : présentation
Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé
Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé
Driver UART en polling : présentation
Jc/md/lp-01/06Synchronisation1. jc/md/lp-01/06Synchronisation2 Objectif du chapitre Création dune application ayant plusieurs threads Synchronisations.
Driver de port parallèle
Jc/md/lp-01/06Kernel Tracker1 Debugging Kernel Tracker.
Jc/md/lp-01/05Principe des drivers1 Généralités sur les drivers Présentation.
Jc/md/lp-01/05Essai ligne série COM1 : corrigé1 Essai ligne série CEPC Application écho sur COM1 Présentation.
Driver UART en polling : corrigé
Jc/md/lp-01/05Driver élémentaire : corrigé1 Driver élémentaire Émulateur Corrigé
Jc/md/lp-01/05Trains_presentation1 Threads et Synchronisation Application train Présentation.
Jc/md/lp-01/05Boot Loader1 BOOT LOADER. jc/md/lp-01/05Boot Loader2 Objectif du chapitre Introduire la notion de Boot Loader Donner un aperçu de lorganisation.
Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.
Jc/md/lp-01/05Trains_corrigé1 Threads et Synchronisation Application train Corrigé
PARcours Individualisé de Formation (PAR.I.F.) présentation de la messagerie ICASSO.
Cours n°1 Présenté par : Aurélien Baillard Aboubacar Camara Sébastien Simon Jeremy Landre Brown Ebiémi.
Windows XP Professionnel
Windows XP Professionnel
Lexplorer de Windows XP. Lexploreur de Windows Mes disques = Tiroirs ? Lexplorer de Windows Mais, où ai-je rangé ce (fichu) fichier ? Mais quand ai-je.
© 2010 Agence Régionale de Santé 1/13 Messagerie Instantanée Support dauto-formation utilisateur.
High Frequency Trading Introduction. Séminaires de 30 minutes, une fois par semaine (8 en tout) Sujets abordés – Définition dun algorithme et introduction.
JDBC: manipuler une base de données en Java IFT6800 – E 2007 Jian-Yun Nie.
Petite introduction au logiciel de traitement statistique SPSS
DIBA p r o g i c i e l. DIBA est un progiciel dédié à la gestion: des compagnies dassurance. des cabinets de courtage Il est entièrement paramétrable.
Processworks / 3DQuikForm Présentation Denis AUGUSTE Lycée de Lorgues.
Introduction à la programmation (420-PK2-SL) cours 15 Gestion des applications Technologie de linformation (LEA.BW)
Connexion base de données
Programmation de cartes graphiques
Page 1 Introduction à ATEasy 3.0 Page 2 Quest ce quATEasy 3.0? n Ensemble de développement très simple demploi n Conçu pour développer des bancs de test.
TortoiseSVN N°. Subversion : pour quoi faire ? Avoir un espace de stockage commun – Tous les étudiants du SIGLIS ont un espace svn commun Partager vos.
Historique de SystemC Regroupe 4 courants didées: SCENIC Project : Synopsys+UC Irvine Philips System-Level Data Types, VSIA SLD DWG IMEC, Hardware-Software.
EPID-CPI-ISAIP Philippe Bancquart - mise à jour 24/02/ page 1 Procédures stockées CPI-SQLServer.
SQL Injection Réalisée par: BEN NASR Houssem GMATI Idriss HADDAD Mohamed Aymen HAKIM Youssef.
FICHIERS : Définition : Algorithme général:
Multi-Thread Jian-Yun Nie
IFT 6800 Atelier en Technologies d’information
OpenCV: Introduction au Traitement d’Images et Vidéo
Chapitre 9 Les sous-programmes.
Cours 11 Threads. Chapitre X threads threadPOO-L3 H. Fauconnier3 Threads threads: plusieurs activités qui coexistent et partagent des données exemples:
Introduction au Langage C
CSI2520 Le langage Scheme (2) Un langage de programmation fonctionnelle.
Mise à jour des Fichiers Redo Log
Créer des packages.
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
Programmation Système et Réseau
Démarrage Code Warrior. 31/07/2013JC/LP/MD2 Création d’une zone de travail Dans votre environnement personnel de travail, créer une directory Ex:TP_PPC_2013.
OAL OEM Adaptation Layer
Les variables fichiers. Le type fichier On manipule les fichiers par l’intermédiaire de structures FILE décrites dans stdio.h FILE *monFichier; –Nom physique.
PRO-1027 Programmation Scientifique en C
13/08/2013JC/LP/MD1 TP2 Enoncé. 13/08/2013JC/LP/MD2 Objectif Gérer la liaison série en polling Envoi d’un caractère § au démarrage Faire l’écho des caractères.
1 UNIX AVANCE Yves PAGNOTTE – Janvier – LES PROCESSUS SOUS UNIX.
Transcription de la présentation:

jc/md/lp-01/05TTY_IT : corrigé1 TTY_IT Corrigé

jc/md/lp-01/05TTY_IT : corrigé2 Objectif du chapitre Proposer une solution pour les exercices suggérés dans le chapitre IT_CE4.2_présentation É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

jc/md/lp-01/05TTY_IT : corrigé3 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

jc/md/lp-01/05TTY_IT : corrigé4 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

jc/md/lp-01/05TTY_IT : corrigé5 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

jc/md/lp-01/05TTY_IT : corrigé6 Synchronisation IST/DRIVER L IST va faire lacquisition du caractère reçu et le stockera dans un buffer 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

jc/md/lp-01/05TTY_IT : corrigé7 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

jc/md/lp-01/05TTY_IT : corrigé8 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

jc/md/lp-01/05TTY_IT : corrigé9 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

jc/md/lp-01/05TTY_IT : corrigé10 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

jc/md/lp-01/05TTY_IT : corrigé11 Retirer le port série (2) Dérouler jusquà Serial puis clic droit Cliquer

jc/md/lp-01/05TTY_IT : corrigé12 Configuration obtenue

jc/md/lp-01/05TTY_IT : corrigé13 DRIVER

jc/md/lp-01/05TTY_IT : corrigé14 Création du driver Dans File : Choisir New Project or File Nommer Choisir Valider

jc/md/lp-01/05TTY_IT : corrigé15 Choix du projet Valider Choisir

jc/md/lp-01/05TTY_IT : corrigé16 Fichier source obtenu

jc/md/lp-01/05TTY_IT : corrigé17 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

jc/md/lp-01/05TTY_IT : corrigé18 Création directe du fichier.def (1) Onglet Files Nommer Cocher Valider Choisir

jc/md/lp-01/05TTY_IT : corrigé19 TTYIT_DRV.def LIBRARY TTYIT_DRV EXPORTS TTY_Init TTY_Deinit TTY_Open TTY_Close TTY_IOControl

jc/md/lp-01/05TTY_IT : corrigé20 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

jc/md/lp-01/05TTY_IT : corrigé21 Insertion de TTYIT_DRV.def (2)

jc/md/lp-01/05TTY_IT : corrigé22 Insertion de TTYIT_DRV.def (3)

jc/md/lp-01/05TTY_IT : corrigé23 Structure du driver

jc/md/lp-01/05TTY_IT : corrigé24 Entête du driver (1) // #include nécessaires #include "stdafx.h" #include

jc/md/lp-01/05TTY_IT : corrigé25 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

jc/md/lp-01/05TTY_IT : corrigé26 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

jc/md/lp-01/05TTY_IT : corrigé27 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)

jc/md/lp-01/05TTY_IT : corrigé28 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;

jc/md/lp-01/05TTY_IT : corrigé29 Entête du driver (6) // Prototype de l'IST DWORD TTYIST(void *); DWORD dwSYSINTR_A_Moi; // Réservations diverses UCHAR ucBufIn; HANDLE hMonEvent; ISTDATA TTY_ISTData;

jc/md/lp-01/05TTY_IT : corrigé30 Entrée du driver BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; }// Fin DllMain

jc/md/lp-01/05TTY_IT : corrigé31 TTY_Init (1) DWORD TTY_Init(DWORD dwContext) { // Déclarations diverses DWORD Buf_In[1]; DWORD Buf_Out[1]; DWORD dwNbBytes; HANDLE hChain,hIstEvent; DWORD dwErrCode; RETAILMSG(1,(TEXT("TTY: TTY_Init\n")));

jc/md/lp-01/05TTY_IT : corrigé32 TTY_INIT (2) // Initialisation des registres du sérialiseur // pas d'IT sur Receiver Ready (sera fait dans Open) // 9600 bauds, 8 bits, pas de parité, DTR, RTS // pas de FIFO WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x80); WRITE_PORT_UCHAR(IoPortBase+comDivisorLow, 0x0C); WRITE_PORT_UCHAR(IoPortBase+comDivisorHigh, 0x00);

jc/md/lp-01/05TTY_IT : corrigé33 TTY_Init (3) WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x03); WRITE_PORT_UCHAR(IoPortBase+comFIFOControl, 0x00); WRITE_PORT_UCHAR(IoPortBase+comIntEnable, 0x00); // Mettre OUT2 du à 1 pour autoriser les IT // globalement // (pas indiqué dans la documentation du !)

jc/md/lp-01/05TTY_IT : corrigé34 TTY_Init (4) WRITE_PORT_UCHAR(IoPortBase+ comModemControl, 0x0B); // Récupération d'un numéro dIT logique Buf_In[0]=3; KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, Buf_In,4,Buf_Out,4,NULL); dwSYSINTR_A_Moi=Buf_Out[0]; RETAILMSG(1,(TEXT("dwSYSINTR_A_Moi: %d\n"), dwSYSINTR_A_Moi)); // Chaînage de l'ISR hChain=LoadIntChainHandler(_T("TTYISR.dll"), _T("ISRHandler"),ItPhysique);

jc/md/lp-01/05TTY_IT : corrigé35 TTY_Init (5) if(hChain==0) { RETAILMSG(1,(TEXT("TTY: erreur %d dans LoadIntChainHandler\n"),GetLastError())); return FALSE; }

jc/md/lp-01/05TTY_IT : corrigé36 TTY_Init (6) // Passage du numéro IT Logique à l'ISR Buf_In[0]=dwSYSINTR_A_Moi; dwErrCode=KernelLibIoControl(hChain,IOCTL_VAL_ SYSINTR,Buf_In,4,NULL,NULL,&dwNbBytes); if(dwErrCode==FALSE) { RETAILMSG(1,(TEXT("TTY: erreur %d dans KernelLibIoControl\n"),GetLastError())); return FALSE; }

jc/md/lp-01/05TTY_IT : corrigé37 TTY_Init (7) // Création de lévénement de lien pour lIST hIstEvent=CreateEvent(NULL,FALSE,FALSE,NULL); if(hIstEvent==0) { RETAILMSG(1,(TEXT("TTY: erreur %d dans CreateEvent (hIstEvent)\n"),GetLastError())); return FALSE; }

jc/md/lp-01/05TTY_IT : corrigé38 TTY_Init (8) // Création de lévénement de synchro IST/driver // Handle déclaré en variable globale : hMonEvent hMonEvent=CreateEvent(NULL,TRUE,FALSE,NULL); if(hMonEvent == 0) { RETAILMSG(1,(TEXT("TTY: erreur %d dans CreateEvent (hMonEvent)\n"),GetLastError())); return 0; }

jc/md/lp-01/05TTY_IT : corrigé39 TTY_Init (9) // Initialisation de la structure TTY_ISTData.hEvent=hIstEvent; TTY_ISTData.sysIntr=dwSYSINTR_A_Moi; TTY_ISTData.bAbort=FALSE; // Inhibition (Disable) de linterruption logique InterruptDisable(TTY_ISTData.sysIntr);

jc/md/lp-01/05TTY_IT : corrigé40 TTY_Init (10) // Création et démarrage du thread IST TTY_ISTData.hThread=CreateThread(NULL,0, &TTYIST,&TTY_ISTData,0,NULL); if(TTY_ISTData.hThread ==0) { RETAILMSG(1,(TEXT("TTY: erreur % d dans CreateThread (TTY_ISTData)\n"),GetLastError())); return 0; }

jc/md/lp-01/05TTY_IT : corrigé41 TTY_Init (11) // Connexion de lIT logique avec lévénement dwErrCode=InterruptInitialize(dwSYSINTR_A_Moi, TTY_ISTData.hEvent,NULL,0); if(dwErrCode==FALSE) { RETAILMSG(1,(TEXT("TTY: erreur %d dans InterruptInitialize\n"),GetLastError())); return 0; }

jc/md/lp-01/05TTY_IT : corrigé42 TTY_Init (12) // Mise en priorité maximale du thread dwErrCode=CeSetThreadPriority(TTY_ISTData.hThread,0); if(dwErrCode==FALSE) { RETAILMSG(1,(TEXT("TTY: erreur %d dans CeSetThreadPriority\n"),GetLastError())); return 0; }

jc/md/lp-01/05TTY_IT : corrigé43 TTY_Init (13) RETAILMSG(1,(TEXT("TTY: OK IT Init\n"))); return !0; }// Fin TTY_Init

jc/md/lp-01/05TTY_IT : corrigé44 TTY_Deinit (1) BOOL TTY_Deinit(DWORD hDeviceContext) { RETAILMSG(1,(TEXT("TTY: TTY_Deinit\n"))); // Mise du flag bAbort à TRUE pour arrêter l'IST TTY_ISTData.bAbort=TRUE; // Inhibition (Disable) de lIT logique : InterruptDisable InterruptDisable(TTY_ISTData.sysIntr);

jc/md/lp-01/05TTY_IT : corrigé45 TTY_Deinit (2) // Fermeture des handles CloseHandle(TTY_ISTData.hEvent); CloseHandle(TTY_ISTData.hThread); CloseHandle(hMonEvent); return TRUE; }// Fin TTY_Deinit

jc/md/lp-01/05TTY_IT : corrigé46 TTY_Open (1) DWORD TTY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { RETAILMSG(1,(TEXT("TTY: TTY_Open\n"))); // Initialisations complémentaires du périphérique // Vidage du buffer de réception si nécessaire while((READ_PORT_UCHAR(IoPortBase+ comLineStatus)&LS_RX_DATA_READY)==1) READ_PORT_UCHAR(IoPortBase+comRxBuffer);

jc/md/lp-01/05TTY_IT : corrigé47 TTY_Open (2) // Autoriser l'IT Receiver Ready WRITE_PORT_UCHAR(IoPortBase+comIntEnable, 0x01); return !0; }// Fin TTY_Open

jc/md/lp-01/05TTY_IT : corrigé48 TTY_Close BOOL TTY_Close(DWORD hOpenContext) { RETAILMSG(1,(TEXT("TTY: TTY_Close\n"))); // Inhibition de l'IT Receiver Ready WRITE_PORT_UCHAR(IoPortBase+comIntEnable, 0x0); return TRUE; }// Fin TTY_Close

jc/md/lp-01/05TTY_IT : corrigé49 TTY_IOControl (1) BOOL TTY_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) { switch(dwCode) {

jc/md/lp-01/05TTY_IT : corrigé50 TTY_IOControl (2) case IOCTL_PUTC: // Attente transmetteur Ready while(!(READ_PORT_UCHAR(IoPortBase+ comLineStatus)& LS_THR_EMPTY)) ; // Envoi du caractère WRITE_PORT_UCHAR(IoPortBase+ comTxBuffer,pBufIn[0]); break;

jc/md/lp-01/05TTY_IT : corrigé51 TTY_IOControl (3) case IOCTL_GETC: // Attente de lEvent hMonEvent WaitForSingleObject(hMonEvent,INFINITE); // Écriture du caractère dans le buffer // de sortie. Le caractère lu sur IT est dans // ucBufIn, variable globale pBufOut[0]=ucBufIn; // Reset de lEVENT hMonEvent ResetEvent(hMonEvent); break;

jc/md/lp-01/05TTY_IT : corrigé52 TTY_IOControl (4) }// Fin switch // Informe lapplication quun caractère a été lu *pdwActualOut=1; return TRUE; }// Fin TTY_IOControl

jc/md/lp-01/05TTY_IT : corrigé53 IST

jc/md/lp-01/05TTY_IT : corrigé54 IST (1) DWORD TTYIST(void *p) { ISTDATA *pData; pData=(ISTDATA*)p; // Boucle tant que bAbort = FALSE while(!pData->bAbort) { // Attente de lévénement associé à lIT WaitForSingleObject(pData->hEvent,INFINITE); if(pData->bAbort) break; RETAILMSG(1,(TEXT("MIRACLE IT\n")));

jc/md/lp-01/05TTY_IT : corrigé55 IST (2) // Traitement de l'interruption // Lecture du caractère reçu; on le met dans ucBufIn ucBufIn=READ_PORT_UCHAR(IoPortBase+ comRxBuffer); // Positionner hMonEvent pour prévenir le driver SetEvent(hMonEvent); // Informer lOS que lIT est traitée : InterruptDone InterruptDone(pData->sysIntr); }// Fin boucle

jc/md/lp-01/05TTY_IT : corrigé56 IST (3) RETAILMSG(1,(TEXT("Fin TTYIST\n"))); return 0; }// Fin TTYIST

jc/md/lp-01/05TTY_IT : corrigé57 Structure de lISR

jc/md/lp-01/05TTY_IT : corrigé58 Création du projet ISR (1) Nommer Valider Choisir

jc/md/lp-01/05TTY_IT : corrigé59 Création du projet ISR (2) Choisir Valider

jc/md/lp-01/05TTY_IT : corrigé60 TTYISR.cpp

jc/md/lp-01/05TTY_IT : corrigé61 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

jc/md/lp-01/05TTY_IT : corrigé62 TTYISR.def LIBRARY TTYISR EXPORTS ISRHandler IOControl

jc/md/lp-01/05TTY_IT : corrigé63 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)

jc/md/lp-01/05TTY_IT : corrigé64 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; }// Fin DllMain

jc/md/lp-01/05TTY_IT : corrigé65 ISR (3) BOOL IOControl( DWORD InstanceIndex, DWORD IoControlCode, LPDWORD pInBuf, DWORD InBufSize, LPDWORD pOutBuf, DWORD OutBufSize, LPDWORD pBytesReturned) { switch(IoControlCode)

jc/md/lp-01/05TTY_IT : corrigé66 ISR (4) { case IOCTL_VAL_SYSINTR: // Récupération de la valeur de // dwSYSINTR_A_Moi dwSYSINTR_A_Moi=pInBuf[0]; break; }// Fin switch // Informe lapplication quun caractère a été lu *pBytesReturned = 1; return TRUE; }// Fin IOControl

jc/md/lp-01/05TTY_IT : corrigé67 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; }

jc/md/lp-01/05TTY_IT : corrigé68 Application

jc/md/lp-01/05TTY_IT : corrigé69 Applicaton Application qui utilise le driver TTYIT_DRV Le programme est très simple, il doit : –Écrire un $ avec IOCTL_ PUTC –Attendre la réception dun caractère avec IOCTL_GETC –Envoyer lécho avec IOCTL_PUTC –Boucler jusquà la réception du caractère ESCAPE (0x1B) –Se terminer après la réception de ESCAPE

jc/md/lp-01/05TTY_IT : corrigé70 Création de lapplication (1) Choisir New Project or File Choisir Nommer Valider

jc/md/lp-01/05TTY_IT : corrigé71 Création de lapplication (2) Valider Choisir

jc/md/lp-01/05TTY_IT : corrigé72 TTYIT_APP.cpp

jc/md/lp-01/05TTY_IT : corrigé73 Application (1) // #include nécessaires #include "stdafx.h" #include // 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)

jc/md/lp-01/05TTY_IT : corrigé74 Application (2) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { // Initialisations et réservations HANDLE hDevice,hTTY; UCHAR carac[4]; DWORD dwNb;

jc/md/lp-01/05TTY_IT : corrigé75 Application (3) // Chargement du driver qui retourne un handle hDevice hDevice=RegisterDevice(TEXT("TTY"),1, TEXT("TTYIT_DRV.dll"),NULL); if(hDevice==INVALID_HANDLE_VALUE) { MessageBox(NULL,_T("PB Register TTY1:"), _T("TTYApp"),MB_OK); return 0; } MessageBox(NULL,_T("Register TTY1 OK:"), _T("TTYApp"),MB_OK);

jc/md/lp-01/05TTY_IT : corrigé76 Application (4) // Ouverture du driver avec retour du HANDLE hTTY hTTY=CreateFile(TEXT("TTY1:"),GENERIC_READ| GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); if(hTTY==INVALID_HANDLE_VALUE) { MessageBox(NULL,_T("Pb Open TTY1:"), _T("TTYApp"),MB_OK); DeregisterDevice(hDevice); CloseHandle(hDevice); return 0; }

jc/md/lp-01/05TTY_IT : corrigé77 Application (5) // Envoi d'un caractère $ carac[0]=0x24; // Appel de IOCTL_PUTC DeviceIoControl(hTTY,IOCTL_PUTC,carac,1, carac,1,&dwNb,NULL);

jc/md/lp-01/05TTY_IT : corrigé78 Application (6) // Boucle tant que le caractère n'est pas Escape while(carac[0] != 0x1B) { // Appel de IOCTL_GETC DeviceIoControl(hTTY,IOCTL_GETC,carac,1, carac,1,&dwNb,NULL); // Appel de IOCTL_PUTC DeviceIoControl(hTTY,IOCTL_PUTC,carac,1, carac,1,&dwNb,NULL); }// Fin boucle

jc/md/lp-01/05TTY_IT : corrigé79 Application (7) MessageBox(NULL,_T("OK pour finir"), _T("TTYApp"),MB_OK); // Déchargement du driver // Fermeture des handles CloseHandle(hTTY); DeregisterDevice(hDevice); CloseHandle(hDevice); return 0; }// WinMain

jc/md/lp-01/05TTY_IT : corrigé80 Configuration pour lapplication Choisir Valider Choisir Settings…

jc/md/lp-01/05TTY_IT : corrigé81 Configuration pour lISR Choisir Valider Choisir Settings… Vérifier

jc/md/lp-01/05TTY_IT : corrigé82 Configuration pour le driver Choisir Valider Choisir Settings…

jc/md/lp-01/05TTY_IT : corrigé83 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

jc/md/lp-01/05TTY_IT : corrigé84 Configuration de lédition de liens Choisir puis click droit Choisir

jc/md/lp-01/05TTY_IT : corrigé85 Options de lédition de liens Modifier Choisir Valider

jc/md/lp-01/05TTY_IT : corrigé86 Project Options pour lISR coredll.lib/nologo /base:"0x " /base:"0x " /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)

jc/md/lp-01/05TTY_IT : corrigé87 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

jc/md/lp-01/05TTY_IT : corrigé88 Insertion de lISR dans project.bib Choisir Dérouler Ouvrir (double clic) Vérifier (clic droit)

jc/md/lp-01/05TTY_IT : corrigé89 Ajouter TTYISR.dll Bloc mémoire Options RépertoireNom du fichier

jc/md/lp-01/05TTY_IT : corrigé90 Génération Il ny a plus quà faire la génération du système avec son driver pour la ligne série et lapplication Puis tester : –Télécharger dans la cible le noyau et son driver –Exécuter lapplication –Observer laffichage du caractère $ –Observer lécho des frappes sur le clavier –Sortir de lapplication par la frappe du caractère escape

jc/md/lp-01/05TTY_IT : corrigé91 Debug

jc/md/lp-01/05TTY_IT : corrigé92 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…)

jc/md/lp-01/05TTY_IT : corrigé93 Options de débogage Mode Debug Choisir Cocher les options Valider Ouvrir Choisir

jc/md/lp-01/05TTY_IT : corrigé94 Configuration pour lISR Choisir Valider Choisir Settings… Choisir

jc/md/lp-01/05TTY_IT : corrigé95 Configuration pour lapplication Choisir Valider Choisir Settings…

jc/md/lp-01/05TTY_IT : corrigé96 Configuration pour le driver Choisir Valider Choisir Settings…

jc/md/lp-01/05TTY_IT : corrigé97 Configuration de lédition de liens Choisir puis click droit Choisir

jc/md/lp-01/05TTY_IT : corrigé98 Options pour lédition de liens Choisir Valider Choisir Modifier

jc/md/lp-01/05TTY_IT : corrigé99 Project Options pour lISR coredll.lib coredll.lib/nologo /base:"0x " /base:"0x " /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)

jc/md/lp-01/05TTY_IT : corrigé100 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

jc/md/lp-01/05TTY_IT : corrigé101 Exécution de lapplication Repérer les paramètres

jc/md/lp-01/05TTY_IT : corrigé102 Paramètres PID TTYIT_APP43a084fa TID TTYIT_APP43a084ca PID TTYIT_DRVe3ba39e2 TID TTYIT_DRV43a084ca dwSYSINTR_A_Moi16

jc/md/lp-01/05TTY_IT : corrigé103 Lancement du Kernel Tracker Choisir

jc/md/lp-01/05TTY_IT : corrigé104 État avant dentrer un caractère

jc/md/lp-01/05TTY_IT : corrigé105 Après frappe sur le clavier (IT)

jc/md/lp-01/05TTY_IT : corrigé106 Quand lIST fonctionne Repérer les paramètres

jc/md/lp-01/05TTY_IT : corrigé107 Paramètres IST PID IST eba39e2 TID IST 839e5f02

jc/md/lp-01/05TTY_IT : corrigé108 Recherche de lIT 16 Arrêter le défilement avec icône | Déplacer le curseur pour trouver une IT 16 active Adapter la « Zoom Range »

jc/md/lp-01/05TTY_IT : corrigé109 IT 16

jc/md/lp-01/05TTY_IT : corrigé110 IST : set hMonEvent Thread IST

jc/md/lp-01/05TTY_IT : corrigé111 IST : attente de hMonEvent

jc/md/lp-01/05TTY_IT : corrigé112 Application et driver reset de hMonEvent

jc/md/lp-01/05TTY_IT : corrigé113 Application et driver attente de hMonEvent

jc/md/lp-01/05TTY_IT : corrigé114 Arrivée de lIT

jc/md/lp-01/05TTY_IT : corrigé115 Mesure des temps IT IST :0,2 ms Durée IST :3,2 ms Durée application : 1,3 ms

jc/md/lp-01/05TTY_IT : corrigé116 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