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 : 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.

Présentations similaires


Présentation au sujet: "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."— Transcription de la présentation:

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

2 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

3 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

4 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

5 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

6 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

7 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

8 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

9 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

10 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

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

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

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

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

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

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

17 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

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

19 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

20 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

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

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

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

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

25 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

26 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

27 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)

28 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;

29 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;

30 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

31 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")));

32 jc/md/lp-01/05TTY_IT : corrigé32 TTY_INIT (2) // 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 WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x80); WRITE_PORT_UCHAR(IoPortBase+comDivisorLow, 0x0C); WRITE_PORT_UCHAR(IoPortBase+comDivisorHigh, 0x00);

33 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 16550 à 1 pour autoriser les IT // globalement // (pas indiqué dans la documentation du 16550 !)

34 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);

35 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; }

36 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; }

37 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; }

38 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; }

39 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);

40 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; }

41 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; }

42 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; }

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

44 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);

45 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

46 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);

47 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

48 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

49 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) {

50 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;

51 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;

52 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

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

54 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")));

55 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

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

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

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

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

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

61 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

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

63 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)

64 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

65 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)

66 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

67 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; }

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

69 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

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

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

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

73 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)

74 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;

75 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);

76 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; }

77 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);

78 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

79 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

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

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

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

83 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

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

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

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

87 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

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

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

90 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

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

92 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…)

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

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

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

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

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

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

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

100 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

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

102 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

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

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

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

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

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

108 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 »

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

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

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

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

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

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

115 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

116 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


Télécharger ppt "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."

Présentations similaires


Annonces Google