Interrupção de software vs função

10

Após cerca de 3 anos trabalhando com MCUs, ainda não sei para que serve o uso de software interrompe? Eu fiz vários trabalhos com o STM32 e nunca usei as interrupções de software. De fato, esta é uma grande questão para mim:

Por que quando podemos usar uma função simples para executar uma tarefa, devemos usar uma interrupção de software? Quais são as diferenças entre uma interrupção de software e uma função?

Sempre que quiser, você pode chamar uma função (que você escreveu para o seu trabalho). Deve haver alguns benefícios em usar uma interrupção de software em vez de uma função simples. Não tenho certeza, mas acho que há um benefício para interrupções de software: você pode atribuir uma prioridade a uma interrupção de software e, em seguida, atribuir uma prioridade mais alta à interrupção do software para evitar que a interrupção do hardware interrompa sua tarefa.

Roh
fonte
1
Penso que o principal objetivo do uso de interrupções é que você pode continuar executando outras tarefas importantes enquanto aguarda que algo mais aconteça, e quando os horários nem sempre serão constantes. Também acho que é um pouco mais rápido do que a pesquisa na maioria dos casos.
MrPhooky
1
@MrPhooky That's Hardware interrompe o que você está falando. O OP está falando sobre interrupções de software.
brhans

Respostas:

19

A principal diferença entre uma função e uma interrupção de software é o que é conhecido como contexto .

  • Uma função é executada dentro do contexto do seu programa principal.
  • Uma interrupção é executada no contexto do manipulador de interrupções.

Em um sistema simples, isso pode não haver diferença real e as interrupções de software podem ser simplesmente usadas como uma maneira conveniente de fornecer rotinas de biblioteca codificadas em ROM - você não precisa saber o endereço de todas as rotinas, apenas o código de identificação e o código de identificação. ponto de entrada principal. Isso torna seu código mais portátil.

No entanto, em sistemas mais complexos, a interrupção do software pode ser executada em um ambiente completamente diferente, conhecido como contexto do kernel . Normalmente, seu aplicativo seria executado em um contexto de usuário protegido, com acesso limitado aos recursos. Somente ao executar no contexto do kernel você pode executar tarefas mais complicadas - de fato, alguns sistemas até limitam quais instruções podem ser executadas; portanto, você precisa de um mecanismo para acionar o código no contexto do kernel - e para isso uma interrupção é usada.

Majenko
fonte
1
Além disso, interrupções podem interromper arbitrariamente o progresso de um programa, para que o sistema possa fazer outra coisa (por exemplo, interrupções de hardware). Seus programas não precisam levar isso em consideração, porque, do ponto de vista do programa, o estado da função permanece inalterado desde a ocorrência da interrupção. Em sistemas mais antigos, é assim que os programas TSR (Terminate / Stay Resident) simulam multitarefa, desligando a interrupção do timer / relógio. Mesmo sem os níveis de IOPL, havia um benefício em, por exemplo, manter o relógio do sistema atualizado.
Phyrfox
4
Talvez também observe que essas "interrupções de software" também são chamadas de "interrupções síncronas", porque o código do aplicativo sabe exatamente quando e por que essa interrupção ocorre, em oposição a "interrupções assíncronas" que podem, do ponto de vista do aplicação, basicamente, a qualquer momento, de forma não solicitada.
JimmyB
@ HannoBinder: Acho que o OP está falando sobre postar solicitações de interrupção no controlador de interrupção vetorial Cortex-M3; se o código para uma interrupção de alta prioridade postar um de menor prioridade, a solicitação será adiada até mais tarde, quando todas as interrupções de prioridade mais alta forem concluídas.
Supercat
12

Interrupções de software podem ser usadas para finalizar uma tarefa de interrupção com uma prioridade mais baixa. O código crítico de temporização geralmente recebe uma alta prioridade de interrupção para evitar muita latência. Após a conclusão da parte crítica de temporização, pode haver tarefas adicionais que podem ser críticas demais para o loop principal, mas não são tão críticas a ponto de impedir outras interrupções de alta prioridade. Disparar uma interrupção de prioridade mais baixa do software pode fazer isso.

Por exemplo, suponha que você tenha vários motores de passo, cada um com seu próprio timer. As interrupções do temporizador recebem alta prioridade para minimizar a tremulação da etapa. A tarefa mais crítica de tempo pode ser tão simples quanto definir ou limpar um pulso de passo ou avançar as saídas de fase. Pode haver funcionalidade adicional necessária, como cálculo de rampas de aceleração, processamento de sensores, etc. Como isso precisa ser processado a cada etapa, pode não ser apropriado processá-lo a partir de main (), pois o tempo do loop principal pode ser muito longo. Essas tarefas adicionais podem ser processadas por uma interrupção de software de baixa prioridade, para não aumentar a latência dos outros canais de passo de alta prioridade.

Qual é a diferença entre uma interrupção de software e uma função?

Uma função é chamada imediatamente de onde quer que seja chamada e não altera o nível atual de prioridade de interrupção se for chamada de uma interrupção. Uma interrupção de software é um gatilho de interrupção que fará com que essa interrupção seja chamada quando a prioridade surgir. Se uma chamada de função fosse inserida no final de uma interrupção de alta prioridade, a função estaria contida nessa alta prioridade. Ao disparar a interrupção de prioridade mais baixa do software e depois retornar da interrupção de alta prioridade, a funcionalidade é chamada na nova prioridade (mais baixa).

Tut
fonte
2
Outro padrão comum pode ser ter uma interrupção de 100KHz para lidar com coisas críticas de tempo e também precisar de um tique de timer de 1kHz, mas não ter dois timers separados disponíveis. Não é preciso muito tempo para uma rotina de interrupção de 100kHz dizer if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1; A outra interrupção pode funcionar e, com as interrupções desativadas brevemente, adicione 100 ao timer_count; mesmo se a rotina de 1kHz demorar mais de 10us para executá-la, ela não interferirá na rotina de 100kHz.
Supercat
De maneira semelhante, usei interrupções de software em sistemas simples (sem um RTOS completo) como um pseudo-agendador, onde os requisitos de hardware são tratados pelos ISRs, mas funções de retorno de chamada e outras tarefas demoradas que são executadas em resposta a alterações no O estado do hardware é delegado à interrupção do software.
Mal Dog Pie
Você basicamente descreveu uma variação da "metade inferior". Você tem alguma referência para isso também ser chamado de "interrupção de software"? É um significado bem diferente da resposta de Majenko, e a pergunta está marcada como ARM - a arquitetura realmente possui a instrução SWI (interrupção de software).
Domen 15/04
3
@ Domen Não tenho certeza de que tipo de referência você precisa. É denominado "interrupção de software" porque é isso que é usado para alcançá-lo. No contexto do ARM, o OP referenciou especificamente o STM32 e forneceu um link para o manual de referência do RM0008. Este não é um manual de referência do núcleo do ARM. A única "interrupção de software" abordada no RM0008 é o EXTI_SWIER (registro de eventos de interrupção de software) que pode ser usado para gerar interrupções de software, independentemente de os pinos de hardware reais serem ou não utilizados para interrupções. Eu não usei pessoalmente a instrução SWI (SWC).
Tut
Obrigado! Pode ser bom incluir algumas dessas informações na resposta, para deixar claro qual "interrupção de software" é essa.
domen
7

Para expandir um pouco a resposta de Majenko, interrupções de software são usadas para implementar sistemas operacionais, particularmente a interface de chamada do sistema. Isso significa que os aplicativos não precisam estar vinculados ao sistema operacional para fazer chamadas de função, e a alternância de contexto permite que o sistema operacional limite o acesso ao hardware e tire proveito de coisas como memória protegida.

Se você não estiver usando um sistema operacional e controlar todo o código no MCU, provavelmente não precisará usar interrupções de software. (Embora, como Tut mencionou, eles possam ter outros usos.)

As interfaces de chamada do sistema Linux e MS-DOS no x86 usam interrupções de software, portanto, irei vincular a elas como exemplo.

Adam Haun
fonte
1
E em muitos casos em que o sistema operacional usa interrupções suaves, elas são envolvidas em funções para tornar a vida mais simples.
Hildred 14/04
1
Ainda programo coisas (novas também) para o DOS e estou muito familiarizado com os manipuladores int 21. Quase tudo o que eu preciso de E / S é tratado com o ISR do DOS.
R Drast
Observe que a página citada para Linux é de 1993-1996.
um CVn
Troquei o link por um mais atualizado.
Adam Haun