2017-03-09 2 views
3

La documentation des noyaux ARM Cortex-M indique que, lors d'une entrée d'exception, un tramage de pile est effectué. Ceci entraîne les registres R0, R1, R2, R3, R12, LR, PC, xPSR à être poussés sur la pile en cours. Ma question est pourquoi est-ce de cette façon que de pousser ces registres et pas tout le contexte? Par exemple, si certaines données étaient dans le registre R5, elles seront écrasées si le gestionnaire d'exceptions utilise ce registre.



La fonction compilée d'un gestionnaire d'exceptions proprement dit pousse certains registres (ainsi que toutes les autres fonctions régulières, car la fonction du gestionnaire d'exception ne fait pas de différence), mais après plusieurs déboguages , parce que différentes variations de registres sont poussées puis restaurées.Entrée d'exception ARM Cortex-M et cadrage de pile

Répondre

8

Pourquoi est-ce que cette façon de pousser seulement ces registres et pas tout le contexte ?

Pour améliorer le temps de réponse d'interruption. Moins d'opérations de pile signifie que le gestionnaire peut démarrer plus rapidement. Par exemple, si certaines données étaient dans le registre R5, elles seront remplacées par si le gestionnaire d'exceptions utilise ce registre.

Ensuite, il est de la responsabilité du gestionnaire d'enregistrer R5.

fonction Compilé d'un gestionnaire d'exception se pousse certains registres (ainsi que toute autre fonction régulière, parce que la fonction gestionnaire d'exceptions est pas de différence)

C'est intentionnel. Une fonction appelée doit conserver le même ensemble de registres qu'un gestionnaire d'interruption (R4-R11 et SP). Donc, si une fonction normale veut utiliser R5, il faut aussi bien l'enregistrer quelque part et la restaurer plus tard (voir le Procedure Call Standard for the ARM® Architecture pour plus de détails). De cette façon, un compilateur peut traiter les fonctions d'interruption de la même manière que les fonctions normales.

ce n'est pas toujours le cas, car les différentes variantes de registres sont poussées puis restaurées. Si une fonction compilée écrase un registre dans la plage R4-R11 sans l'enregistrer et la restaurer, ou ne restaure pas correctement le PC ou le SP, votre compilateur est interrompu, point.

+1

Je souhaite que toutes les réponses dans ce forum étaient comme ceci. Clair, simple, avec des références. Je vous remercie! –