BRAS de chargeur de démarrage: Vecteur d'Interruption de la Table de Compréhension
Le code qui suit est la première partie de u-boot pour définir le vecteur d'interruption de la table, et ma question est de savoir comment chaque ligne seront utilisés. Je comprends les 2 premières lignes qui est le point de départ et la première instruction à mettre en œuvre: reset, et nous définissons réinitialiser ci-dessous. Mais quand allons-nous utiliser ces instructions ci-dessous? Selon le Système.carte, chaque instruction a une adresse fixe, de sorte _fiq est à 0x0000001C, lorsque l'on veut exécuter la fiq, nous allons copier cette adresse dans le pc, et puis l'exécuter,à droite? Mais de quelle manière pouvons-nous sauter à la présente instruction: ldr pc, _fiq? Il est réalisé par le matériel ou le logiciel? De l'espoir, je me faire comprendre correctement.
>.globl _start
>_start:b reset
> ldr pc, _undefined_instruction
> ldr pc, _software_interrupt
> ldr pc, _prefetch_abort
> ldr pc, _data_abort
> ldr pc, _not_used
> ldr pc, _irq
> ldr pc, _fiq
>_undefined_instruction: .word undefined_instruction
>_software_interrupt: .word software_interrupt
>_prefetch_abort: .word prefetch_abort
>_data_abort: .word data_abort
>_not_used: .word not_used
>_irq: .word irq
>_fiq: .word fiq
ldr pc, _fiq
est traduit comme ldr pc, [pc, #_fiq-offset]
. Donc, le mot valeur à _fiq est chargé dans le PC. C'est à dire, vous placez un pointeur de fonction à l'adresse _fiq
. Pour commencer, il sera NULL; plus tard, les gens peuvent remplir. Les interruptions ne sont pas activées dans u-boot par défaut. Voir: l'Activation des interruptions dans u-boot sur les BRAS.
OriginalL'auteur | 2014-01-23
Vous devez vous connecter pour publier un commentaire.
Si vous comprenez de réinitialisation, alors vous comprenez tous.
Lorsque le processeur est réinitialisation matérielle définit le pc à 0x0000 et commence à s'exécuter par l'extraction de l'instruction à 0x0000. Lorsqu'un indéfini instruction est exécutée ou essaie d'être exécuté le matériel répond en mettant le pc à 0x0004 et commence l'exécution de l'instruction à 0x0004. irq interruption, le matériel termine l'instruction qu'il est en cours d'exécution commence l'exécution de l'instruction à l'adresse 0x0018. et ainsi de suite.
Maintenant, bien sûr, en plus de la modification de la pc et de départ de l'exécution de ces adresses. Le matériel permettra d'économiser de l'état de la machine, commutateur de modes de processeur si nécessaire, puis de lancer l'exécution à la nouvelle adresse à partir du vecteur de la table.
Notre travail en tant que programmeurs est de construire les binaires tels que les instructions que nous voulons être exécuté pour chacune de ces instructions est à la bonne adresse. Le matériel fournit un mot, d'une instruction pour chaque emplacement. Maintenant, si vous n'avez jamais s'attendre à avoir une de ces exceptions, vous n'avez pas à avoir une succursale à l'adresse zéro par exemple, vous pouvez juste avoir votre démarrage du programme, il n'y a rien de magique à propos de la mémoire à ces adresses. Si vous vous attendez à avoir ces exceptions, alors vous avez deux choix pour les instructions d'un mot et peut sauter hors de la voie de l'exception, qui suit. L'un est une branche de l'autre est une charge pc. Il y a des avantages et des inconvénients à chaque.
vous êtes à confusion, cortex-m, avec régulièrement des cœurs arm. régulier des cœurs arm sont comme ci-dessus, ils exécuter l'instruction à l'adresse dans la table d'exception. le cortex-m cœurs c'est un vecteur de table avec le vecteur nul étant la valeur de la charge pour le pointeur de pile et le décalage de 4 le vecteur de reset sur le réinitialiser charge le pointeur de pile de la table vectorielle puis commence l'exécution sur le vecteur de reset adresse
OriginalL'auteur old_timer
Lorsque le matériel prend une exception, le compteur de programme (PC) est automatiquement définie à l'adresse de l'exception vecteur et le processeur commence à exécuter les instructions à partir de cette adresse. Lorsque le processeur vient de réinitialisation, le PC est automatiquement mis à
base+0
. Indéfini des jeux d'instruction du PC pourbase+4
, etc. L'adresse de base de la table vectorielle (base
) est soit 0 x 00000000, 0xFFFF0000, ouVBAR
en fonction du processeur et de la configuration. Notez que cette marge de manœuvre limitée dans la zone où le vecteur de la table est placé et vous aurez besoin de consulter le BRAS de la documentation en conjonction avec le manuel de référence de l'appareil que vous utilisez pour obtenir la bonne valeur à être utilisé.La disposition de la table (4 octets par exception), impose immédiatement la direction du vecteur à l'exception handler. Les raisons de la
LDR PC, label
approche est double - parce qu'un PC relatifs à la branche est limité à (24 << 2) bits (+/-32 MO) à l'aide deB
restreindraient la disposition du code dans la mémoire un peu; par le chargement d'une adresse absolue, le gestionnaire peut être situé n'importe où en mémoire. Deuxièmement, elle rend très simple de changer les gestionnaires d'exception lors de l'exécution, en écrivant une adresse différente à cet endroit, plutôt que d'avoir à les assembler et en utilisant le hotpatching une branche de l'enseignement.Il n'y a que peu de valeur pour avoir un remappable vecteur de reset de cette façon, cependant, qui est pourquoi vous avez tendance à voir que celui mis en œuvre comme une simple branche de sauter par-dessus le reste des vecteurs de la véritable point d'entrée de code.
OriginalL'auteur Notlikethat