2016-12-27 2 views
0

Je lisais sur les microcontrôleurs de démarrage dans le livre appelé Programming Embedded Systems - Avec C et GNU Development Tools, 2e édition (Michael Barr, Anthony Massa), éditeur: O'Reilly, puis j'ai trouvé que l'un des les étapes de démarrage sont l'initialisation matérielle qui se produit avant le démarrage et les informations que j'ai trouvées dans le livre sur le matériel init. est:..les fonctions d'initialisation matérielle

« La plupart de l'initialisation du matériel réel a lieu dans la deuxième étape à ce point, nous avons besoin d'informer le processeur de son environnement C'est aussi un bon endroit pour initialiser le contrôleur d'interruption et d'autres critiques périphériques. périphériques moins critiques peuvent être initialisés lorsque le périphérique associé pilote est lancé, généralement à l'intérieur principal.

la routine d'initialisation du matériel, hw_init, devrait commencer par l'initialisation de la configuration de l'interface mémoire registres pour informer le processeur à propos de le autres périphériques mémoire et périphériques sont installés sur le tableau. Au moment où cette tâche est terminée, toute la gamme des adresses ROM et RAM sera activé, de sorte que le reste de votre logiciel peut être situé à une adresse pratique soit ROM ou RAM. »

mais je recherché pour plus d'informations à ce sujet dans google mais seulement les résultats trouvés sur le code de démarrage et presque rien sur l'initialisation du matériel, je veux en savoir plus que fait-il

+0

Il écrit une valeur initiale dans chaque registre du micro-contrôleur. Vous devez donc obtenir la fiche technique du microcontrôleur et décider quelle valeur vous voulez mettre dans chaque registre. – user3386109

+0

presque jamais avez-vous besoin de toucher jamais enregistrer, la documentation montre ou devrait l'état post-reset et vous n'avez pas nécessairement besoin de toucher ceux qui sont dans l'état que vous voulez, en supposant que votre init est post-reset. sinon le plus simple est une réinitialisation partielle d'un bloc puis touchez ceux que vous n'aimez pas par défaut car, dans le pire des cas, touche la majeure partie du registre dans un bloc. –

+0

J'ai une fois démonté un programme AVR et je n'ai trouvé aucune initialisation matérielle avant le code de démarrage, la réinitialisation saute immédiatement au code de démarrage alors où est-il écrit? –

Répondre

1

L'initialisation matérielle est spécifique à votre application, donc il n'y a pas J'ai donné quelques exemples ci-dessous:

Un des produits que nous fabriquons Neats un microcontrôleur ARM qui communique sur le bus CAN au reste du système et utilise PWM pour contrôler la luminosité des LED. L'initialisation matérielle signifie dans ce cas que nous devons configurer le périphérique CAN pour la vitesse de la vitesse du bus CAN et l'ID CAN de l'appareil. Nous devons également configurer les minuteries pour PWM.

Un autre produit que nous faisons parler à un capteur GYRO via SPI. Ainsi, l'initialisation matérielle de ce produit comprend également la configuration de SPI et l'envoi de messages via SPI pour initialiser le capteur GYRO. Le microcontrôleur à l'intérieur d'un clavier pour un PC doit configurer ses broches GPIO pour balayer les lignes et les colonnes du clavier et doit également initialiser le périphérique USB pour qu'il puisse parler au PC auquel il est attaché.

Chaque microcontrôleur possède un certain nombre de périphériques. Selon votre application, vous choisissez un microcontrôleur. Le code d'amorçage de votre application doit initialiser (ou configurer) les périphériques dont vous avez besoin.

Configurer un périphérique signifie écrire des valeurs dans les registres du périphérique pour le programmer afin d'exécuter la fonction souhaitée.

La plupart des microcontrôleurs sont livrés avec une bibliothèque logicielle capable de réaliser la plupart des initialisations matérielles. Il peut, par exemple, configurer un port série pour vous. Vous n'avez qu'à indiquer quel U (S) ART vous voulez utiliser et quelle vitesse de transmission vous avez besoin. Voir here pour le port série sur l'Arduino.

+0

donc, je peux dire des exemples d'initialisations matérielles appliquent la carte mémoire sur le périphérique de mémoire, initialiser et configurer la mémoire et les registres de périphériques pour pouvoir démarrer et configurer le processeur pour pouvoir interfacer avec la mémoire et les périphériques comme le puce-sélectionne –

+0

C'est correct. La plupart des microcontrôleurs ont de la mémoire interne et vous dites à votre compilateur (croisé) quel est le type et la taille de la mémoire (RAM et ROM, principalement Flash). – NZD

+0

J'ai une fois démonté un programme AVR et je n'ai trouvé aucune initialisation matérielle avant le code de démarrage, la réinitialisation saute immédiatement au code de démarrage donc est-ce parce que cip est un système simple qui n'a besoin que de bits de fusible comme initialisation matérielle? –

1

Les sources de code de démarrage arduino sont disponibles, vous pouvez vous promener parmi celles-ci pour voir ce qu'elles font.

La façon dont un processeur (noyau) démarre est très spécifique à cette architecture et éventuellement à sa version ou variation (la famille avr a un certain nombre de variations). Vous pouvez alors envelopper une puce autour de lui, quelque chose de mince comme un processeur où la plupart des périphériques et des ressources sont dans d'autres puces, ou comme un microcontrôleur ou un système sur une puce où beaucoup sinon toutes les ressources sont sur puce. Les avers atmel sur les arduinos sont des microcontrôleurs, il y a une bonne quantité de ressources sur la puce, bien que vous pourriez être assez content d'avoir des applications entières dans la puce quel est le point s'il n'y a pas d'interface utilisateur (boutons, etc) ou quelque chose pour rendre la puce utile à un humain? (l'éducation certainement mais finalement vous voulez un certain nombre d'interfaces hors puce)

Avec l'AVR, le noyau de processeur et la compagnie de morceau sont la même compagnie, ils possèdent/contrôlent le tout, autrefois atmel maintenant la puce (espèrent qu'ils ne ruin atmel), de sorte que vous pouvez aller sur leur site pour toutes les informations, le noyau du processeur et les informations de la puce. Et les jetons sont, espérons-le, similaires entre les familles. Avec ARM par exemple, si l'armement possède le cœur du processeur, et d'autres sociétés de puces, beaucoup d'entre eux, enveloppent leurs propres trucs autour d'eux, ce qui signifie que vous devez vous armer pour obtenir des informations et la puce pour le reste. Les choses enroulées autour des bras varient considérablement dans le monde des armes, car chaque fournisseur de puce ne va pas rendre leur matériel compatible avec d'autres sociétés de puces, pour diverses raisons, y compris la protection juridique de leur propriété intellectuelle. Donc, vous devez d'abord comprendre comment le processeur démarre, il y a deux façons principales, l'une est une table d'adresses, l'adresse de réinitialisation, l'adresse d'interruption, peut-être des fautes ou d'autres interruptions. Le programmeur remplit cette table (qui est dans une sorte de mémoire non volatile (habituellement mais pas nécessairement) comme flash ou rom) et ces adresses pointent vers le code pour gérer ces événements.

Ensuite, vous écrivez le code pour gérer ces événements, celui que vous semblez demander est l'événement de réinitialisation. Et comme répondu, il devient très spécifique à la puce et à l'architecture. Tout d'abord vous (mais pas toujours, ces exceptions sont infinies car toutes les architectures et puces ne sont pas conçues exactement de la même manière, tout comme le démarrage d'un modèle est différent de démarrer une tesla même si elles sont toutes deux à quatre roues) pour définir le pointeur de la pile pour pointer sur une mémoire que vous et les concepteurs de puce/système connaissez l'adresse. Pour démarrer le processeur, il se peut que vous deviez initialiser certains registres à usage général, mais généralement pas, peut-être configurer des options de processeur, etc. Peut-être que vous voulez activer un cache ou quelque chose. Ce code est généralement mais pas toujours en mémoire non volatile, en lecture seule, donc vous devrez peut-être configurer le RAM, parfois pas particulièrement avec un microcontrôleur. Vous pouvez ensuite configurer certaines horloges, communes aux microcontrôleurs et aux processeurs, mais les détails sont très spécifiques aux puces et aux systèmes. Pas toujours mais beaucoup de microcontrôleurs ont des oscillateurs RC intégrés (condensateur de résistance, dépend de la vitesse des électrons, génère une oscillation, une machine à mouvement perpétuel si vous voulez) mais ils ne sont pas très précis, donc si vous avez besoin de précision ou utilisez un fusible dans les paramètres de réglage, ou souvent vous voulez passer à un oscillateur à quartz, mais c'est spécifique à la carte et vous devez suivre une procédure spécifique à la puce pour passer à cet oscillateur. Vous pouvez également utiliser un PLL si vous avez un sur puce pour multiplier la vitesse de cet oscillateur, peut-être faire une horloge externe 8Mhz dans une horloge 48Mhz dans la puce. Ainsi, les drapeaux, l'horloge, la mémoire, la pile ne sont pas nécessairement dans cet ordre. Et peut-être quelques autres choses. Suivant les périphériques, peut-être votre application veut utiliser le contrôleur uart et le spi et deux minuteurs. Eh bien, vous devez les mettre en place, tous très spécifiques à la puce. Parfois, vous devez activer les horloges sur le périphérique qui sont désactivées à la réinitialisation pour économiser l'énergie. Puis selon le mode que vous souhaitez utiliser ces périphériques génériques vous devez les configurer pour votre application. Répétez jusqu'à ce que tous ceux qui sont configurés.

Et puis votre application peut devoir faire ce qu'il faut pour initialiser, peut-être vous avez un capteur de température, un affichage et une carte SD sur le bus spi ou les bus.Vous devez parler à ceux-ci et initialiser ces périphériques en fonction de leurs règles et procédures.

Éventuellement des dizaines à des dizaines de milliers de lignes de code plus tard, votre application peut commencer à faire ce qu'elle veut. L'arduino a un chargeur de démarrage qui est une caractéristique de la puce avr, et est certainement utilisé par les concepteurs et les outils Arduino. Si vous réinitialisez la puce avec l'une des broches affirmée dans un sens, elle charge son chargeur de démarrage en tant qu'application par une fonctionnalité de la puce. Si vous affirmez que l'épingle dans l'autre sens puis réinitialiser puis il démarre à partir de l'application flash, en cours d'exécution de votre application. Au moins avec l'interface série, les familles de puces AVR ont quelques façons différentes dans le chargeur de démarrage ou de la logique qui peut être utilisée pour reprogrammer l'application flash "en circuit". Les anciens jours d'Arduino c'était une interface de port série (uart), avec un protocole simple basé sur un produit Atmel, mais ils en ont arraché une grande partie si vous regardez leur bootloader et écrivez votre propre programme loader plutôt que d'utiliser avrdude ou le sandbox Arduino. De toute façon, c'est une solution très courante et les microcontrôleurs ont tendance à avoir une ou plusieurs façons dans la puce de programmer puis dans le circuit que ce soit un chargeur de démarrage ou une logique ou une combinaison quelconque.

Ce chargeur de démarrage est une application complète en soi, son but est de fournir une interface pour lui demander de réécrire un flash pour vous. Etant une application complète, elle doit faire tout ce qu'une application fait, être amorçable par le processeur, configurer les ressources/périphériques et continuer à exécuter dans le code de l'application principale.

Alors vous pouvez aller sur le site Atmel et peut-être regarder les microcontrôleurs attiny avr les plus simples, ou regarder votre arduino et trouver la famille de puces que vous avez et télécharger les ressources. Les noms des documents varient d'un fournisseur à l'autre. Généralement, une feuille de données comprend les définitions de brochage et de broche, les informations de commande de la pièce (options pour les numéros de pièces pouvant inclure le nombre de broches, etc.) et informations électriques. Certains fournisseurs toutes les informations de programmation sont dans la fiche technique, un peu ou pas dans la feuille de données et vous avez besoin d'une forme de manuel de référence ou manuel d'utilisateur ou un autre nom, parfois il y a un manuel de famille périphériques possibles puis la fiche technique vous indique lequel de la liste possible de cette puce et où (adresse du processeur) ils vivent. Une bonne partie du travail d'initialisation du matériel est la recherche, la recherche des documents pour la carte et/ou la lecture des schémas, ou si votre entreprise envoie la carte aux ingénieurs du matériel et lui pose des questions si leur contenu est incompréhensible ou complet (souvent il n'y a pas de raison de le documenter complètement s'il y a cette personne et vous, des notes sur un tableau blanc ou des messages Skype ou un courriel suffisent à un document long dont vous n'avez pas vraiment besoin). Les docteurs vendeurs de puces ont presque toujours des erreurs donc le piratage faute d'un meilleur terme est nécessaire pour voir si les bits dans les registres font ce que le doc dit ou si vous pouvez comprendre ce qu'ils font en les piquant ou en lisant leur exemple de code ou autre code source ouvert. Sauf pour des applications très spécifiques pour des systèmes très spécifiques, vous allez trouver un seul endroit avec toutes les informations d'initialisation matérielle dont vous avez besoin.