jc/md/lp-01/05 IT CE4.2 : cours 1 Traitement des interruptions Cours
jc/md/lp-01/05 IT CE4.2 : cours 1
Traitement des interruptions
Cours
jc/md/lp-01/05 IT CE4.2 : cours 2
Objectif du chapitre
• Présentation des notions nécessaires pour aborder le traitement des interruptions dans l’exemple traité dans le chapitre suivant
• Organisation générale des interruptions sous Windows CE
• Étude des composants principaux– Handler– ISR – IST– Fonctions utiles
jc/md/lp-01/05 IT CE4.2 : cours 3
Éléments mis en jeu pour le traitement des interruptions (1)
I/O Routines
OEM Hardware
ISR OAL RoutinesOAL
ExceptionHandler
Interrupt Support Handler
Kernel
IST
Driver
jc/md/lp-01/05 IT CE4.2 : cours 4
Éléments mis en jeu pour le traitement des interruptions (2)
• Hardware– Contient le périphérique qui va générer l’interruption
• OAL– ISR (Interrupt Service Routine) fournit une
information sur la façon de traiter l’IT– Routines de base : OEMInterruptDisable,
OEMInterruptEnable …– Gestion des I/O physiques
jc/md/lp-01/05 IT CE4.2 : cours 5
É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 à l’IT
jc/md/lp-01/05 IT CE4.2 : cours 6
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 d’IT
– IST : Interrupt Service Thread Traite l’interruption
jc/md/lp-01/05 IT CE4.2 : cours 7
Déroulement du traitement (1)
• Une IT physique se produit• Le gestionnaire d’exception lance l’ISR associé
à cette interruption• L’ISR retourne un code prédéfini au noyau pour
lui indiquer le traitement à faire• Le noyau positionne un événement associé • L’IST en attente de cet événement est activé
jc/md/lp-01/05 IT CE4.2 : cours 8
Déroulement du traitement (2)
• La fonction PeRPISR est l’ISR associé à chaque interruption physique lors de l’initialisation du système d’interruption (fonction HookInterrupt)
• PeRPISR récupère le numéro physique d’interruption (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
jc/md/lp-01/05 IT CE4.2 : cours 9
Déroulement du traitement (3)
• NKCallIntChain utilise le numéro d’interruption pour trouver dans une table le point d’entrée d’une liste chaînée conduisant à un code de retour
• Code de retour en fin de chaîne :– SYSINTR_CHAIN : quand l’interruption n’est
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)
jc/md/lp-01/05 IT CE4.2 : cours 10
Déroulement du traitement (4)
• Fin de l’ISR 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 d’interruption dans le PIC (ou les PICs) puis envoi du code au noyau
– SYSINTR_CHAIN → interruption sur un niveau non partagé. Conversion de l’IT physique en IT logique (fonction OEMTranslateIrq) et envoi au noyau du numéro d’IT logique
jc/md/lp-01/05 IT CE4.2 : cours 11
Déroulement du traitement (5)
• Retour au noyau
Différentes actions en fonction du code retourné :– Ne rien faire– Faire le traitement standard de l’IT– Armer un événement particulier suivant le code de
retour pour déclencher l’exécution d’un IST
jc/md/lp-01/05 IT CE4.2 : cours 12
IST• Thread en mode user de forte priorité• En attente d’un événement associé à l’IT logique• Réveillé lorsque le Kernel signale l’événement• Traite l’interruption• Acquitte l’interruption au niveau de la source
jc/md/lp-01/05 IT CE4.2 : cours 13
Arrivée de la demande d’IT
I/O Routines
OEM Hardware
ISR OAL RoutinesOAL
ExceptionHandler
Interrupt Support Handler
Kernel
IST
Driver
1
jc/md/lp-01/05 IT CE4.2 : cours 14
Envoi de OEMInterruptDisable
I/O Routines
OEM Hardware
ISR OAL RoutinesOAL
ExceptionHandler
Interrupt Support Handler
Kernel
IST
Driver
2
jc/md/lp-01/05 IT CE4.2 : cours 15
Appel des ISR associés au niveau d’IT traitée
I/O Routines
OEM Hardware
ISR OAL RoutinesOAL
ExceptionHandler
Interrupt Support Handler
Kernel
IST
Driver
3
jc/md/lp-01/05 IT CE4.2 : cours 16
Retour du numéro d’IT logique
I/O Routines
OEM Hardware
ISR OAL RoutinesOAL
ExceptionHandler
Interrupt Support Handler
Kernel
IST
Driver
4
jc/md/lp-01/05 IT CE4.2 : cours 17
Positionnement de l’Event associé à l’IST
I/O Routines
OEM Hardware
ISR OAL RoutinesOAL
ExceptionHandler
Interrupt Support Handler
Kernel
IST
Driver
5
jc/md/lp-01/05 IT CE4.2 : cours 18
Réveil de l’IST
I/O Routines
OEM Hardware
ISR OAL RoutinesOAL
ExceptionHandler
Interrupt Support Handler
Kernel
IST
Driver6
jc/md/lp-01/05 IT CE4.2 : cours 19
Opérations sur la périphérie
I/O Routines
OEM Hardware
ISR OAL RoutinesOAL
ExceptionHandler
Interrupt Support Handler
Kernel
IST
Driver
7
jc/md/lp-01/05 IT CE4.2 : cours 20
Envoi de InterruptDone
I/O Routines
OEM Hardware
ISR OAL RoutinesOAL
ExceptionHandler
Interrupt Support Handler
Kernel
IST
Driver
8
jc/md/lp-01/05 IT CE4.2 : cours 21
Envoi de OEMInterruptDone
I/O Routines
OEM Hardware
ISR OAL RoutinesOAL
ExceptionHandler
Interrupt Support Handler
Kernel
IST
Driver
9
jc/md/lp-01/05 IT CE4.2 : cours 22
Rappel
I/O Routines
OEM Hardware
ISR OAL RoutinesOAL
ExceptionHandler
Interrupt Support Handler
Kernel
IST
Driver
1
3 4 9
5
7
6
2
8
jc/md/lp-01/05 IT CE4.2 : cours 23
SYSINTR logique (1)
• Une interruption logique SYSINTR est associée à une interruption physique
• À un même niveau d’interruption physique peuvent être associés plusieurs numéros logiques (IT partagée)
• On donne à la fonction KernelIoControl un numéro physique d’IT et elle renvoie un numéro logique
• KernelIoControl peut aussi libérer une SYSINTR
jc/md/lp-01/05 IT CE4.2 : cours 24
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 d’autres possibilités inutiles pour notre exemple
jc/md/lp-01/05 IT CE4.2 : cours 25
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 d’entrée
jc/md/lp-01/05 IT CE4.2 : cours 26
KernelIoControl (2)
nInBufSize : longueur du buffer d’entré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
jc/md/lp-01/05 IT CE4.2 : cours 27
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
jc/md/lp-01/05 IT CE4.2 : cours 28
Passage de paramètres driver ↔ ISR
• Il peut être nécessaire de passer des paramètres entre le driver et l’ISR
• Si le driver obtient un numéro d’IT logique de manière dynamique, il est nécessaire de donner ce numéro à l’ISR qui doit le renvoyer au système s’il est concerné par cette interruption.
• La fonction KernelLibIoControl permet cela
• KernelLibIoControl appelle la fonction IoControl qui traite les IOCTL de l’ISR
jc/md/lp-01/05 IT CE4.2 : cours 29
KernelLibIoControl (1)
BOOL KernelLibIoControl(HANDLE hModule,
DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize,
LPDWORD lpBytesReturned );
jc/md/lp-01/05 IT CE4.2 : cours 30
KernelLibIoControl (2)
Parameters:hModule
[in] Handle returned from the LoadIntChainHandler function.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.
jc/md/lp-01/05 IT CE4.2 : cours 31
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.
jc/md/lp-01/05 IT CE4.2 : cours 32
KernelLibIoControl (4)
Return Values
If the function succeeds, then TRUE is returned; otherwise, FALSE is returned.
jc/md/lp-01/05 IT CE4.2 : cours 33
IoControl (1)
• Cette fonction de l’ISR permet de traiter les différents IOCTL de configuration de l’ISR (par exemple envoi du numéro logique SYSINTR )
• Appelée par KernelLibIoControl• Permet la communication d’informations entre
ISR et le driver
jc/md/lp-01/05 IT CE4.2 : cours 34
IoControl (2)
BOOL IOControl(DWORD dwInst,DWORD dwIoControlCode,LPVOID lpInBuf,DWORD nInBufSize,LPVOID lpOutBuf,DWORD nOutBufSize,LPDWORD lpBytesReturned );
jc/md/lp-01/05 IT CE4.2 : cours 35
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.
jc/md/lp-01/05 IT CE4.2 : cours 36
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…
jc/md/lp-01/05 IT CE4.2 : cours 37
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.
jc/md/lp-01/05 IT CE4.2 : cours 38
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.
Return ValuesIf the function succeeds, then TRUE is returned; otherwise,
FALSE is returned.
jc/md/lp-01/05 IT CE4.2 : cours 39
Liaison DRIVER ↔ IST
• Le driver va lancer l’IST par un CreateThread et lui passer une structure avec des paramètres– Handle de l’IST– Numéro d’IT logique– Evénement associé à l’IST (auto Reset)– Flag de fin d’utilisation
• 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 l’IST a traité l’interruption
jc/md/lp-01/05 IT CE4.2 : cours 40
Fonctions du driver
• Driver Init• Driver Deinit• Driver Open• Driver Close• Driver IoControl• Etc.
jc/md/lp-01/05 IT CE4.2 : cours 41
Driver Init
• Initialisation du périphérique • ISR
– Chargement et chaînage de l’ISR– Passage de paramètres à l’ISR
• IST– Création du thread IST– Création d’un Event associé à l’IST– Inhibition (Disable) du niveau d’IT logique– Liaison IT logique → Event– Mise de l’IST en bonne priorité
jc/md/lp-01/05 IT CE4.2 : cours 42
Driver Deinit
• Signaler l’arrêt du driver à l’IST (flag Abort)• Inhiber (Disable) le niveau d’IT• Fermeture de tous les handles ouverts
jc/md/lp-01/05 IT CE4.2 : cours 43
Driver Open
• Fin de l’initialisation du périphérique • Armement des interruptions du périphérique
jc/md/lp-01/05 IT CE4.2 : cours 44
Driver Close
• Inhibition (Disable) des interruptions du périphérique
jc/md/lp-01/05 IT CE4.2 : cours 45
Driver IoControl
• Exécution des différentes commandes IOCTL
jc/md/lp-01/05 IT CE4.2 : cours 46
Exemple (1)
• Pour les exemples nous supposons gérer une ligne série
• Noms utilisés :– Driver : TTYIT_DRV.dll (avec l’IST : TTYIST)– Handle de l’IST : hThr– Event associé : ISTEvent– Handle ISR : hChain– ISR : TTYISR.dll (point d’entrée : ISRHandler)
jc/md/lp-01/05 IT CE4.2 : cours 47
Exemple (2)
– Structure d’information à passer à l’IST :
TTYIST_Data– IT physique : ItPhy=3– IT logique : SYSINTR_A_MOI
jc/md/lp-01/05 IT CE4.2 : cours 48
Fonctions utilisées
• LoadIntChainHandler• CreateThread• CreateEvent• InterruptDisable• InterruptInitialize• CeSetThreadPriority
jc/md/lp-01/05 IT CE4.2 : cours 49
Chaînage de l’ISR (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.
jc/md/lp-01/05 IT CE4.2 : cours 50
Chaînage de l’ISR (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);
jc/md/lp-01/05 IT CE4.2 : cours 51
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.
jc/md/lp-01/05 IT CE4.2 : cours 52
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.
lpParameter
[in] Long pointer to a single 32-bit parameter value passed to the thread.
jc/md/lp-01/05 IT CE4.2 : cours 53
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.
jc/md/lp-01/05 IT CE4.2 : cours 54
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.
jc/md/lp-01/05 IT CE4.2 : cours 55
Création d’un 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.
jc/md/lp-01/05 IT CE4.2 : cours 56
Création d’un 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.
jc/md/lp-01/05 IT CE4.2 : cours 57
Liaison IT logique → EVENT (1)
La fonction InterruptInitialize réalise plusieurs opérations :
• Initialisation de l’interruption• Autorisation (Enable) de l’interruption• Association de l’interruption à un événement
(EVENT) qui servira à réveiller l’IST
jc/md/lp-01/05 IT CE4.2 : cours 58
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).
jc/md/lp-01/05 IT CE4.2 : cours 59
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.
cbData
[in] Size of data pointed to by pvData.
jc/md/lp-01/05 IT CE4.2 : cours 60
Liaison IT logique → EVENT (4)
Return Values
TRUE indicates success; FALSE indicates failure.
ExempleInterruptInitialize(SYSINTR_A_MOI,ISTEvent,NULL,0);
jc/md/lp-01/05 IT CE4.2 : cours 61
Inhibition (Disable) de l’IT
VOID InterruptDisable( DWORD idInt );ParametersidInt
[in] Identifier of an interrupt. Return ValuesNone.Remarque : il y a aussi suppression du lien avec l’EVENT
associé Exemple
DWORD SYSINTR_A_MOI;InterruptDisable(SYSINTR_A_MOI);
jc/md/lp-01/05 IT CE4.2 : cours 62
Affectation de priorité à l’IST (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.
jc/md/lp-01/05 IT CE4.2 : cours 63
Affectation de priorité à l’IST (2)
Return Values
TRUE indicates success. FALSE indicates failure. To get extended error information, call GetLastError.
Exemple
HANDLE hThr;
hTHR=…CeSetThreadPriority(hThr, 0);
jc/md/lp-01/05 IT CE4.2 : cours 64
Structure passée à l’IST
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;
jc/md/lp-01/05 IT CE4.2 : cours 65
Initialisation de TTYIST_Data
Exemple:
TTTYIST_ Data.hThread = hThr;TTTYIST_ Data.sysIntr = SYSINTR_A_MOI;TTTYIST_ Data.hEvent = ISTEvent;TTTYIST_ Data.abort = FALSE;
jc/md/lp-01/05 IT CE4.2 : cours 66
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 l’IT … InterruptDone(pData->sysIntr);
}return 0;
}
jc/md/lp-01/05 IT CE4.2 : cours 67
Driver Deinit
TTY_ISTData.abort = TRUE;
InterruptDisable(TTY_ISTData.sysIntr);
CloseHandle(TTY_ISTData.hEvent);
CloseHandle(TTY_ISTData.hThread);
jc/md/lp-01/05 IT CE4.2 : cours 68
ISR
• L’ISR doit être très court• Peut être écrit en partie en assembleur• Retourne le numéro logique de l’IT, si l’IT est
active (SYSINTR_A_MOI)• Retourne SYSINTR_CHAIN si l’IT n’est pas
active• L’ISR doit être linké avec un minimum d’options
pour avoir une taille très faible• Le chemin, où trouver TTYISR.dll doit être
indiqué dans project.bib
jc/md/lp-01/05 IT CE4.2 : cours 69
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;}
jc/md/lp-01/05 IT CE4.2 : cours 70
Structure du driver
jc/md/lp-01/05 IT CE4.2 : cours 71
Entête du driver
// #include des fichiers nécessaires// Définitions et réservations// Définition des IOCTL// Définition de la structure à passer à l’ISTtypedef 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
jc/md/lp-01/05 IT CE4.2 : cours 72
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;
}
jc/md/lp-01/05 IT CE4.2 : cours 73
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 l’IST// avec CreateEvent
jc/md/lp-01/05 IT CE4.2 : cours 74
Init (2)
// Initialisation de la structure ISTData// Disable de l’interruption logique avec// InterruptDisable// Création et démarrage du thread avec// CreateThread// Connexion de l’IT logique avec l’événement// avec InterruptInitialize// Mise en priorité maximale du thread avec// CeSetThreadPriority
}
jc/md/lp-01/05 IT CE4.2 : cours 75
Deinit
BOOL TTY_Deinit(DWORD hDeviceContext)
{
// Mise du flag abort à TRUE pour arrêter l'IST
// Inhibition de l’IT logique avec InterruptDisable
// Fermeture des handles avec CloseHandle
}
jc/md/lp-01/05 IT CE4.2 : cours 76
Open
DWORD TTY_Open(DWORD hDeviceContext, DWORD AccessCode,
DWORD ShareMode)
{
// Initialisations complémentaires périphérique
// Armement de l’IT du périphérique
}
jc/md/lp-01/05 IT CE4.2 : cours 77
Close
BOOL TTY_Close(DWORD hOpenContext)
{
// Inhibition de l’IT périphérique
}
jc/md/lp-01/05 IT CE4.2 : cours 78
IOControl
// Traitement des divers IOCTL
jc/md/lp-01/05 IT CE4.2 : cours 79
Structure de l’IST
jc/md/lp-01/05 IT CE4.2 : cours 80
IST (1)
DWORD TTYIST(void *dat)
{
ISTDATA *pData = (ISTDATA*)dat;
// Boucle tant que abort= FALSE
while(!pData->abort)
{
// Attente de l’événement associé à l’IT… WaitForSingleObject(pData->hEvent, INFINITE);
if(pData->abort)
break;
jc/md/lp-01/05 IT CE4.2 : cours 81
IST (2)
// Traitement de l'interruption spécifique
// au périphérique
// Informer l’OS que l’IT est traitée avec// InterruptDone
}
}
jc/md/lp-01/05 IT CE4.2 : cours 82
Structure de l’ISR
jc/md/lp-01/05 IT CE4.2 : cours 83
Fichier .def
LIBRARY TTYISR
EXPORTS
ISRHandler
IOControl
jc/md/lp-01/05 IT CE4.2 : cours 84
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;
}
jc/md/lp-01/05 IT CE4.2 : cours 85
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
}}
jc/md/lp-01/05 IT CE4.2 : cours 86
ISR (3)
DWORD ISRHandler(DWORD InstanceIndex){
// Teste que mon IT est bien active __asm {
// Test }
Non: return SYSINTR_CHAIN;
Oui: return SYSINTR_A_MOI;}
jc/md/lp-01/05 IT CE4.2 : cours 87
Conclusion
• Nous disposons des informations minimales pour mettre en place la gestion des interruptions sous Windows CE
• Nous disposons d’une ébauche pour chacun des composants
• Nous savons quelles fonctions utiliser dans les divers composants
• Nous savons comment organiser les communications entre ces composants