prioriser les interruptions

Bonjour, a force de "surfer" sur la toile, j'ai fini par trouver des exemples pour utiliser et maintenant comprendre comment utiliser les Timers.

Actuellement j'ai un projet qui utilise 3 INT.
La 1ere par le timer2.
Les 2 autres par INT(0) sur pin(2) et INT(1) sur pin(3).

Maintenant j'envisage d'utiliser 2 autres INT et j'ai trouvé la solution:

https://www.locoduino.org/spip.php?article64

j'aurai donc: Timer2. Plus 4 INT venant de A1,A2,A3,A4 (A1 remplacant INT0(pin2) et A2 INT1(pin3).

Mon problème est que je voudrais prioriser A1 sur les 3 autres et Timer1, puis A2 sur les 2 autres et Timer2 ... En fait créer une hiérarchisation...
Je ne sais pas si c'est possible. Dans mon jeune age (HI) je programmais en assembleur et je me souvient qu'il était possible de le faire (mais plus si c'était par le soft ou si certaines entrées générant des INT étaient prioritaires les unes par rapport aux autres..

Merci de votre aide.

Selon ma mémoire et http://jmfriedt.free.fr/TP_Atmega32U4_interrupt.pdf, les avr n'ont pas de priorités associées au materiel, la "solution" que je vois consiste à faire des routines d'interruption ultracourtes (positionnent un flag) et scruter plus souvent certains flags que d'autres. (les Tiva de texas ont un mécanisme de priorité)

Pour info, avec la carte DUE (ARM 32-bit), il est possible de définir les priorités des interruptions (jusqu'à 15 niveaux distincts dans la version de base) avec NVIC_SetPriority().

Le DUE n'est pas un avr -8 bits- , mais un arm (comme les tivas) . LA description qu'il donne laisse penser qu'il a un avr...

Bonjour,

C'est vraiment ultra-rare qu'on ait besoin de prioriser les interruptions sur un micro-contrôleur.
Ca veut dire que le microprocesseur doit arbitrer entre deux interruptions qui arrivent dans le même cycle d'horloge. C'est plutôt (ultra) rare!
Ca peut aussi se produire si les interruptions se produisent pendant que les interruptions sont masquées (traitement d'une interruption), c'est pour ça (entre autres) que le traitement d’interruption doit être le plus court possible).

D'autre part, est ce que tu as bien compris que A1,A2,A3,A4 partagent la même interruption et que ce ne sont pas 4 interruptions, donc pas question de priorité d'interruption entre ces entrées.
Dans ta routine d'interruption, tu peux décider dans quel ordre tu traiteras les entrées.

Si on parle maintenant non pas de priorité d'interruption, mais d'autoriser une autre interruption pendant le traitement d'interruption, il faut réautoriser les interruptions en mettant à 1 le flag d'interruption global pendant le traitement d'interruption (à manipuler avec précaution).

Peux tu nous en dire plus sur ton application qui nécessite de prioriser les interruptions?

"Ca peut aussi se produire si les interruptions se produisent pendant que les interruptions sont masquées (traitement d'une interruption), c'est pour ça (entre autres) que le traitement d'interruption doit être le plus court possible)."
Les demos de tivas (je jouais avec il y a 4 ans) mettaient, pour illustrer ce cas là, des interruptions *très longues (pas du tout ce qu'il faudrait faire: des delays logiciels bien bloquants, des transmissions série....). J'étais un peu horrifié.

Merci à tous pour vos réponses.
C'est dans un projet de station météo ou je vais avoir 2 moyens de détections de la pluie qui fonctionne chacun avec une INT.... et mon soucis est:
Si l'info ( Mise à 0 des 2 entrées se passe en même temps) es ce que je ne vais pas perdre une des infos. Maintenant sur le RG11 le créneaux est de quelques millisecondes et sur le pluviomètre à auget c'est la largeur de l'aimant et la vitesse de basculement de l'auget qui fait le temps du créneau. Mais le mode "FALLING" ne changeras pas le problème.

en utilisant l'exemple des INT su A1 A2 A3 A4 le croquis teste les entrées une a une:
void loop() {
if (trigger != 0){
total++;
if (trigger == 1) inta++;
if (trigger == 2) intb++;
if (trigger == 3) intc++;
Serial.print(total);
Serial.print(" || ");
Serial.print(inta);
Serial.print(" | ");
Serial.print(intb);
Serial.print(" | ");
Serial.println(intc);
trigger = 0;
}
}
je vais faire une simulation avec un générateur de créneaux ( voir post précédent) avec lequel je déclencherais des INT avec quelques millis de décalage.
Je vous tiendrais au courant.. des résultats.
Bonne soirée.

C'est vraiment ultra-rare qu'on ait besoin de prioriser les interruptions sur un micro-contrôleur

yo kamill, chez-moi c'est ultra fréquent :slight_smile:
il y a 2 types de priorités :

  1. priorité pour les interruptions en attente (ou oui, rarement, qui se produisent en même temps)
    pour certains mpu y'en a pas, pour les avr c'est fixé selon le périphérique, pour d'autres c'est programmable

  2. interruption d'une interruption en cours par une interruption + prioritaire
    n'existe pas chez avr (semble-t-il pour les nouveaux ?). Quand il y a plusieurs niveaux de priorité ils sont programmables

pour mémoire, pour les vieux pics, c'était simple car il n'y avait pas de vecteurs d'interruption : il fallait aller voir quel périphérique l'a provoqué, et on commençait simplement par regarder les + urgents

pour les avr, mettre le flag logiciel comme dit et redit
si il y a vraiment le feu, on peut auparavant jeter un œil sur le flag matériel du + prioritaire, le traiter hors interruption, puis revenir sur l'interruption en cours pour positionner le flag logiciel et sortir (bon, là c'est plutôt pour voir si vous suivez :o )