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