2015-04-16 1 views
0

Le site ARM dit que les magasins de registre de lien les informations de retour pour les sous-programmes, appels de fonctions, et des exceptions (comme les interruptions), alors quelle est la pile utilisé?Comment le registre de pile et de lien est-il utilisé dans une procédure d'interruption? (Processeur ARM)

Les réponses à this similar question indiquent que la pile est utilisée pour stocker l'adresse de retour et pour "pousser" sur les variables locales qui devront être remises sur les registres de base après l'exception.

Mais c'est ce que le registre de lien est pour, donc est pourquoi est-il nécessaire? Quelle est la différence entre les deux et comment sont-ils tous les deux utilisés?

+0

Le même manuel décrit [exactement comment l'entrée d'exception fonctionne] (http://infocenter.arm.com/help/topic/com.arm.doc.dui0497a/Babefdjc.html#BABDBGGA) sur cette architecture (les interruptions sont juste un type d'exception). Notez que Cortex-M est plutôt différent des autres architectures ARM à cet égard. – Notlikethat

+0

Il dit que l'information est poussée sur la pile, mais quelle information est-ce? – Blue7

+0

Qu'est-ce que ** it **? La [pile overflow answer] (http://stackoverflow.com/questions/1464035/what-is-a-stack-pointer-used-for-in-microprocessors) fait référence à une pile normale et non à une pile d'exception. Vous devez comprendre le contexte de l'information; C'est très probablement vous confondre. –

Répondre

1

D'accord, je pense que je comprends votre question.

Vous avez donc un code dans une fonction appeler une fonction

main() 
{ 
int a,b; 
a = myfun0(); 
b=a+7; 
... 

Ainsi, lorsque nous appelons myfun0() le registre de lien nous amène essentiellement en arrière afin que nous puissions faire le b = a + 7; Bien entendu, tout ceci est compilé et assemblé et optimisé, mais cela suffira pour comprendre que le registre de liens est utilisé pour revenir juste après l'appel.

Mais si

myfun0() 
{ 
return(myfun1()+3); 
} 

où les principaux appels myfun0() les points de registre de liaison à un code dans la fonction principale() il doit revenir. alors myfun0() appelle myfun1() il doit revenir à myfun0() pour faire un peu plus de maths avant de retourner à main(), donc quand il appelle myfun1() le registre de lien est configuré pour revenir et ajouter 3. le problème C'est quand nous avons mis le registre de lien pour retourner à myfun0() que nous avons détruit l'adresse dans main() que nous devions retourner. afin d'éviter que SI la fonction va appeler une autre fonction alors même que les variables locales qui ne peuvent pas tous vivent dans les registres à usage unique registre de lien doit être mis sur la pile. Alors maintenant les appels principaux myfun0(), myfun0() vont appeler une fonction (myfun1()) donc une copie du registre de lien (adresse de retour dans main()) est sauvegardée sur la pile. myfun0 appelle myfun1() myfun1() suit la même règle si vous appelez quelque chose d'autre mettre lr sur la pile, sinon vous n'avez pas à, myfun1() utilise lr pour revenir à myfun0(), myfun0() restituera lr de la pile afin qu'il puisse retourner à la main. suivez cette règle simple par fonction et vous ne pouvez pas vous tromper.

interrompt Maintenant, qui ne sais pas liée ou non ou peut-être que je mal compris votre question. donc le bras a des registres en banque au moins pour les noyaux non-cortex-m. mais en général, lorsqu'une interruption/exception se produit si le gestionnaire d'exceptions doit utiliser les ressources/registres utilisés par la tâche de premier plan, ce gestionnaire doit conserver ceux de la pile de telle sorte que la tâche de premier plan qui a été interrompue Aucune idée de ce qui s'est passé puisque les interruptions en général peuvent souvent se produire entre deux instructions, vous devez donc même aller jusqu'à préserver les drapeaux qui ont été définis par l'instruction avant celle que vous avez interrompue. Donc, appliquez cela pour armer, vous devez regarder quelle architecture vous utilisez et voir où il décrit le processus d'interruption quels registres vous devez conserver et lesquels vous n'avez pas, quel pointeur de pile est utilisé, etc (quelque chose que vous avoir à configurer bien avant vos premières exceptions, si vous utilisez un bras avec une pile d'interruption séparée et des piles forground). Le cortex-m est conçu pour faire tout ou partie de ce travail pour vous, il a une pile essentiellement et à l'interruption il pousse tous les registres sur la pile pour que vous puissiez simplement avoir une fonction compilée C juste courir comme un gestionnaire et le matériel nettoie après vous (à partir d'une perspective de registre préservé).Certaines autres familles de processeurs font quelque chose comme ça, ils peuvent avoir un retour d'instruction d'interruption séparé d'une instruction de retour, on est là parce que le matériel sauve les drapeaux et l'adresse de retour mais pour un simple appel vous n'avez pas besoin des drapeaux conservés . Le bras est beaucoup plus flexible que d'autres jeux d'instructions, d'autres vous n'avez pas d'instructions qui vous permettent de vous connecter à une adresse dans n'importe quel registre où vous voulez avoir une limitation. Vous pouvez être limité sur quel registre vous utilisez comme pointeur de pile ou le pointeur de pile lui-même n'est pas accessible en tant que registre général. par convention, le sp est 13 dans le bras, ils permettent la pseudo instruction de push et pop qui se traduit par le bon ldmia r13! {blah} et stmdb r13!, {blah} mais vous pouvez choisir le vôtre (si vous n'utilisez pas de compilateur qui suit la convention ou peut changer un compilateur open source pour utiliser un registre de pointeur de pile différent). le bras ne l'empêche pas. la magie du registre de liaison r14 n'est rien de plus qu'un échange de lien de branche ou de lien de branche modifie automatiquement r14, mais le jeu d'instructions vous permet d'utiliser fondamentalement n'importe quel registre pour embrasser/retourner des appels de fonction normale. Le bras a juste assez de registres à usage général pour encourager les compilateurs à faire des paramètres basés sur le registre en passant par la pile uniquement. Certains processeurs s'appuient uniquement sur le passage de paramètres de pile et ont conçu leurs instructions d'adresse de retour pour être strictement basées sur la pile en évitant un registre de retour tous ensemble et une règle pour devoir l'enregistrer si l'imbrication fonctionne. Toutes ces approches ont des avantages et des inconvénients, dans le cas où le passage du registre des bras était souhaitable et une adresse de retour basée sur le registre, mais pour les fonctions d'imbrication, vous devez conserver l'adresse de retour à chaque niveau d'imbrication. De même, pour les interruptions, vous devez remettre les choses à leur place, ainsi que vous pouvez revenir à l'endroit où vous avez interrompu le premier plan.

+0

C'est exactement l'information que je cherchais. Merci! – Blue7