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.
fonte
Respostas:
A principal diferença entre uma função e uma interrupção de software é o que é conhecido como contexto .
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.
fonte
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.
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).
fonte
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.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.
fonte