Compartilhar via


Handling an Interrupt

Windows Mobile Not SupportedWindows Embedded CE Supported

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:

  1. O hardware gera uma interrupção.
  2. O kernel pesquise solicitação de interrupção (IRQ) da interrupção, chama o ISR registrado e desabilita todos os inferior-prioridade interrupções.
  3. O ISR executa qualquer manipulação necessária e, em seguida, retorna um identificador interrupção.
  4. 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.
  5. 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.
  6. 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

Concepts

Implementing an ISR