Après environ 3 ans de travail avec les MCU, je ne sais toujours pas à quoi servent les interruptions logicielles? J'ai fait plusieurs travaux avec STM32 et je n'ai jamais utilisé les interruptions logicielles. En effet, c'est une grande question pour moi:
Pourquoi, lorsque nous pouvons utiliser une fonction simple pour effectuer une tâche, devrions-nous utiliser une interruption logicielle? Quelles sont les différences entre une interruption logicielle et une fonction?
Chaque fois que vous le souhaitez, vous pouvez appeler une fonction (que vous avez écrite pour votre travail). Il devrait y avoir certains avantages à utiliser une interruption logicielle au lieu d'une simple fonction. Je ne suis pas sûr, mais je pense qu'il y a un avantage pour les interruptions logicielles: vous pouvez attribuer une priorité à une interruption logicielle, puis vous pouvez donner une priorité plus élevée à l'interruption logicielle pour éviter que l'interruption matérielle ne perturbe votre tâche.
la source
Réponses:
La principale différence entre une fonction et une interruption logicielle est ce que l'on appelle le contexte .
Sur un système simple, cela ne fait aucune différence, et les interruptions logicielles peuvent simplement être utilisées comme un moyen pratique de fournir des routines de bibliothèque codées en dur dans la ROM - vous n'avez pas besoin de connaître l'adresse de chaque routine, seulement le code ID et le point d'entrée principal. Cela rend votre code plus portable.
Cependant, sur des systèmes plus complexes, l'interruption logicielle peut s'exécuter dans un environnement complètement différent, appelé contexte du noyau . Normalement, votre application s'exécute dans un contexte utilisateur protégé qui a un accès limité aux ressources. Ce n'est que lors de l'exécution dans le contexte du noyau que vous pouvez effectuer les tâches les plus compliquées - en effet, certains systèmes limitent même les instructions qui peuvent être exécutées, vous avez donc besoin d'un mécanisme pour déclencher le code dans le contexte du noyau - et pour cela, une interruption est utilisée.
la source
Les interruptions logicielles peuvent être utilisées pour terminer une tâche d'interruption avec une priorité inférieure. Le code critique de synchronisation reçoit souvent une priorité d'interruption élevée pour éviter une latence excessive. Une fois que la partie critique de synchronisation est terminée, il peut y avoir des tâches supplémentaires qui peuvent être trop critiques de synchronisation pour la boucle principale, mais ne sont pas suffisamment critiques pour retarder d'autres interruptions de haute priorité. Le déclenchement d'une interruption logicielle de priorité inférieure peut y parvenir.
Par exemple, supposons que vous ayez plusieurs moteurs pas à pas chacun avec leur propre temporisateur. Les interruptions de temporisation reçoivent une priorité élevée pour minimiser la gigue des pas. La tâche la plus critique de synchronisation peut être aussi simple que de définir ou d'effacer une impulsion de pas ou d'avancer les sorties de phase. Il peut y avoir des fonctionnalités supplémentaires requises telles que le calcul des rampes d'accélération, le traitement des capteurs, etc. Étant donné que cela doit être traité à chaque étape, il peut ne pas être approprié de traiter cela à partir de main () car la synchronisation de la boucle principale peut être trop longue. Ces tâches supplémentaires peuvent être traitées par une interruption logicielle de moindre priorité afin de ne pas augmenter la latence des autres canaux pas à pas de haute priorité.
Une fonction est appelée immédiatement d'où qu'elle soit appelée et ne change pas le niveau de priorité d'interruption actuel si elle est appelée à partir d'une interruption. Une interruption logicielle est un déclencheur d'interruption qui provoquera l'appel de cette interruption lorsqu'elle sera prioritaire. Si un appel de fonction était inséré à la fin d'une interruption de haute priorité, la fonction serait contenue dans cette priorité élevée. En déclenchant l'interruption logicielle de priorité inférieure, puis en revenant de l'interruption de priorité élevée, la fonctionnalité est appelée à la nouvelle priorité (inférieure).
la source
if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1;
L'autre interruption peut alors faire son travail et avec les interruptions brièvement désactivées, ajouter 100 à timer_count; même si la routine à 1 kHz prend plus de 10us pour s'exécuter, elle n'interférera pas avec celle à 100 kHz.Pour développer un peu la réponse de Majenko, les interruptions logicielles sont utilisées pour implémenter les systèmes d'exploitation, en particulier l'interface d'appel système. Cela signifie que les applications n'ont pas besoin d'être liées au système d'exploitation pour effectuer des appels de fonction, et le changement de contexte permet au système d'exploitation de limiter l'accès au matériel et de profiter de choses comme la mémoire protégée.
Si vous n'utilisez pas de système d'exploitation et que vous contrôlez tout le code sur le MCU, vous n'avez probablement pas besoin d'utiliser d'interruptions logicielles. (Bien que, comme Tut l'a mentionné, ils peuvent avoir d'autres utilisations.)
Les interfaces d'appel système Linux et MS-DOS sur x86 utilisent des interruptions logicielles, je vais donc les lier à titre d'exemple.
la source