Quel est le rôle de l' .s fichiers dans un projet C?
Je suis en train de travailler avec un ARM Cortex M3 puce (STM32F2) et ST fournit une "norme périphérique de la bibliothèque". Il a une certaine utilité .c et .h fichiers. Il a aussi .s fichiers.
Quel est le but de ces .s dossiers dans le cadre d'un projet C? Comment puis-je obtenir mon compilateur/linker/? de les prendre en compte?
InformationsquelleAutor Randomblue | 2012-03-21
Vous devez vous connecter pour publier un commentaire.
L' .s d'extension est la convention utilisée par GNU et de nombreux autres outils-chaînes pour assembler des fichiers.
Dernière, j'ai regardé la série STM32 Standard Périphériques de la Bibliothèque elle-même ne contient pas de fichiers assembleur, cependant la CMSIS bibliothèque contient des start-up code pour diverses STM32 pièces, par exemple startup_stm32f2xx.s est la start-up de code pour tous les STM32F2xx les appareils de la série. Il existe différentes implémentations pour différentes outil de chaînes; vous avez besoin de construire et de lier les fichiers associés à votre pièce et l'outil de la chaîne. Si vous utilisez un exemple de projet qui construit et exécute ou un IDE qui crée le cadre de projets spécifiques pour vous, ce sera probablement déjà été fait, si vous avez le code qui s'exécute, il a certainement.
La façon dont vous construisez et le lien entre le code dépend de ce que l'outil de la chaîne que vous utilisez. La plupart des IDE des outils basés sur la reconnaît automatiquement l'extension et de l'invoquer l'assembleur pour générer un fichier de l'objet qui sera lié comme les autres. Le contenu exact diffère légèrement entre l'outil de la chaîne d'versions, mais surtout crée l'environnement d'exécution C (la pile et le tas), initialise le processeur, définit une première interruption/exception vecteur de table, initialise les données statiques et les sauts de main().
La base du fichier de l'Keil/BRAS de RealView version par exemple ressemble à ceci:
Reset_Handler
est l'adresse Compteur de Programme (PC) registre sera mis à après une réinitialisation du processeur.SystemInit
est un C externe code de la fonction qui fait l'essentiel de l'initialisation - ce peut-être besoin de personnalisation pour votre matériel. Cortex-M est inhabituel en ce qu'il peut commencer l'exécution de code C immédiatement après la réinitialisation parce que le vecteur tableau comprend à la fois la réinitialisation de l'adresse et de l'initiale du pointeur de pile, l'adresse, qui est automatiquement chargée dans le registre SP sur réinitialiser. Comme un résultat que vous n'avez pas besoin de beaucoup de connaissance de l'assembleur pour en obtenir un, en cours d'exécution.__main()
est le compilateur fourni point d'entrée de votre code C. Ce n'est pas la fonction main() vous écrivez, mais effectue l'initialisation de la bibliothèque standard de données statiques, le tas avant d'appeler votre "main ()" la fonction.La version de GCC est un peu plus compliqué car il effectue une grande partie du travail effectué par
__main()
dans la Keil/BRAS de RealView version, mais essentiellement, il remplit la même fonction.Noter que dans le CMSIS
SystemInit()
est défini dans system_stm32f2xx.c, et peut-être besoin de personnalisation pour votre conseil d'administration (corriger la fréquence du quartz, de la PLL de l'installation, externe SRAM de configuration etc.). Parce que c'est du code C, et bien commenté, vous serez probablement plus à l'aise avec elle.Ils contiennent généralement du code assembleur. L'assembleur transforme en objet les fichiers qui sont liés par l'éditeur de liens avec la substance. Mais j'imagine que cela dépend du compilateur, des outils etc.
L' .les fichiers contiennent généralement le Vecteur des tables. Il définit le système lorsqu'une interruption se produit. Ce tableau (le code) est placé dans une adresse mémoire que vous avez défini dans le fichier de l'éditeur de liens. Par exemple, chaque fois qu'une réinitialisation de quoi ou plutôt, où si votre processeur de commencer à partir , ce code doit s'exécuter. de même, il existe d'autres gestionnaires ( des vecteurs d'interruption). Dans STM32 , généralement le contrôleur de boucles en particulier les gestionnaires.
Comme indiqué dans l'exemple ci-dessous:Voir ce lien pour une explication détaillée
Cette assemblée de code plus tard, est converti les fichiers objets et en lien avec votre .c fichiers et .ld créer un .d'un elfe ou d' .les fichiers bin.
Vous avez probablement un Keil-environnement de développement pour votre ST kit. Selon la version de votre compilateur, le dossier de projet ont des sections différentes pour C, C++ et assembleur. Dans votre IDE, ouvrez votre projet et de chercher des "Propriétés du Projet" ou quelque chose comme ça.
Vous pouvez importer et exporter des symboles et du code assembleur du C/C++ code lien. Avec Keil tout cela s'intègre assez bien.
L'EXPORTATION directive indique à l'assembleur pour en faire le symbole spécifié public, de sorte que votre code C/C++ peut lien.
L'IMPORTATION directive indique à l'assembleur que le symbole est défini ailleurs et sera réglé au moment de la liaison.