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

Preview:

Citation preview

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