Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parAlveré Quere Modifié depuis plus de 10 années
2
jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours
3
jc/md/lp-01/05IT CE4.2 : cours2 Objectif du chapitre Présentation des notions nécessaires pour aborder le traitement des interruptions dans lexemple traité dans le chapitre suivant Organisation générale des interruptions sous Windows CE Étude des composants principaux –Handler –ISR –IST –Fonctions utiles
4
jc/md/lp-01/05IT CE4.2 : cours3 Éléments mis en jeu pour le traitement des interruptions (1) I/O Routines OEM Hardware ISROAL Routines OAL Exception Handler Interrupt Support Handler Kernel IST Driver
5
jc/md/lp-01/05IT CE4.2 : cours4 Éléments mis en jeu pour le traitement des interruptions (2) Hardware –Contient le périphérique qui va générer linterruption OAL –ISR (Interrupt Service Routine) fournit une information sur la façon de traiter lIT –Routines de base : OEMInterruptDisable, OEMInterruptEnable … –Gestion des I/O physiques
6
jc/md/lp-01/05IT CE4.2 : cours5 Éléments mis en jeu pour le traitement des interruptions (3) KERNEL (noyau) –Exception Handler –Interrupt Support Handler DRIVER –Fonctions classiques du driver –IST Interrupt Service Thread : thread haute priorité qui réalise les opérations liées à lIT
7
jc/md/lp-01/05IT CE4.2 : cours6 Principe des interruptions Composants logiciels spécifiques pour gérer les interruptions –ISR : Interrupt Service Routine Code très court Retourne un numéro logique dIT –IST : Interrupt Service Thread Traite linterruption
8
jc/md/lp-01/05IT CE4.2 : cours7 Déroulement du traitement (1) Une IT physique se produit Le gestionnaire dexception lance lISR associé à cette interruption LISR retourne un code prédéfini au noyau pour lui indiquer le traitement à faire Le noyau positionne un événement associé LIST en attente de cet événement est activé
9
jc/md/lp-01/05IT CE4.2 : cours8 Déroulement du traitement (2) La fonction PeRPISR est lISR associé à chaque interruption physique lors de linitialisation du système dinterruption (fonction HookInterrupt) PeRPISR récupère le numéro physique dinterruption (fonction PICGetCurrentInterrupt) Les niveaux 0 (timer) et 1 (horloge temps réel) sont traités immédiatement Pour les autres niveaux valides, PeRPISR appelle la fonction NKCallIntChain
10
jc/md/lp-01/05IT CE4.2 : cours9 Déroulement du traitement (3) NKCallIntChain utilise le numéro dinterruption pour trouver dans une table le point dentrée dune liste chaînée conduisant à un code de retour Code de retour en fin de chaîne : –SYSINTR_CHAIN : quand linterruption nest concernée par aucun des ISR de la chaîne –SYSINTR_NOP : rien à faire –SYSINTR_UNDEFINED : non initialisé dans la table –Valeur prédéfinie valide (ex : SYSINTR_A_MOI)
11
jc/md/lp-01/05IT CE4.2 : cours10 Déroulement du traitement (4) Fin de lISR après réception du code de retour –SYSINTR_NOP ou SYSINTR_UNDEFINED ou Code invalide retour au noyau avec un code SYSINTR_NOP –Code valide fermeture de la source dinterruption dans le PIC (ou les PICs) puis envoi du code au noyau –SYSINTR_CHAIN interruption sur un niveau non partagé. Conversion de lIT physique en IT logique (fonction OEMTranslateIrq) et envoi au noyau du numéro dIT logique
12
jc/md/lp-01/05IT CE4.2 : cours11 Déroulement du traitement (5) Retour au noyau Différentes actions en fonction du code retourné : –Ne rien faire –Faire le traitement standard de lIT –Armer un événement particulier suivant le code de retour pour déclencher lexécution dun IST
13
jc/md/lp-01/05IT CE4.2 : cours12 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 au niveau de la source
14
jc/md/lp-01/05IT CE4.2 : cours13 Arrivée de la demande dIT I/O Routines OEM Hardware ISROAL Routines OAL Exception Handler Interrupt Support Handler Kernel IST Driver 1
15
jc/md/lp-01/05IT CE4.2 : cours14 Envoi de OEMInterruptDisable I/O Routines OEM Hardware ISROAL Routines OAL Exception Handler Interrupt Support Handler Kernel IST Driver 2
16
jc/md/lp-01/05IT CE4.2 : cours15 Appel des ISR associés au niveau d IT traitée I/O Routines OEM Hardware ISROAL Routines OAL Exception Handler Interrupt Support Handler Kernel IST Driver 3
17
jc/md/lp-01/05IT CE4.2 : cours16 Retour du numéro dIT logique I/O Routines OEM Hardware ISROAL Routines OAL Exception Handler Interrupt Support Handler Kernel IST Driver 4
18
jc/md/lp-01/05IT CE4.2 : cours17 Positionnement de lEvent associé à lIST I/O Routines OEM Hardware ISROAL Routines OAL Exception Handler Interrupt Support Handler Kernel IST Driver 5
19
jc/md/lp-01/05IT CE4.2 : cours18 Réveil de lIST I/O Routines OEM Hardware ISROAL Routines OAL Exception Handler Interrupt Support Handler Kernel IST Driver 6
20
jc/md/lp-01/05IT CE4.2 : cours19 Opérations sur la périphérie I/O Routines OEM Hardware ISROAL Routines OAL Exception Handler Interrupt Support Handler Kernel IST Driver 7
21
jc/md/lp-01/05IT CE4.2 : cours20 Envoi de InterruptDone I/O Routines OEM Hardware ISROAL Routines OAL Exception Handler Interrupt Support Handler Kernel IST Driver 8
22
jc/md/lp-01/05IT CE4.2 : cours21 Envoi de OEMInterruptDone I/O Routines OEM Hardware ISROAL Routines OAL Exception Handler Interrupt Support Handler Kernel IST Driver 9
23
jc/md/lp-01/05IT CE4.2 : cours22 Rappel I/O Routines OEM Hardware ISROAL Routines OAL Exception Handler Interrupt Support Handler Kernel IST Driver 1 3 4 9 5 7 6 2 8
24
jc/md/lp-01/05IT CE4.2 : cours23 SYSINTR logique (1) Une interruption logique SYSINTR est associée à une interruption physique À un même niveau dinterruption physique peuvent être associés plusieurs numéros logiques (IT partagée) On donne à la fonction KernelIoControl un numéro physique dIT et elle renvoie un numéro logique KernelIoControl peut aussi libérer une SYSINTR
25
jc/md/lp-01/05IT CE4.2 : cours24 SYSINTR logique (2) KernelIoControl fonctionne suivant un code IOCTL donné en paramètre –IOCTL_HAL_REQUEST_SYSINTR pour associer une SYSINTR à une IT physique –IOCTL_HAL_RELEASE_SYSINTR pour libérer une SYSINTR –Beaucoup dautres possibilités inutiles pour notre exemple
26
jc/md/lp-01/05IT CE4.2 : cours25 KernelIoControl (1) BOOL KernelIoControl( DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned); Paramètres : dwIoControlCode : IOCTL utilisé lpInBuf : adresse du buffer dentrée
27
jc/md/lp-01/05IT CE4.2 : cours26 KernelIoControl (2) nInBufSize : longueur du buffer dentrée lpOutBuf : adresse du buffer de sortie nOutBufSize : longueur du buffer de sortie lpBytesReturned : adresse où trouver le nombre de caractères réellement placés dans le buffer de sortie, NULL dans notre exemple Valeur retournée : True pour une réussite, False pour un échec
28
jc/md/lp-01/05IT CE4.2 : cours27 KernelIoControl exemple DWORD Buf_In[1]; DWORD Buf_Out[1]; DWORD SYSINTR_A_MOI; Buf_In[0]=3; // IT physique numéro 3 KernelIoControl (IOCTL_HAL_REQUEST_SYSINTR, Buf_In,4,Buf_Out,4,NULL); SYSINTR_A_MOI=Buf_Out[0]; // IT logique
29
jc/md/lp-01/05IT CE4.2 : cours28 Passage de paramètres driver ISR Il peut être nécessaire de passer des paramètres entre le driver et lISR Si le driver obtient un numéro dIT logique de manière dynamique, il est nécessaire de donner ce numéro à lISR qui doit le renvoyer au système sil est concerné par cette interruption. La fonction KernelLibIoControl permet cela KernelLibIoControl appelle la fonction IoControl qui traite les IOCTL de lISR
30
jc/md/lp-01/05IT CE4.2 : cours29 KernelLibIoControl (1) BOOL KernelLibIoControl( HANDLE hModule, DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned );
31
jc/md/lp-01/05IT CE4.2 : cours30 KernelLibIoControl (2) Parameters: hModule [in] Handle returned from the LoadIntChainHandler function. LoadIntChainHandler dwIoControlCode [in] OEM or ISV specified IOCTL. lpInBuf [in] Long pointer to a buffer that contains the data required to perform the operation. This parameter can be NULL … nInBufSize [in] Size, in bytes, of the buffer pointed to by lpInBuffer.
32
jc/md/lp-01/05IT CE4.2 : cours31 KernelLibIoControl (3) lpOutBuf [out] Long pointer to a buffer that receives the operation's output data. This parameter can be NULL... nOutBufSize [in] Size, in bytes, of the buffer pointed to by lpOutBuffer. lpBytesReturned [out] Long pointer to a variable that receives the size, in bytes, of the data stored into the buffer pointed to by lpOutBuffer. The lpBytesReturned parameter cannot be NULL.
33
jc/md/lp-01/05IT CE4.2 : cours32 KernelLibIoControl (4) Return Values If the function succeeds, then TRUE is returned; otherwise, FALSE is returned.
34
jc/md/lp-01/05IT CE4.2 : cours33 IoControl (1) Cette fonction de lISR permet de traiter les différents IOCTL de configuration de lISR (par exemple envoi du numéro logique SYSINTR ) Appelée par KernelLibIoControl Permet la communication dinformations entre ISR et le driver
35
jc/md/lp-01/05IT CE4.2 : cours34 IoControl (2) BOOL IOControl( DWORD dwInst, DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned );
36
jc/md/lp-01/05IT CE4.2 : cours35 IoControl (3) Parameters dwInst [in] Value that identifies the instance of the ISR handler. dwIoControlCode [in] Specifies the control code for the operation. This value identifies the specific operation to be performed and the type of device on which to perform it.
37
jc/md/lp-01/05IT CE4.2 : cours36 IoControl (4) lpInBuf [in] Pointer to a buffer that contains the data required to perform the operation. This parameter can be NULL if the dwIoControlCode parameter specifies an operation that does not require input data. nInBufSize [in] Specifies the size, in bytes, of the buffer pointed to by lpInBuffer. lpOutBuf [out] Pointer to a buffer that receives the operation's output data. This parameter can be NULL if the dwIoControlCode…
38
jc/md/lp-01/05IT CE4.2 : cours37 IoControl (5) nOutBufSize [in] Specifies the size, in bytes, of the buffer pointed to by lpOutBuffer. lpBytesReturned [out] Pointer to a variable that receives the size, in bytes, of the data stored in the buffer pointed to by lpOutBuffer. If the output buffer is too small to return any data, then the call fails, the GetLastError function returns the ERROR_INSUFFICIENT_BUFFER error code, and the returned byte count is zero.GetLastError
39
jc/md/lp-01/05IT CE4.2 : cours38 IoControl (6) If the output buffer can only hold some data, then the call fails, the operating system (OS) returns as much information as it can, GetLastError returns the ERROR_MORE_DATA error code, and lpBytesReturned indicates the amount of data returned. Your application should then call the DeviceIoControl function again with the same operation, specifying a new starting point. DeviceIoControl Return Values If the function succeeds, then TRUE is returned; otherwise, FALSE is returned.
40
jc/md/lp-01/05IT CE4.2 : cours39 Liaison DRIVER IST Le driver va lancer lIST par un CreateThread et lui passer une structure avec des paramètres –Handle de lIST –Numéro dIT logique –Evénement associé à lIST (auto Reset) –Flag de fin dutilisation En cas de besoin il est possible de synchroniser une des fonctions du driver avec un Event local positionné par l IST qui signale que lIST a traité linterruption
41
jc/md/lp-01/05IT CE4.2 : cours40 Fonctions du driver Driver Init Driver Deinit Driver Open Driver Close Driver IoControl Etc.
42
jc/md/lp-01/05IT CE4.2 : cours41 Driver Init Initialisation du périphérique ISR –Chargement et chaînage de lISR –Passage de paramètres à lISR IST –Création du thread IST –Création dun Event associé à lIST –Inhibition (Disable) du niveau dIT logique –Liaison IT logique Event –Mise de lIST en bonne priorité
43
jc/md/lp-01/05IT CE4.2 : cours42 Driver Deinit Signaler larrêt du driver à lIST (flag Abort) Inhiber (Disable) le niveau dIT Fermeture de tous les handles ouverts
44
jc/md/lp-01/05IT CE4.2 : cours43 Driver Open Fin de linitialisation du périphérique Armement des interruptions du périphérique
45
jc/md/lp-01/05IT CE4.2 : cours44 Driver Close Inhibition (Disable) des interruptions du périphérique
46
jc/md/lp-01/05IT CE4.2 : cours45 Driver IoControl Exécution des différentes commandes IOCTL
47
jc/md/lp-01/05IT CE4.2 : cours46 Exemple (1) Pour les exemples nous supposons gérer une ligne série Noms utilisés : –Driver : TTYIT_DRV.dll (avec lIST : TTYIST) –Handle de lIST : hThr –Event associé : ISTEvent –Handle ISR : hChain –ISR : TTYISR.dll (point dentrée : ISRHandler)
48
jc/md/lp-01/05IT CE4.2 : cours47 Exemple (2) –Structure dinformation à passer à lIST : TTYIST_Data –IT physique : ItPhy=3 –IT logique : SYSINTR_A_MOI
49
jc/md/lp-01/05IT CE4.2 : cours48 Fonctions utilisées LoadIntChainHandler CreateThread CreateEvent InterruptDisable InterruptInitialize CeSetThreadPriority
50
jc/md/lp-01/05IT CE4.2 : cours49 Chaînage de lISR (1) HANDLE LoadIntChainHandler( LPCWSTR lpFilename, LPCWSTR lpszFunctionName, BYTE bIRQ ); Parameters lpFilename [out] Pointer to a null-terminated string that names the DLL executable module. lpszFunctionName [in] Name of the interrupt handler entry point.
51
jc/md/lp-01/05IT CE4.2 : cours50 Chaînage de lISR (2) bIRQ [in] IRQ value that is used to identify which interrupt the installed ISR will service. Return Values If the function succeeds, then a valid handle to the installed handler is returned; otherwise, NULL is returned. Exemple HANDLE hChain; hChain=LoadIntChainHandler(_T("TTYISR.dll"), _T("ISRHandler"),ItPhy);
52
jc/md/lp-01/05IT CE4.2 : cours51 Création du thread IST (1) HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); Parameters lpThreadAttributes [in] Ignored. Must be NULL.
53
jc/md/lp-01/05IT CE4.2 : cours52 Création du thread IST (2) dwStackSize [in] Ignored unless… pour nous ignoré : 0. lpStartAddress [in] Long pointer to the application-defined function of type LPTHREAD_START_ROUTINE to be executed by the thread and represents the starting address of the thread. For more information on the thread function, see ThreadProc.ThreadProc lpParameter [in] Long pointer to a single 32-bit parameter value passed to the thread.
54
jc/md/lp-01/05IT CE4.2 : cours53 Création du thread IST (3) dwCreationFlags [in] Specifies flags that control the creation of the thread. Value Description : CREATE_SUSPENDED.The thread is created in a suspended state and will not run until the ResumeThread function is called. The thread can be run immediately after creation if the flag is not specified. STACK_SIZE_PARAM_IS_A_RESERVATION.The dwStackSize parameter specified the maximum stack size instead of being ignored. ResumeThread
55
jc/md/lp-01/05IT CE4.2 : cours54 Création du thread IST (4) lpThreadId [out] Long pointer to a 32-bit variable that receives the thread identifier. If this parameter is NULL, the thread identifier is not returned. Return Values A handle to the new thread indicates success. NULL indicates failure. To get extended error information, call GetLastError. GetLastError
56
jc/md/lp-01/05IT CE4.2 : cours55 Création dun EVENT (1) HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPTSTR lpName ); Parameters lpEventAttributes [in] Ignored. Must be NULL. bManualReset [in] Boolean that specifies whether a manual-reset or auto-reset event object is created. Etc.
57
jc/md/lp-01/05IT CE4.2 : cours56 Création dun EVENT (2) bInitialState [in] Boolean that specifies the initial state of the event object. If TRUE, the initial state is signaled; otherwise, it is nonsignaled. lpName [in] Pointer to a null-terminated string that specifies the name of the event object. Etc. If lpName is NULL, the event object is created without a name. Etc. Return Values A handle to the event object indicates success. Etc.
58
jc/md/lp-01/05IT CE4.2 : cours57 Liaison IT logique EVENT (1) La fonction InterruptInitialize réalise plusieurs opérations : Initialisation de linterruption Autorisation (Enable) de linterruption Association de linterruption à un événement (EVENT) qui servira à réveiller lIST
59
jc/md/lp-01/05IT CE4.2 : cours58 Liaison IT logique EVENT (2) BOOL InterruptInitialize( DWORD idInt, HANDLE hEvent, LPVOID pvData, DWORD cbData ); Parameters idInt [in] Interrupt identifier to be associated with this interrupt service thread (IST).
60
jc/md/lp-01/05IT CE4.2 : cours59 Liaison IT logique EVENT (3) hEvent [in] Event to be signaled when the interrupt is triggered. pvData [in] This parameter can be used as a pointer to a block of data that is passed to OEMInterruptEnable. The block of data may be initialization data, scratch space, and so on.OEMInterruptEnable cbData [in] Size of data pointed to by pvData.
61
jc/md/lp-01/05IT CE4.2 : cours60 Liaison IT logique EVENT (4) Return Values TRUE indicates success; FALSE indicates failure. Exemple InterruptInitialize(SYSINTR_A_MOI,ISTEvent,NULL,0);
62
jc/md/lp-01/05IT CE4.2 : cours61 Inhibition (Disable) de lIT VOID InterruptDisable( DWORD idInt ); Parameters idInt [in] Identifier of an interrupt. Return Values None. Remarque : il y a aussi suppression du lien avec lEVENT associé Exemple DWORD SYSINTR_A_MOI; InterruptDisable(SYSINTR_A_MOI);
63
jc/md/lp-01/05IT CE4.2 : cours62 Affectation de priorité à lIST (1) BOOL CeSetThreadPriority( HANDLE hThread, int nPriority); Parameters hThread [in] Handle to a thread. nPriority [in] Priority to set for the thread. This value can range from 0 (zero) through 255, with zero as the highest priority.
64
jc/md/lp-01/05IT CE4.2 : cours63 Affectation de priorité à lIST (2) Return Values TRUE indicates success. FALSE indicates failure. To get extended error information, call GetLastError.GetLastError Exemple HANDLE hThr; hTHR=… CeSetThreadPriority(hThr, 0);
65
jc/md/lp-01/05IT CE4.2 : cours64 Structure passée à lIST typedef struct _ISTDATA { HANDLE hThread; // IST Handle DWORD sysIntr; // Logical ID HANDLE hEvent; // handle to the event volatile BOOL abort; // flag de fin }ISTDATA; ISTDATA TTY_ISTData;
66
jc/md/lp-01/05IT CE4.2 : cours65 Initialisation de TTYIST_Data Exemple: TTTYIST_ Data.hThread = hThr; TTTYIST_ Data.sysIntr = SYSINTR_A_MOI; TTTYIST_ Data.hEvent = ISTEvent; TTTYIST_ Data.abort = FALSE;
67
jc/md/lp-01/05IT CE4.2 : cours66 IST typique DWORD TTYIST(void *dat) { ISTDATA *pData = (ISTDATA*)dat; while(!pData->abort) //actif tant que abort = FALSE { WaitForSingleObject(pData->hEvent,INFINITE); // EVENT ? if(pData->abort) break; // Traitement de lIT … InterruptDone(pData->sysIntr); } return 0; }
68
jc/md/lp-01/05IT CE4.2 : cours67 Driver Deinit TTY_ISTData.abort = TRUE; InterruptDisable(TTY_ISTData.sysIntr); CloseHandle(TTY_ISTData.hEvent); CloseHandle(TTY_ISTData.hThread);
69
jc/md/lp-01/05IT CE4.2 : cours68 ISR LISR doit être très court Peut être écrit en partie en assembleur Retourne le numéro logique de lIT, si lIT est active (SYSINTR_A_MOI) Retourne SYSINTR_CHAIN si lIT nest pas active LISR doit être linké avec un minimum doptions pour avoir une taille très faible Le chemin, où trouver TTYISR.dll doit être indiqué dans project.bib
70
jc/md/lp-01/05IT CE4.2 : cours69 ISR typique DWORD ISRHandler(DWORD InstanceIndex) { // Teste que l'IT associée est bien active __asm { // test } Non: return SYSINTR_CHAIN; Oui: return SYSINTR_A_MOI; }
71
jc/md/lp-01/05IT CE4.2 : cours70 Structure du driver
72
jc/md/lp-01/05IT CE4.2 : cours71 Entête du driver // #include des fichiers nécessaires // Définitions et réservations // Définition des IOCTL // 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 abort; // Flag de fin }ISTDATA; ISTDATA TTY_ISTData; // Déclaration de la structure
73
jc/md/lp-01/05IT CE4.2 : cours72 Entrée du driver // Prototype de l'IST DWORD TTYIST(void *dat); //Entrée du driver BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; }
74
jc/md/lp-01/05IT CE4.2 : cours73 Init (1) DWORD TTY_Init(DWORD dwContext) { // Initialisation du périphérique // Récupération d'un numéro IT logique avec // KernelIoControl // Chaînage de l'ISR avec LoadIntChainHandler // Passage de paramètres à l'ISR avec // KernelLibIoControl // Création de lévénement de lien pour lIST // avec CreateEvent
75
jc/md/lp-01/05IT CE4.2 : cours74 Init (2) // Initialisation de la structure ISTData // Disable de linterruption logique avec // InterruptDisable // Création et démarrage du thread avec // CreateThread // Connexion de lIT logique avec lévénement // avec InterruptInitialize // Mise en priorité maximale du thread avec // CeSetThreadPriority }
76
jc/md/lp-01/05IT CE4.2 : cours75 Deinit BOOL TTY_Deinit(DWORD hDeviceContext) { // Mise du flag abort à TRUE pour arrêter l'IST // Inhibition de lIT logique avec InterruptDisable // Fermeture des handles avec CloseHandle }
77
jc/md/lp-01/05IT CE4.2 : cours76 Open DWORD TTY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { // Initialisations complémentaires périphérique // Armement de lIT du périphérique }
78
jc/md/lp-01/05IT CE4.2 : cours77 Close BOOL TTY_Close(DWORD hOpenContext) { // Inhibition de lIT périphérique }
79
jc/md/lp-01/05IT CE4.2 : cours78 IOControl // Traitement des divers IOCTL
80
jc/md/lp-01/05IT CE4.2 : cours79 Structure de lIST
81
jc/md/lp-01/05IT CE4.2 : cours80 IST (1) DWORD TTYIST(void *dat) { ISTDATA *pData = (ISTDATA*)dat; // Boucle tant que abort= FALSE while(!pData->abort) { // Attente de lévénement associé à lIT… WaitForSingleObject(pData->hEvent, INFINITE); if(pData->abort) break;
82
jc/md/lp-01/05IT CE4.2 : cours81 IST (2) // Traitement de l'interruption spécifique // au périphérique // Informer lOS que lIT est traitée avec // InterruptDone }
83
jc/md/lp-01/05IT CE4.2 : cours82 Structure de lISR
84
jc/md/lp-01/05IT CE4.2 : cours83 Fichier.def LIBRARY TTYISR EXPORTS ISRHandler IOControl
85
jc/md/lp-01/05IT CE4.2 : cours84 ISR (1) // #include des fichiers nécessaires // Définition des IOCTL de communication entre // le driver et l'ISR // Entrée de l'ISR BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; }
86
jc/md/lp-01/05IT CE4.2 : cours85 ISR (2) BOOL IOControl(DWORD InstanceIndex, DWORD IoControlCode, LPDWORD pInBuf, DWORD InBufSize, LPDWORD pOutBuf, DWORD OutBufSize, LPDWORD pBytesReturned) { switch(IoControlCode) { // Traitement dans les « case » des divers IOCTL }
87
jc/md/lp-01/05IT CE4.2 : cours86 ISR (3) DWORD ISRHandler(DWORD InstanceIndex) { // Teste que mon IT est bien active __asm { // Test } Non: return SYSINTR_CHAIN; Oui: return SYSINTR_A_MOI; }
88
jc/md/lp-01/05IT CE4.2 : cours87 Conclusion Nous disposons des informations minimales pour mettre en place la gestion des interruptions sous Windows CE Nous disposons dune ébauche pour chacun des composants Nous savons quelles fonctions utiliser dans les divers composants Nous savons comment organiser les communications entre ces composants
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.