Handling an Interrupt
9/8/2008
A técnica principal para manipulação é uma interrupção para associar um evento para uma rotina serviço interrupção especificada (ISR). Windows Embedded CE, em seguida, agenda seu segmento serviço interrupção (ist) quando o evento é disparado.
Uma seqüência manipulação interrupção típico inclui as seguinte etapas:
- O hardware gera uma interrupção.
- O kernel pesquise solicitação de interrupção (IRQ) da interrupção, chama o ISR registrado e desabilita todos os inferior-prioridade interrupções.
- O ISR executa qualquer manipulação necessária e, em seguida, retorna um identificador interrupção.
- Se o valor identificador interrupção retornado pelo ISR for SYSINTR_NOP, o kernel completará processamento sem configuração um evento — são todas as interrupções habilitado — e continua executar quaisquer tarefas no processo antes de interrupção ocorreu.
Caso contrário, o kernel define o evento tiver associado com o identificador interrupção. Quando o ISR retorna, o kernel permite que todos os outras interrupções exceto aquele que está sendo processado. - O kernel agenda a ist indicado pelo identificador de interrupção para executar.
O ist pode usar os recursos driver get ou enviar dados e controle códigos para o hardware e a confirmação de interrupção hardware. - Após completamente atendendo a interrupção, o ist chama o InterruptDone função. Por sua vez, InterruptDone Chamadas de OEMInterruptDone Função interface OAL para executar quaisquer ações hardware necessárias para habilitar o próximo interrupção do dispositivo de destino.
O seguinte exemplo de código mostra as funções que um ist geralmente chamadas.
// CreateThread can supply one 32-bit parameter, so pass the event handle.
// Associate this thread with the registered event.
MyISTRoutine(HANDLE hEvent) {
InterruptDone(InterruptId);
while (1) {
WaitForSingleObject(hEvent, INFINITE);
// Check for thread exit signal and exit if set
// Interrupt processing here.
// On completion, call InterruptDone.
InterruptDone(InterruptId);
// Loop and wait for the kernel to set the event.
}
}
Se você inicializar e habilitar a interrupção antes de criar o segmento IST, totalmente estar ciente que se o dispositivo não interrupção após o apontar que você tem habilitado dele (antes que o segmento ist tem sido criado), e o ist irá perder o evento que ocorre quando a interrupção acionado.
Portanto, você nunca verá uma interrupção novamente e ele aparecerá se o dispositivo está desapareceu. Na exemplo de código acima, a InterruptDone função limpa qualquer interrupções que podem ter acionado.
A desvantagem incluindo o InterruptDone função é que isso não realmente registro de dados interrupção. Caso, mesmo que incluindo o InterruptDone função não travar o dispositivo, ele perde os dados relacionado para a interrupção. Se esta for um crítico interrupção, os dados serão perdidos.
Esteja ciente que pode haver uma desconexão entre a inicialização da interrupção e a real manipulação da interrupção no ist. Se uma interrupção é acionado entre esses dois processos, você poderá perder dados de interrupção. InterruptDone Limpa o estado interrupção, mas você pode perder os dados durante tempo inicializar.
See Also
Tasks
How to Develop an OEM Adaptation Layer