Interruption logicielle vs fonction

10

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.

Roh
la source
1
Je pense que l'objectif principal de l'utilisation des interruptions est que vous pouvez continuer à effectuer d'autres tâches importantes en attendant que quelque chose d'autre se produise et lorsque les délais ne seront pas toujours constants. Je pense aussi que c'est un peu plus rapide que de voter dans la plupart des cas.
MrPhooky
1
@MrPhooky C'est du matériel que vous parlez. L'OP parle d'interruptions logicielles.
brhans

Réponses:

19

La principale différence entre une fonction et une interruption logicielle est ce que l'on appelle le contexte .

  • Une fonction s'exécute dans le contexte de votre programme principal.
  • Une interruption s'exécute dans le contexte du gestionnaire d'interruption.

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.

Majenko
la source
1
De plus, les interruptions peuvent interrompre arbitrairement la progression d'un programme afin que le système puisse faire autre chose (par exemple, des interruptions matérielles). Vos programmes n'ont pas besoin de prendre cela en compte car, du point de vue de votre programme, l'état de la fonction est inchangé depuis le moment où l'interruption s'est produite. Sur les systèmes plus anciens, c'est ainsi que les programmes TSR (Terminate / Stay Resident) ont simulé le multitâche, en déconnectant l'interruption de la minuterie / horloge. Même sans niveaux IOPL, il y avait un avantage à, par exemple, garder l'horloge du système à jour.
phyrfox
4
Notez peut-être aussi que ces "interruptions logicielles" sont également appelées "interruptions synchrones", car le code d'application sait exactement quand et pourquoi une telle interruption se produit, par opposition aux "interruptions asynchrones" qui peuvent, du point de vue de la application, se produisent essentiellement à tout moment de manière non sollicitée.
JimmyB
@HannoBinder: Je pense que l'OP parle de publier des demandes d'interruption sur le contrôleur d'interruption vectorisé Cortex-M3; si le code d'une interruption de priorité élevée en affiche une de priorité inférieure, la demande sera différée jusqu'à une date ultérieure lorsque toutes les interruptions de priorité supérieure seront terminées.
supercat
12

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

Quelle est la différence entre une interruption logicielle et une fonction?

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

Tut
la source
2
Un autre modèle courant peut être d'avoir une interruption de 100 kHz pour gérer les choses critiques pour le timing, et également besoin d'une minuterie de 1 kHz, mais pas de deux temporisations distinctes disponibles. Il ne faut pas beaucoup de temps pour qu'une routine d'interruption à 100 kHz dise 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.
supercat
De la même manière, j'ai utilisé des interruptions logicielles dans des systèmes simples (sans RTOS complet) comme pseudo-ordonnanceur, où les exigences matérielles sont gérées par les ISR, mais les fonctions de rappel et d'autres tâches longues qui sont effectuées en réponse aux changements de Les états matériels sont délégués à l'interruption logicielle.
Evil Dog Pie
Vous avez essentiellement décrit une variante de la "moitié inférieure". Avez-vous une référence pour que cela soit également appelé "interruption logicielle"? C'est une signification assez différente de la réponse de Majenko, et la question est étiquetée ARM - l'architecture a en fait l'instruction SWI (interruption logicielle).
domen
3
@domen Je ne sais pas de quel type de référence vous avez besoin. Il est appelé "interruption logicielle" car c'est ce qui est utilisé pour y parvenir. Dans le contexte d'ARM, l'OP faisait spécifiquement référence au STM32 et fournissait un lien vers le manuel de référence RM0008. Ce n'est pas un manuel de référence de base ARM. La seule "interruption logicielle" couverte par RM0008 est l'EXTI_SWIER (registre d'événements d'interruption logicielle) qui peut être utilisé pour générer des interruptions logicielles, que les broches matérielles réelles soient ou non utilisées pour les interruptions. Je n'ai pas personnellement utilisé l'instruction SWI (SWC).
Tut
Merci! Il serait peut-être bon d'inclure certaines de ces informations dans la réponse, afin de préciser de quelle «interruption logicielle» s'agit-il.
domen
7

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.

Adam Haun
la source
1
Et dans de nombreux cas où le système d'exploitation utilise des interruptions logicielles, elles sont regroupées dans des fonctions pour simplifier la vie.
hildred
1
Je programme toujours des choses (flambant neuves aussi) pour DOS, et je connais très bien les gestionnaires int 21. Presque tout ce dont j'ai besoin en termes d'E / S est géré avec DOS ISR.
R Drast
Notez que la page citée pour Linux date de 1993-1996.
un CVn du
J'ai remplacé le lien par un lien plus à jour.
Adam Haun