Fonction appelée dans l’ISR et la directive Overlay -Keil / 8051 core

Paul A.

Fonction appelée dans l’ISR et la directive Overlay -Keil / 8051 core


Mon code C a un ISR, où une décision doit être prise pour exécuter une fonction particulière « A ». Maintenant, je sais que ce n’est pas bon d’exécuter une fonction dans un ISR. Mais dans ce cas de ma candidature, je ne vois pas d’autre issue. Après avoir appelé la fonction « A », j’ai remarqué un saut soudain dans la taille des données consommées et le soudain AVERTISSEMENT L15 expliqué dans KEIL EXPLANATION OF WARNING .

Je suis certain que la fonction « A » n’est pas exécutée de manière réentrante, mais elle utilise certainement la mémoire physique; les deux fonctions « A » ainsi que les fonctions qu’il appelle. (Je pense que cela fait référence aux variables déclarées dans les fonctions).

Premièrement, y a-t-il un moyen de contourner ce tournage dans l’espace mémoire des données?

Deuxièmement, je veux appliquer la méthode 2 comme indiqué dans l’explication keil. Mais je ne sais pas comment et où exactement insérer la directive OVERLAY dans mon code. À l’initialisation? À la fonction Déclaration? Avant la définition de la fonction? Où exactement?

EXEMPLE D’AVERTISSEMENT dans mon code

 ***  WARNING L15 :  MULTIPLE CALL TO FUNCTION NAME :  _IECLOC_FUN / DATA_ACCESS CALLER1 :   ? C_C51STARTUP CALLER2 :  TIMER_ISR / TIMER 

AVERTISSEMENT SIGNIFICATION

Les corrections, suggestions, exemples de code et liens seront appréciés. J’espère que cette question est claire.

Merci a tous.

Réponses


 Michael Karas

Veuillez comprendre qu’avec Keil sur 8051 cœurs que les variables locales du sous-programme et tous les arguments d’entrée au-delà de ce qui pourrait entrer dans les registres, le compilateur alloue de la RAM pour le placement de ceux-ci. L’éditeur de liens a alors un travail compliqué à faire pour analyser la structure arborescente d’appel complète de votre programme et optimiser le pool de mémoire alloué à ces fins afin de minimiser la quantité de RAM requise. Cette minimisation utilise l’exclusion mutuelle entre les séquences d’appel de code pour déterminer quelles parties du pool de mémoire peuvent être partagées entre des chemins de code qui ne se chevauchent pas dans le flux d’exécution.

Lorsque vous injectez un appel ISR dans le mélange de l’arborescence d’appel de code, l’éditeur de liens ne peut pas déterminer à partir de quel point l’interruption peut entrer en jeu. Il peut survenir à tout moment au cours de l’un des chemins d’exclusion mutuelle trouvés par l’éditeur de liens dans le code normal de la ligne principale. Cela signifie que l’éditeur de liens doit extraire le sous-programme du pool d’utilisation partagée et allouer l’espace de données spécifiquement pour les variables locales du sous-programme et peut-être même certains de ses arguments d’entrée. Sans cela, les pools de mémoire partagée d’autres chemins d’exécution de code mutuellement exclusifs seraient pollués et le programme planterait dans une gloire flamboyante.

Le défi lors du codage sur un noyau 8051 est d’essayer de s’éloigner des conceptions qui utilisent beaucoup de variables locales, ont beaucoup d’arguments d’entrée et ont des contextes d’appel qui sont partagés entre le code principal et les interruptions. Vous devez vraiment limiter les libertés que vous obtenez avec d’autres architectures qui ont une pile qui est utilisée pour le passage des arguments de sous-routine et les variables locales. Keil a choisi de ne pas tout implémenter sur la pile et a ainsi produit un ensemble d’outils offrant des performances et une optimisation de premier ordre dans l’industrie pour l’architecture 8051. Et pour cette raison, il est important d’adapter un style de codage qui joue dans le schéma Keil.

Dans votre cas, je vous recommande vraiment de reconsidérer votre détermination selon laquelle ce sous-programme doit être appelé à la fois du contexte de la ligne principale et du contexte d’interruption. Essayez de trouver une technique de conception qui évite cela et votre vie sera beaucoup plus simple.

Paul A.

@Micheal Karas ………. des suggestions de techniques de conception?

Michael Karas

Je leur ai déjà donné. Arrêtez d’appeler des fonctions à partir d’interruptions. Si vous ne pouvez absolument pas le faire, minimisez ou éliminez mieux les variables locales dans les sous-programmes appelés à partir du contexte d’interruption. Réduisez ou mieux encore supprimez les arguments d’appel dans les routines appelées à partir du contexte d’interruption. Rendre le sous-programme appelé plat en ce qu’il n’appelle pas d’autres sous-programmes ou fonctions de bibliothèque.

Paul A.

D’accord … j’ai compris. Merci


 Dave Tweed

La directive OVERLAY est une commande de l’éditeur de liens et ne va pas du tout dans votre code source. Vous pouvez placer des directives sur la ligne de commande BL51, mais pour tout ce qui n’est pas trivial, il est généralement préférable de les placer dans un fichier de commande de l’éditeur de liens distinct et de transmettre ce fichier à l’éditeur de liens à l’aide de la BL51 @<commandfile> sur la ligne de commande.

Voir la référence de ligne de commande pour BL51 ici .

Paul A.

fredonner! Cela va plus loin que je ne le pensais!

 

/, #et, #la, 8051, appelée, Core, dans, directive, fonction, KEIL, l’ISR, Overlay

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *