0
votes

Compiler Keil Bras: Y a-t-il un moyen de crochet dans la même fonction pour deux interruptions sans modifier la table des vecteurs d'interruption?

Dans un projet intégré, j'ai besoin de gérer deux interruptions externes différentes avec le même gestionnaire IRQ. Je ne veux pas changer directement les entrées de table de vecteur d'interruption dans l'assemblage de démarrage, de sorte que je dois rester avec les noms de fonction prédéfinis pour les routines IRQ-Handler (EXTI9_5_IRQHANDLER et EXTI15_10_IRQHHANDLLER).

Pour les deux interruptions, j'ai besoin le même code exactement pour gérer l'interruption.

Bien sûr, je peux programmer ceci comme ceci: xxx

Cela finira par faire ce que je veux, mais Il aura un appel de fonction ordinaire avec la surcharge de poussée et de restauration des registres à la pile dans chaque invocation d'interruption.

est un moyen de remplacer ces appels de fonction dans exti9_5_irqhandler et exti15_10_irqhandler d'une manière ou d'une autre et remplacez-le par une branche inconditionnelle ou un saut?

Que serait nécessaire à la fin de Realirqhandler lors de la sortie / à la sortie?

merci! Salutations, Felix


1 commentaires

Je ne pense pas qu'il devrait y avoir Toute surcharger significative ici .


4 Réponses :


1
votes

Vous pouvez indiquer le compilateur à inline realirqhandler .

Sinon, vous n'avez rien sur la pile dans exti9_5_irqhandler ou exti15_10_irqhandler , et realirqhandler ne prend aucun paramètre ni ne renvoie rien . La seule chose que vous appuierez sur la pile est le pointeur de l'image.

ou, vous pouvez utiliser goto .

Edit: Selon le niveau d'optimisation que vous avez choisi, le compilateur peut simplement effectuer un simple échange de branche, ce qui est plus ou moins un goto .


0 commentaires

2
votes

Je ne veux pas changer les entrées de table d'interruptions de vecteur dans l'assemblage de démarrage directement

C'est le problème. Le seul solution correcte à la table est de modifier la table de vecteur. Par conséquent, la table de vecteur ne doit pas être définie dans certains fichiers de démarrage, mais dans un fichier à part entière. Soit un script de liaison ou un fichier .C (tableau des pointeurs de fonction).

Si vous ne pouvez pas modifier la table de vecteur, vous ne pouvez pas faire de programmation de microcontrôleur sur votre chaîne d'outils. Donc, si votre compilateur / liant ne peut pas fournir un moyen simple de le faire, vous devrez personnaliser le code de démarrage.


1 commentaires

C'est la boîte à outils Keil V5 et celle-ci a la table de vecteur définie dans son démarrage. Croyez-moi, je n'ai pas opté pour avoir choisi cette boîte à outils. C'est mon client qui m'a dit ce qui est bon pour moi. Et c'est mon client qui ne veut pas que je change de table directement.



0
votes

Quelque chose n'est pas cohérent: il semble que votre durée de manutention d'interruption est très critique (puisque vous voulez éviter les appels de fonction, il est en même temps que vous souhaitez utiliser la même fonction pour deux interruptions. Ce qui signifie que cette fonction devra faire le "travail supplémentaire" de vérifier si l'interruption EXTI9_5 ou ETXI15_10 a été affirmée. Ne serait-il pas plus efficace d'avoir deux fonctions différentes, une pour chaque ligne d'interruption? Ou au moins transmettre le numéro d'interruption sous forme de paramètre sur realirqhandler ?


3 commentaires

L'application de mon idée est la suivante: il y a deux interruptions (lignes prêtes à l'emploi) qui sont censées être faibles dans le même temps même . Cependant, l'un d'entre eux sera certainement le premier, mais je ne sais pas quoi sur ce sera. Et donc j'ai pensé à utiliser le gestionnaire IRQ pour réagir à l'une ou l'autre et commencer une attente occupée à l'autre. Si cela est sorti, ils ne sont pas synchronisés et le système passe en erreur. Le temps d'exécution total n'est pas si crucial. L'idée de la mettre en une seule fonction est plus due à la maintenance du code et à la "poshness" et que je veux savoir comment cela fonctionnerait.


Passer le numéro IRQ comme paramètre est une très bonne idée. Je vais considérer cela.


@ Opt12 Soyez prudent car il semble que Realirqhandler sera réentrant (si un gestionnaire est interrompu par l'autre interruption, qui peut se produire en fonction des priorités d'interruption ou de la commande de déclenchement). Également occupé à attendre dans un gestionnaire IRQ n'est pas toujours la meilleure solution car cela pourrait entraîner une impasse.



0
votes

essayez d'essayer en désassemblant le code compilé, mais le commentaire de @groo est complètement correct.

Je ne pense pas qu'il devrait y avoir Toute surcharger significative ici

Si votre fonction a le même prototype que le gestionnaire d'interruptions (AKA VOID REALIREQHANDLER (VOID) ) Le compilateur ne fera aucun aérien.


0 commentaires