2017-09-17 4 views
1

Alors j'essaye d'écrire un système d'exploitation baremetal sur un cortex-a8 armV7 en utilisant GCC et j'ai rencontré un petit problème. Après avoir fini de configurer l'environnement C dans l'assemblage et que je suis passé à l'état principal, j'ai remarqué que mon cadre de pile n'était pas correctement suivi. Après avoir été inspecté, il semble que le registre LR soit poussé sur la pile en tant que fonction appelée main() et qui détraque le débogueur.À quoi dois-je définir LR avant d'appeler main() dans un processeur intégré?

Problème disparaît si je règle LR à 0 - mais est-ce la bonne façon de faire face à cela?

+2

Peut-être utile d'inclure un fragment de votre code de démarrage - la préparation et l'appel de '__main' et la gestion si' __main' devrait retourner. Généralement, si le retour principal, vous appelez une boucle sans fin, forcez une réinitialisation, ou appelez un gestionnaire d'exception - de toute façon, LR ne sera pas utilisé, donc peu importe ce que vous le définissez, mais le débogueur n'a pas le choix d'interpréter si elle est non nulle car elle n'a pas connaissance de la profondeur d'appel. – Clifford

+0

Peut être que vous pouvez modifier l'instruction de '' 'BL main''' à' '' B main''' de l'assemblage. Voir http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489e/Cihfddaf.html pour plus d'informations. – RuSh

+0

Zéro est typique de l'ancien ARM ABI (APCS et '-mapcs-frame'). L'AAPCS peut être marqué avec 'cant undwind', mais alors vous avez besoin de beaucoup de tables d'exception, au moins là où une trace de pile aura lieu. Donc, la réponse dépend. [Voici une approche intéressante] (http://www.mcternan.me.uk/ArmStackUnwinding/). –

Répondre

2

Le document Exception handling ABI for the ARM architecture suggère ceci:

L'environnement d'exécution doit assurer un dérouleur de pile ne peut pas aller au-delà de la région de pile valide, peut-être en marquant l'appelant de main() comme EXIDX_CANTUNWIND.

Cela devrait se produire si vous utilisez la directive .cantunwind dans votre code de démarrage.