Onde quer que eu tenha pesquisado sobre a implementação prática da interrupção baseada em níveis, encontrei apenas uma sugestão que as pessoas deram, ou seja, desabilite a interrupção assim que ela entrar no ISR, para que ela não volte a disparar.
Outra coisa que li é que ele é usado para criar um loop, ou seja, desde que haja interrupção, sirva o ISR, mas isso pode ser alcançado com um loop while
ou do while
.
E as vantagens que uma interrupção de borda de nível proporcionaria podem ser o luxo de executar uma instrução do programa principal entre servir os ISRs e a latência. Eu acho.
Então, há algo que estou perdendo quando se trata de entender a interrupção da borda do nível?
Uma ótima resposta seria me mostrar algum tipo de uso prático de interrupções baseadas em níveis.
fonte
Respostas:
As interrupções com base no nível podem ser compartilhadas e distribuídas em cascata com facilidade e confiabilidade; por outro lado, o compartilhamento confiável de interrupções acionadas por borda é frequentemente difícil e às vezes impossível.
Ao usar interrupções com base no nível, um manipulador de interrupção pode simplesmente perguntar a cada fonte de interrupção possível por sua vez "Você precisa de atenção" e, se for o caso, fazer a manutenção. Uma vez feito, o manipulador pode retornar. Se uma fonte de interrupção pesquisada no início da sequência decidir que precisa de atenção enquanto uma fonte posterior estiver sendo reparada, o processador notará que o pino IRQ ainda está ativo e reativará o manipulador de interrupção, permitindo, assim, a interrupção tardia ser atendido.
Ao usar interrupções acionadas por borda não em cascata, as coisas ficam mais complicadas. Depois que um manipulador de interrupções passa e atende a todos, ele deve repassar e pesquisar novamente todos, para descobrir se um dispositivo pesquisado anteriormente decidiu que precisa de serviço. Somente depois que todos os dispositivos reportarem consecutivamente que não precisam de manutenção, é seguro que a interrupção retorne. Observe que, se os dispositivos que desejam manutenção mantiverem ativa sua indicação de "necessidade de manutenção", retornar de um manipulador de interrupção no momento em que um dispositivo precisar de manutenção poderá tornar essa interrupção permanentemente inútil.
Pode ser útil para um pino de E / S ter alguma lógica de captura de borda que, quando uma borda chega, define uma trava e gera uma indicação de "serviço necessário" até que o software a limpe. Tal coisa pode aparecer no front-end como uma interrupção sensível à borda. Em qualquer ponto a jusante, no entanto, é melhor ter uma demanda lógica de interrupção para que uma interrupção seja atendida sempre que um ponto a montante não for atendido.
fonte
Uma situação óbvia em que interrupções baseadas em nível são úteis é a situação em que o sinal já está nesse estado quando o código começa a monitorar o sinal.
Vamos considerar um exemplo típico ...
Sinal: "Case_Over_Temperature" Reduz quando o ambiente na caixa é muito alto para operação normal.
Obviamente, esse sinal pode ficar baixo a qualquer momento, seja porque estamos fazendo muito calor ou porque a caixa está instalada em um local quente.
Obviamente, na energização, essa linha pode estar em qualquer uma das condições. Vamos supor, no momento, que o código de inicialização não seja apenas visualizado, mas confie na interrupção. Se a interrupção for acionada pela borda e o sinal já estiver baixo, quando a interrupção for ativada, o código apropriado não será executado. Interrupções sensíveis ao nível seriam prudentes aqui.
Da mesma forma, se o processador for colocado no modo de suspensão e não estiver definido para ativar essa interrupção, essa linha poderá ficar baixa a qualquer momento. Quando o que quer que seja que acorde aconteça, você deseja que a interrupção seja acionada naquele momento.
De fato, sem dúvida, com a prevalência de processadores no modo de suspensão, as interrupções com base em níveis tornaram-se mais úteis.
No entanto, como em todas as coisas relacionadas ao código, sempre há mais de uma maneira de "esfolar um gato". Se você não usar o nível, o código de ativação precisará pesquisar os pinos de interrupção, se não forem colocados na fila automaticamente pelo processador.
Obviamente, o nível acionado também vem com seu próprio conjunto de problemas, em que o código precisa lidar sabendo que já tratou da condição etc.
fonte
É um pouco o contrário: por que interrupções desajeitadas provocadas pela borda quando você pode ter a mais fácil desencadeada por nível?
As interrupções acionadas por borda são mais suscetíveis a picos de ruído e mais difíceis de filtrar. Eles são mais arriscados ao executar cabos externos ou fora da placa. A interrupção não pode ser retirada pela fonte.
As interrupções acionadas por nível permanecem ativas até que a CPU reconheça a fonte. Portanto, há a base sólida do aperto de mão completo. A CPU pode filtrar o ruído do sinal de interrupção da maneira que desejar, apenas aumentando o tempo de resposta à interrupção. Se o aplicativo exigir e permitir sinais bem filtrados, o disparo de nível é adaptável.
Vi pela primeira vez interrupções acionadas por borda usadas para NMIs em CPUs como o Z80 e 6502, enquanto interrupções mascaradas usavam o nível acionado. As NMIs usavam o gatilho de ponta simplesmente para impedir que um pino ou circuito de acionamento preso impedisse a CPU de entrar novamente no ISR da NMI para sempre. A MNI deve mostrar atividade para obter outra.
A resposta, é claro, é que ambos têm suas aplicações. Mas o gatilho de nível é o ponto de partida e o gatilho de borda, porque existe um caso especial.
fonte
Suporte ISR baseado em nível Ack / Nak, que é útil quando você tem muitas fontes.
Se você tiver muitos ISRs e muitas classificações de prioridade em SW e HW externo com prioridades classificadas.
Se todas as fontes tivessem OR de borda, você ainda teria que pesquisar cada uma para descobrir qual fonte estava definida e, em seguida, limpar a interrupção.
Portanto, borda e nível têm vantagens em diferentes arquiteturas.
Para evitar a perda de um IRQ do Edge, ele deve ser ativado e testado imediatamente após o final do ISR.
Alguns IRQs de nível podem durar muito mais que o ISR e detectados, se esperado.
fonte
É quando uma "linha de festa" está sendo usada, juntamente com o dreno aberto ou o coletor aberto, quando o modo de operação de nível faz mais sentido.
Nesse caso, cada "parte" na linha ativa sua saída quando precisa de "serviço". À medida que o software de tratamento de interrupções é desativado e pesquisa (e depois lida com) cada dispositivo na linha de interlocutores, esses dispositivos liberam sua espera e ficam inativos. Eventualmente, não há mais interrupções (de nível) restantes, a própria linha de interrupção fica inativa e as interrupções de manipulação de software ficam "inativas" novamente.
fonte