87
jc/md/lp-01/05 IT CE4.2 : cours 1 Traitement des interruptions Cours

jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

Embed Size (px)

Citation preview

Page 1: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

jc/md/lp-01/05 IT CE4.2 : cours 1

Traitement des interruptions

Cours

Page 2: jc/md/lp-01/05IT CE4.2 : cours1 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

Page 3: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 4: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 5: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 6: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 7: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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é

Page 8: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 9: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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)

Page 10: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 11: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 12: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 13: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 14: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 15: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 16: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 17: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 18: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 19: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 20: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 21: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 22: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 23: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 24: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 25: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 26: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 27: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 28: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 29: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 30: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 31: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 32: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 33: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 34: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 35: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 36: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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…

Page 37: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 38: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 39: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 40: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

jc/md/lp-01/05 IT CE4.2 : cours 40

Fonctions du driver

• Driver Init• Driver Deinit• Driver Open• Driver Close• Driver IoControl• Etc.

Page 41: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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é

Page 42: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 43: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 44: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

jc/md/lp-01/05 IT CE4.2 : cours 44

Driver Close

• Inhibition (Disable) des interruptions du périphérique

Page 45: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

jc/md/lp-01/05 IT CE4.2 : cours 45

Driver IoControl

• Exécution des différentes commandes IOCTL

Page 46: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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)

Page 47: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 48: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

jc/md/lp-01/05 IT CE4.2 : cours 48

Fonctions utilisées

• LoadIntChainHandler• CreateThread• CreateEvent• InterruptDisable• InterruptInitialize• CeSetThreadPriority

Page 49: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 50: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 51: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 52: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 53: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 54: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 55: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 56: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 57: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 58: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 59: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 60: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 61: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 62: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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.

Page 63: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 64: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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;

Page 65: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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;

Page 66: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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;

}

Page 67: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 68: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 69: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 70: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

jc/md/lp-01/05 IT CE4.2 : cours 70

Structure du driver

Page 71: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 72: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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;

}

Page 73: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 74: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

}

Page 75: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

}

Page 76: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

}

Page 77: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

jc/md/lp-01/05 IT CE4.2 : cours 77

Close

BOOL TTY_Close(DWORD hOpenContext)

{

// Inhibition de l’IT périphérique

}

Page 78: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

jc/md/lp-01/05 IT CE4.2 : cours 78

IOControl

// Traitement des divers IOCTL

Page 79: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

jc/md/lp-01/05 IT CE4.2 : cours 79

Structure de l’IST

Page 80: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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;

Page 81: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

}

}

Page 82: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

jc/md/lp-01/05 IT CE4.2 : cours 82

Structure de l’ISR

Page 83: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

jc/md/lp-01/05 IT CE4.2 : cours 83

Fichier .def

LIBRARY TTYISR

EXPORTS

ISRHandler

IOControl

Page 84: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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;

}

Page 85: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

}}

Page 86: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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

Page 87: jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours

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