Qual é o ponto de ter uma interrupção baseada em nível?

8

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

MaNyYaCk
fonte
... 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 tempo ou loop while ... O fato de que algo pode ser alcançado de uma maneira, não significa que devemos eliminar todas as outras maneiras de fazer o mesmo.
Eugene Sh.
@EugeneSh. Não há dúvida sobre isso, mas deve haver alguma vantagem sólida para fazer a mesma coisa de outra maneira. Não é? Estou mais interessado em conhecer essa "vantagem". Eu só quero saber que tipo de diferença faz no loop usando instruções de loop e interrupção baseada em nível? Se o loop for o único objetivo alcançado com o uso.
MaNyYaCk
2
e se você tiver várias interrupções pendentes em uma linha? por exemplo, cada gatilho do ISR lida com um pacote de dados, mas o dispositivo possui vários na fila? Com a interrupção acionada pela borda, o controlador de interrupção precisa saber quando a interrupção anterior é tratada e quando é a hora de enviar a próxima interrupção. Também para casos de uso em que várias interrupções são declaradas quando o host ainda está lidando com uma anterior, sem disparar o nível, é difícil colocá-las em fila e priorizá-las.
User3528438

Respostas:

10

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.

supercat
fonte
Gostaria de me desculpar por demorar tanto tempo. Mas a pergunta que fiz foi muito específica para as interrupções externas do controlador e demorei um pouco para entender todas as respostas que surgiram, considerando o processador com um controlador de interrupção. Obrigado por fornecer esta resposta valiosa.
MaNyYaCk
6

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.

Trevor_G
fonte
2

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

TonyM
fonte
1
Eu não diria que o Z80 e o 6502 usaram interrupções acionadas por borda para evitar problemas de pinos "presos". Em vez disso, eu diria que eles precisam ser capazes de mascarar qualquer tipo de interrupção após o início da manutenção e, para a NMI, isso é realizado por meio da trava especial "mascarar a NMI", que é definida quando uma NMI é atendida e limpa quando o O pino NMI é liberado.
Supercat
@ supercat, você descreveu como o vê, mas não como o Z80 / 6502 funciona. O NMI poderia estar nivelado, igual ao INT / IRQ com a fonte de interrupção removida por reconhecimento de interrupção hw ou sw. Funciona perfeitamente bem. O que você acha que os levou a projetar NMI como disparador de borda e INT / IRQ como nível, qual você vê como benefício?
21717 TonyM 6:17
O termo "edge triggered" é usado para descrever entradas que colocam um circuito de detecção de borda antes de um sincronizador, para que um sinal que entra e sai em um único ciclo seja processado, mas eu também o vi usado para descrever entradas que travam um sinal em cada sinal de relógio e procuram um sinal ausente em um ou mais ciclos e, em seguida, presentes em um ou mais ciclos. Se a NMI tivesse que ser reconhecida pelo software, a falha em reconhecer a primeira interrupção mascararia efetivamente todas as subsequentes.
Supercat
@ supercat, não é assim que o Z80 / 6502 funciona e eles sozinhos foram o assunto do meu exemplo que você questionou. Se você estiver após uma discussão sobre MNIs com gatilho de borda, vá ao bate-papo para evitar uma troca prolongada de comentários. Não tenho certeza do que posso adicionar. Obrigado.
18717 TonyMay
Não examinei os detalhes de como o Z80 funciona, mas, de acordo com a folha de dados 6502, o NMI é amostrado uma vez em cada relógio phi2. A folha de dados é silenciosa sobre os tempos de amostra / espera, mas pelo que li em outros lugares, pulsos de NMI que não estão presentes durante pelo menos três amostras consecutivas nem sempre serão processados.
Supercat
1

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.

Tony Stewart Sunnyskyguy EE75
fonte
1

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

jonk
fonte
1
isto é importante. e se o host receber outra borda em outra linha quando já estiver lidando com uma interrupção? algumas opções: 1) ignore a interrupção de entrada; 2) enfileirá-lo no hardware; 3) interrompa o manipulador de interrupções atual e manipule o novo, manipule-o completamente ou faça uma fila para mais tarde. Com o gatilho de nível, você apenas o deixa lá e ele ainda estará lá para você lidar depois de concluir o ISR atual.
User3528438
@ user3528438 Estou abordando a pergunta sobre "por que nível". Então, vou remover essa parte e evitar o debate.
jonk
1
Mesmo ao usar interrupções dedicadas, eu sugeriria que as interrupções acionadas por borda são melhores apenas se alguém estiver interessado em responder a um evento que pode ter chegado e se esgotado no momento em que é possível repará-lo, e mesmo lá usando uma trava de evento O dispositivo para acionar uma interrupção sensível ao nível pode ser tão útil quanto usar uma interrupção sensível à borda. Uma interrupção acionada pela borda pode salvar uma instrução que seria necessária para limpar a trava, mas isso geralmente não representa um custo ou economia significativa.
Supercat
@supercat Voltei a focar minha resposta para responder diretamente à pergunta intitulada, a fim de evitar me envolver em algum capítulo e verso sórdido e longo. Muito mais simples. (Sim, eu tenho usado todos os tipos de métodos de interrupção desde ... 1974 ... então eu vi todas as razões, eu acho. Só não quero discuti-las hoje.)
jonk