Télécharger le fichier original (Mémoire de fin d’études)
LA TECHNOLOGIE ARM CORTEX-M3/M4
VUE INTERNE DE L’ARM CORTEX-M3
Le processeur Cortex-M3 contient non seulement le cœur du processeur, mais aussi un certain nombre de composants pour la gestion du système, ainsi que de composants de débogage. Ces composants sont reliés entre eux en utilisant un bus à haute performance (AHB), et un bus périphérique avancé (APB : Advanced Peripheral Bus). Les AHB et APB font partie des normes Advanced Microcontroller Bus Architecture (AMBA). Les blocs MPU, WIC et ETM (Embedded Trace Macrocell) sont des blocs facultatifs qui peuvent être inclus dans le système à microcontrôleur lors de la mise en œuvre. La figure 2.1 montre que le processeur Cortex-M3 est constitué de sous-système de processeur.
Figure 2.1 : Principaux sous systèmes du Cortex-M3 [8]
Le noyau CPU lui-même est étroitement couplé au contrôleur d’interruption et divers blocs logiques de débogage :
• CM3Core : le noyau Cortex-M3 contient les registres, l’ALU (Arithmetic Logic Unit), le chemin de données, et une interface de bus.
• NVIC : le NVIC est un contrôleur d’interruption intégré. Le nombre d’interruptions est personnalisé par les fabricants de la puce. Le NVIC est étroitement couplé à la base avec le CPU et contient un certain nombre de système de registres de commande. Il prend en charge la gestion des interruptions imbriquées, ce qui facilite la gestion des interruptions dans le Cortex-M3. Il est également livré avec une fonction d’interruption vectorisée de sorte que lorsqu’une interruption se produit, il peut entrer directement dans la routine de gestionnaire d’interruption correspondant.
• SysTick Timer: le système Tick (sysTick) Timer est un compte à rebours de base qui peut être utilisé pour générer des interruptions à intervalles de temps réguliers, même lorsque le système est en mode veille. Il rend la portabilité et la réutilisabilité d’un OS (Operating System) entre les appareils Cortex-M3 beaucoup plus faciles parce qu’il n’est pas nécessaire de modifier le code de la minuterie. La minuterie sysTick est mise en œuvre dans le NVIC.
• WIC : le WIC est un module interface avec le NVIC mais séparé du processeur principal pour permettre le réveil du système venant des événements d’interruption quand le processeur (y compris le NVIC) est complètement arrêté ou mis hors tension.
• MPU : le bloc de MPU est facultatif. S’il est inclus, le MPU peut être utilisé pour protéger le contenu de la mémoire, par exemple, pour rendre les régions de la mémoire en lecture seule ou pour empêcher des applications de l’utilisateur d’accéder aux données d’applications privilégiées.
• BusMatrix : il est utilisé comme le cœur du système de bus interne du Cortex-M3. C’est un réseau d’interconnexion d’AHB, permettant le transfert sur différents bus simultanément dans la mesure où les deux bus (maîtres et esclaves) ne cherchent pas à accéder à la même région de la mémoire. Le BusMatrix assure également la gestion de transfert de données supplémentaires, y compris un tampon d’écriture ainsi que les opérations orientées bits.
• AHB to APB : c’est un pont de bus qui est utilisé pour connecter un certain nombre de dispositifs APB tels que les composants de débogage au bus périphérique privé dans le processeur Cortex-M3. En outre, le Cortex-M3 permet aux fabricants de puces de fixer des dispositifs APB supplémentaires au bus périphérique privé externe (PPB : Private Peripheral Bus) en utilisant ce bus APB.
Le reste des composants sont pour le soutien de débogage et normalement ne devraient pas être utilisés par le code de l’application :
• SW-DP/SWJ-DP: le Serial Wire Debug Port (SW-DP)/Serial Wire JTAG Debug Port (SWJ- DP) collabore avec le port d’accès AHB (AHB –AP : AHB – Access Port) de sorte que les débogueurs externes puissent générer des transferts AHB pour contrôler les activités de débogage. Il n’y a pas de chaîne de balayage de port JTAG à l’intérieur du cœur du processeur Cortex-M3; la plupart des fonctions de débogage sont contrôlées par les registres du NVIC à travers les accès AHB. Le SWJ-DP prend en charge le Serial Wire Protocol ainsi que le JTAG Protocol, alors que le SW-DP ne peut supporter que les Serial Wire Protocol.
• AHB-AP : l’AHB-AP permet d’accéder à toute la mémoire du Cortex-M3 à partir de quelques registres. Ce bloc est contrôlé par le SW-DP/SWJ-DP via une interface de débogage générique appelé Debug Access Port (DAP). Pour mener à bien les fonctions de débogage, le matériel de diagnostic externe doit accéder à la AHB – AP à travers le SW- DP / SWJ -DP pour générer les transferts AHB requis.
• ETM : l’ETM est un composant optionnel pour l’instruction de traçage, certains produits Cortex-M3 pourraient ne pas avoir la capacité de suivi d’instructions en temps réel. Les informations de traçage sortent par le port de traçage à travers TPIU (Trace Port Interface Unit). Les registres de contrôle ETM sont mappés en mémoire et peuvent être contrôlés par le débogueur à partir de la DAP.
• DWT : le DWT permet de mettre en place les «data watchpoints » pour le débogage. Lorsqu’une adresse de données ou une valeur de données est trouvée, le DWT peut être utilisé pour générer des événements de point d’observation qui active le débogueur et génère des informations de traçage de données, ou active l’ETM.
• ITM: l’ITM peut être utilisé de plusieurs façons. Le logiciel peut écrire directement dans ce module pour sortir l’information vers le TPIU, ou encore des événements DWT peuvent être utilisés pour générer des paquets de traçage de données par le biais ITM pour la sortie dans un flux de données de traçage.
• TPIU : le TPIU est utilisé pour interfacer le matériel de traçage externe comme les analyseurs de traçage de port. Les informations de traçage sont formatées comme des paquets d’ATB (Advanced Trace Bus) et TPIU reformate ces données pour les permettre d’être capturées par des dispositifs externes.
• FPB: le FPB (Flash Patch and Breakpoint unit) est utilisé pour fournir des Flash Patch et les fonctionnalités du point d’arrêt. Le Flash Patch signifie que si un accès à une instruction par la CPU correspond à une certaine adresse, l’adresse peut être reconfigurée à un autre endroit de tel sorte qu’une autre valeur soit récupérée. Alternativement, l’adresse identifiée peut être utilisée pour déclencher un événement de point d’arrêt. La fonction Flash Patch est très utile pour les tests, comme l’ajout de code de programme de diagnostic à un dispositif non utilisable dans des situations normales à moins d’utiliser le FPB pour modifier le contrôle du programme.
• ROM (Read-Only Memory) table : c’est tout simplement une petite table de consultation pour fournir les informations de mapping de mémoire des différents dispositifs du système et des composants de débogage. Les systèmes de débogage utilisent cette table pour localiser les adresses mémoires des composants de débogage. Dans la plupart des cas, le mapping de mémoire doit être fixé à l’emplacement de mémoire standard. Certains des composants de débogage sont facultatifs et des composants supplémentaires peuvent être ajoutés. Les fabricants de puces individuelles peuvent vouloir personnaliser les fonctionnalités de débogage de leur puce. Dans ce cas, le ROM table doit être personnalisé et utilisé pour le débogage logiciel afin de déterminer le mapping de mémoire correct et donc de détecter le type de composants de débogage disponibles [8].
MODELES DU PROGRAMMEUR
Mode d’opération et état d’opération
Les processeurs Cortex-M3 et M4 ont deux états de fonctionnement et deux modes d’opération comme le montre la fig 2.2. En outre, les processeurs peuvent avoir des niveaux d’accès privilégiés et non privilégiés. Le niveau d’accès privilégié peut accéder à toutes les ressources du processeur, tandis que le niveau d’accès non privilégié signifie que certaines régions de mémoire sont inaccessibles, et quelques opérations ne peuvent pas être utilisées.
Figure 2.2 : Les modes et les états d’opérations [9]
Les états de fonctionnement
• Debug state (Etat de débogage): lorsque le processeur est interrompu (par exemple, par le débogueur, ou après avoir atteint un point d’arrêt), il passe à l’état de débogage et arrête l’exécution des instructions. Cet état est activé par une demande d’arrêt à partir du débogueur, ou par des événements de débogage générés à partir de composants de débogage dans le processeur. Cet état permet au débogueur d’accéder ou modifier les valeurs de registres du processeur. La mémoire du système, y compris les périphériques à l’intérieur et à l’extérieur du processeur, peut être consultée par le débogueur soit dans le Thumb state ou le Debug state.
• Thumb state : si le processeur est en cours d’exécution de code de programme (instructions Thumb), il est dans l’état « Thumb state ». Contrairement aux processeurs ARM classiques comme ARM7TDMI, il n’y a pas de ARM state parce que les processeurs Cortex-M ne supportent pas le jeu d’instructions ARM [9].
Les modes d’opération
• Handler mode: c’est le mode lors de l’exécution d’un gestionnaire d’exception comme l’ISR (Interrupt Service Routine). En mode Handler, le processeur a toujours le niveau d’accès privilégié.
• Thread mode: c’est le mode lors de l’exécution du code d’application normale; le processeur peut être soit dans le niveau d’accès privilégié ou le niveau d’accès non privilégié. Ceci est contrôlé par un registre spécial appelé «CONTROL».
Le logiciel peut passer le processeur du mode Thread privilégié en mode Thread non privilégié. Cependant, il ne peut pas revenir du mode non privilégié au mode privilégié. Si c’est nécessaire, le processeur doit utiliser le mécanisme d’exception pour gérer la commutation. La séparation des niveaux d’accès privilégiés et non privilégiés permet aux concepteurs de systèmes de développer des systèmes embarqués robustes. Ainsi, cela fournit un mécanisme pour protéger la mémoire des accès aux zones critiques et un modèle de sécurité de base. Par exemple, un système peut contenir un noyau d’OS embarqué qui s’exécute au niveau d’accès privilégié, et des tâches d’application qui s’exécutent au niveau d’accès non privilégié. De cette façon, on peut mettre en place des autorisations d’accès mémoire en utilisant l’unité de protection de mémoire (MPU). Cette unité va empêcher une tâche d’application de corrompre la mémoire et les périphériques utilisés par le noyau d’OS et d’autres tâches. Si une tâche d’application se bloque, les tâches d’application restantes et le noyau de l’OS peuvent continuer à s’exécuter.
Le Thread mode et le Handler mode ont des modèles de programmation très similaires. Toutefois, le Thread mode peut utiliser un pointeur de pile différent appelé Process Stack Pointer (PSP). Cela permet à la pile de mémoire des tâches d’application d’être séparée de la pile utilisée par le noyau du système d’exploitation, rendant ainsi le système plus fiable [9].
Registres
Le processeur Cortex-M3/M4 dispose de 16 registres principaux de R0 à R15. Treize d’entre eux sont des registres à usage général 32 bits, et les trois autres sont des registres à utilisations spécifiques.
Figure 2.3 : Registres principaux du Cortex-M3 [9]
Registres à usage général R0 à R7
Les registres généraux sur la fig 2.3 de R0 à R7 sont appelés «low registers ». Ils sont accessibles par toutes les instructions Thumb 16-bits et toutes les instructions Thumb-2 32-bits. Ils sont tous des registres de 32 bits.
Registres à usage général R8 à R12
Les registres généraux sur la fig 2.3 de R8 à R12 sont appelés « high registers ». Ils sont accessibles par toutes les instructions Thumb-2 32-bits mais pas par toutes les instructions Thumb 16-bits. Ces registres sont tous des registres de 32 bits.
Registres de pointeur de pile R13 (SP)
Le registre R13 est un pointeur de pile (Stack Pointer). Il est utilisé pour accéder à la mémoire de pile via des opérations PUSH et POP. Dans le processeur Cortex-M3/M4, il existe deux pointeurs de pile. Cette dualité permet de mettre en place deux mémoires piles séparées. Lorsqu’on utilise le registre R13, on ne peut accéder qu’au registre pointeur de pile en cours; l’autre est inaccessible sauf si on utilise des instructions d’accès aux registres spéciaux. Les deux pointeurs de piles sont les suivants:
– Le pointeur de pile principal (MSP : Main Stack Pointer) ou SP_main dans la documentation ARM [8]. C’est le pointeur de pile par défaut; il est utilisé par le noyau du système d’exploitation, les gestionnaires d’exception, et tous les codes d’applications qui nécessitent un accès privilégié. Le MSP peut être aussi choisi après un reset, ou lorsque le processeur est en Handler mode.
– Le pointeur de pile de processus (PSP : Process Stack Pointer) ou SP_process dans la documentation ARM [8]. C’est le pointeur de pile utilisé au niveau du code de l’application (lorsqu’il n’est pas en cours d’exécuter une exception). Le PSP ne peut être utilisé qu’en Thread mode.
Pour la plupart des cas, il n’est pas nécessaire d’utiliser le PSP. De nombreuses applications simples peuvent complètement ne compter que sur le MSP. Le PSP est normalement utilisé quand un OS embarqué est impliqué, où la pile du noyau OS et celle des tâches des applications sont séparées.
Registre de lien R14 (LR)
Le registre R14 est aussi appelé Link Register (LR). Il est utilisé pour retenir l’adresse de retour lors de l’appel d’une fonction ou d’un sous-programme. A la fin du sous-programme ou de la fonction, la commande de programme peut retourner au programme appelant et reprendre par le chargement de la valeur de LR dans le compteur de programme (PC : Program Counter). Quand un appel de fonction ou sous-programme est fait, la valeur de LR est mise à jour automatiquement. Si une fonction doit appeler une autre fonction ou une sous-routine, elle a besoin de sauvegarder la valeur de LR dans la mémoire pile en premier. Sinon, la valeur actuelle dans LR sera perdue lorsque la fonction appel est effectuée.
Registre compteur de programme R15 (PC)
Le registre R15 est le compteur de programme (PC). Il est accessible en lecture et en écriture. En raison de la nature en pipeline du processeur Cortex-M3, quand on lit ce registre, on verra que la valeur est différente de l’emplacement de l’instruction d’exécution, normalement par 4. Par exemple:
Écrire dans le PC entraînera un branchement. Etant donné qu’une adresse d’instruction doit être alignée en demi-mot, le LSB (Least Significant Bit) de la valeur du PC est toujours 0. Cependant, lorsqu’on utilise des instructions de lecture en mémoire pour mettre à jour le PC, on doit définir la valeur de LSB du PC à 1 pour indiquer le Thumb state. Sinon, une exception peut être déclenchée, car il indique une tentative de passer à l’utilisation des instructions ARM, qui n’est pas prise en charge. Dans les langages de programmation de haut niveau (y compris C, C++), le réglage du LSB est géré automatiquement par le compilateur. Dans la plupart des cas, les branchements et les appels de fonction sont traités par des instructions dédiées à ces opérations. Il est moins fréquent d’utiliser des instructions de traitement de données pour mettre à jour le PC. Toutefois, la valeur du PC est utile pour accéder à des données littérales stockées dans la mémoire programme.
Registres spéciaux
A part les registres de la banque de registre, il ya un certain nombre de registres spéciaux, comme illustrés sur la fig 2.4, dans le Cortex-M3/M4.
Ces registres spéciaux sont :
– Les registres d’état de programme (xPSR : Program Status Registers).
– Les registres de masque d’interruption (PRIMASK, FAULTMASK et BASEPRI).
– Le registre de contrôle (CONTROL).
Les registres spéciaux ne sont pas mappés en mémoire donc ils ne possèdent pas d’adresse mémoire. Ils ne peuvent être accessibles que via les instructions d’accès : MSR et MRS.
Les registres d’état de programme (xPSR)
Ils sont au nombre de trois comme l’indique la fig 2.5:
– Registre d’état de programme d’application (APSR : Appilcation Program Status Register)
– Registre d’état de programme d’interruption (IPSR : Interruption Program Status Register)
– Registre d’état de programme d’exécution (EPSR : Execution Program Status Register)
Figure 2.5 : Registres d’état de programme [8]
Les trois PSR peuvent être consultés ensemble ou séparément. On peut modifier le registre APSR en utilisant l’instruction MSR, mais les registres EPSR et IPSR sont en lecture seule. Comme illustrés sur le tableau V, ces trois registres sont des registres de 32-bits et chaque bit ont leurs descriptions listées sur le tableau VI.
Tableau V: Description des registres d’état de programme [9]
Tableau VI: Description des attributs des registres d’état de programme [9]
Ces trois registres peuvent être accédés comme un seul combiné suivant le tab VII. Tableau VII: Description des registres d’état de programme combiné [9]
Les registres de masque d’interruption (PRIMASK, FAULTMASK et BASEPRI)
Les registres PRIMASK, FAULTMASK et BASEPRI sont utilisés pour désactiver les exceptions ou pour masquer des interruptions fondées sur des niveaux de priorité. Ils ne sont accessibles qu’au niveau d’accès privilégié (à l’état non privilégié, l’écriture dans ces registres est ignorée et la lecture dans ces registres retourne la valeur zéro). Par défaut, ces registres sont tous à zéro, ce qui signifie que le masquage (désactivation d’exception / interruption) n’est pas actif.
Le registre PRIMASK est un registre de 1-bit. Lorsqu’il est actif, il bloque toutes les exceptions (y compris les interruptions) en dehors du Non-Masquable Interrupt (NMI) et le HardFault exception. En effet, il augmente le niveau de priorité de l’exception courant de 0, qui est le niveau le plus élevé pour une exception / interruption programmable. L’utilisation la plus courante pour PRIMASK est de désactiver toutes les interruptions pour un processus critique de temps. Après que le processus critique de temps soit terminé, le PRIMASK doit être autorisé à réactiver les interruptions.
Le registre FAULTMASK est un registre de 1-bit. Il est très similaire à PRIMASK. Lorsqu’il est actif, il autorise seulement le NMI, et toutes les interruptions et les exceptions (comme le Fault Handling Exception) sont désactivées. Un OS pourrait utiliser FAULTMASK pour désactiver temporairement la gestion des défauts lorsqu’une tâche s’est « crashée ». Dans ce scénario, un certain nombre de défauts pourraient se produire lorsqu’une tâche se bloque. Une fois que le noyau commence le nettoyage, il pourrait ne pas vouloir être interrompu par d’autres défauts causés par le processus qui s’est « crashé ». Par conséquent, le FAULTMASK donne le temps au noyau de l’OS de faire face aux défauts.
Afin de permettre un masquage d’interruption plus souple, l’architecture ARMv7-M offre également le registre BASEPRI, qui masque des exceptions ou des interruptions basées sur le niveau de priorité. La capacité du registre BASEPRI dépend du nombre de niveaux de priorité implémenté dans la conception et est déterminée par les vendeurs du microcontrôleur. La plupart des microcontrôleurs Cortex-M3 ou M4 ont huit niveaux de priorité d’exception programmable ou 16 niveaux, et dans ces cas, les capacités de BASEPRI seront 3 bits ou 4 bits, respectivement ; et elle peut même monter jusqu’à 8 bits comme le montre le tab VIII. Quand il est mis sur une valeur non nulle, il bloque toutes les exceptions (y compris les interruptions) de même niveau de priorité ou de niveau de priorité inferieure, tout en autorisant les exceptions et les interruptions avec un niveau de priorité plus élevé [9].
Les registres FAULTMASK et BASEPRI ne sont pas disponibles dans ARMv6-M (par exemple, Cortex-M0).
Le registre de contrôle (CONTROL)
Le registre de contrôle définit:
• La sélection du pointeur de pile (Main Stack Pointer/ Process Stack Pointer)
• Le niveau d’accès en Thread mode (Privileged / Unprivileged).
De plus, pour le processeur Cortex-M4 avec une unité à virgule flottante, comme le montre le tab IX, un bit supplémentaire du registre de contrôle indique si le contexte actuel (code en cours d’exécution) utilise l’unité à virgule flottante ou non.
Tableau IX: Les registres de contrôle des Cortex-M3/M4/M4F et M0 [9]
Le registre de contrôle ne peut être modifié que dans le niveau d’accès privilégié et peut être lu dans les deux niveaux d’accès privilégiés et non privilégiés. Sa définition est comme suit :
– nPRIV (bit 0) : définit le niveau d’accès en Thread mode. Lorsque ce bit est 0 (par défaut), le niveau d’accès est privilégié en Thread mode. Lorsque ce bit est 1, le niveau est non privilégié en Thread mode. En Handler mode, le processeur est toujours dans le niveau d’accès privilégié.
– SPSEL (bit 1) : définit la sélection du pointeur de pile. Lorsque ce bit est 0 (par défaut), le Thread mode utilise le MSP comme le montre la fig 2.6. Lorsque ce bit est 1, il utilise le PSP. En mode Handler, ce bit est toujours 0 et l’écriture à ce bit est ignorée.
– FPCA (bit 2): Floating Point Context Active. Ce bit est seulement disponible dans les Cortex-M4 avec unité de virgule flottante. Le mécanisme de gestion des exceptions utilise ce bit pour déterminer si des registres de l’unité de virgule flottante ont besoin d’être sauvés quand une exception s’est produite. Lorsque ce bit est 0 (par défaut), l’unité de virgule flottante n’a pas été utilisée dans le contexte actuel et donc il n’est pas nécessaire de sauver les registres. Lorsque ce bit est 1, le contexte actuel a utilisé des instructions virgule flottante et on a donc besoin de sauver les registres. Le bit FPCA est réglé automatiquement quand une instruction virgule flottante est exécutée.
Après la réinitialisation, le registre de contrôle est 0. Cela signifie que le Thread mode utilise le MSP et l’accès privilégié. Les programmes en Thread mode au niveau privilégié peuvent basculer la sélection du pointeur de pile ou passer à un niveau d’accès non privilégié en écrivant dans le registre de contrôle. Cependant, une fois le nPRIV défini, le programme en cours d’exécution dans le Thread mode ne peut plus accéder au registre de contrôle [8].
Un programme de niveau d’accès non privilégié ne peut pas revenir au niveau d’accès privilégié. Cela est essentiel pour fournir un modèle de base de l’utilisation de la sécurité. Par exemple, un système embarqué peut contenir des applications non fiables en cours d’exécution dans le niveau d’accès non privilégié. L’autorisation d’accès de ces demandes doit être limitée pour éviter les failles de sécurité ou pour empêcher une application non fiable de « crasher » l’ensemble du système. S’il est nécessaire de revenir à l’utilisation du niveau d’accès privilégié en Thread mode, alors le mécanisme d’exception est nécessaire. Au cours du Handler mode, le gestionnaire d’exception peut effacer le bit nPRIV. Lors du retour en Thread mode, le processeur sera en niveau d’accès privilégié comme illustré sur la fig 2.7.
Quand un OS embarqué est utilisé, le registre de contrôle pourrait être reprogrammé à chaque changement de contexte pour permettre à certaines tâches de l’application de s’exécuter avec le niveau d’accès privilégié et les autres avec le niveau d’accès non privilégié. Quatre combinaisons différentes de nPRIV et SPSEL sont possibles, bien que seulement trois d’entre eux soient couramment utilisés dans des applications réelles (voir annexe 2). Dans la plupart des applications simples, sans un système d’exploitation intégré, il n’est pas nécessaire de modifier la valeur du registre de commande. Toute l’application peut s’exécuter dans le niveau d’accès privilégié et peut utiliser seulement le MSP.
Registres virgule flottante
Le processeur Cortex-M4 dispose d’une unité de virgule flottante en option. Cela offre des registres supplémentaires pour le traitement de données en virgule flottante, ainsi qu’un registre d’état et de contrôle de virgule flottante (FPSCR : Floating Point Status and Control Register). Chacun des registres 32-bits S0 à S31 (« S » pour simple précision) peut être consulté à l’aide d’instructions virgule flottante, ou consulté comme une paire, avec le symbole de D0 à D15 («D» pour double mot / double précision). Par exemple, S1 et S0 sont jumelés pour devenir D0, et S3 et S2 sont jumelés pour devenir D1 comme le montre la fig 2.8. Bien que l’unité de virgule flottante dans le Cortex-M4 ne supporte pas le calcul en virgule flottante à double précision, on peut toujours utiliser des instructions virgule flottante pour transférer des données en double précision.
Figure 2.8: Registres dans la FPU [9]
Registre d’état et de contrôle de virgule flottante
Le FPSCR contient divers champs de bits comme illustrés dans le tab X pour différentes raisons:
• pour définir certains comportements de fonctionnement en virgule flottante
• pour fournir des informations d’état sur les résultats de l’opération en virgule flottante Par défaut, le comportement est configuré pour être conforme à la norme IEEE 754 (opération de simple précision). Dans les applications normales, il n’est pas nécessaire de modifier les paramètres de contrôle de l’opération en virgule flottante. On peut voir dans l’annexe 2 la liste des descriptions des champs de bits dans FPSCR.
Tableau X: Champs de bit dans le registre FPSCR [9]
Les bits d’exception dans FPSCR peuvent être utilisés par le logiciel pour détecter des anomalies dans les opérations en virgule flottante.
ii. Registres de mémoire mappée de virgule flottante
En plus des bancs de registre de virgule flottante et du FPSCR, l’unité de virgule flottante possède aussi plusieurs registres de mémoire mappée supplémentaires dans le système. Par exemple, le registre de contrôle d’accès du coprocesseur (CPACR : CoProcessor Access Control Register) est utilisé pour activer ou désactiver l’unité de virgule flottante comme le montre le tab XI. Par défaut, l’unité de virgule flottante est désactivée pour réduire la consommation d’énergie.
Tableau XI: Champs de bit dans le registre CPACR [9]
SYSTEME DE MEMOIRE
Mémoire mappée (Memory map)
L’espace d’adressage de 4 Go sur les processeurs Cortex-M3 est divisé en un certain nombre de régions de mémoire comme le montre la fig 2.9. Le partitionnement est basé sur des usages typiques de sorte que les différentes zones soient conçues pour être utilisées principalement pour:
• L’accès au code de programme (par exemple, dans la région de CODE)
• L’accès aux données (par exemple, dans la région de SRAM)
• Les périphériques (par exemple, dans la région périphérique)
• Le contrôle interne du processeur et les composants de débogage (par exemple le PPB)
Figure 2.9: Mémoire mappée [8]
L’architecture permet également une grande flexibilité pour permettre aux régions de la mémoire d’être utilisées à d’autres fins. Par exemple, les programmes peuvent être exécutés à partir du CODE ainsi que dans la région de SRAM, et un microcontrôleur peut également intégrer des blocs SRAM dans la région CODE.
La disposition de la mémoire mappée est cohérente entre tous les processeurs Cortex-M. Par exemple, l’espace d’adressage PPB accueille les registres NVIC, les registres de configuration du processeur, ainsi que des registres pour les composants de débogage. Il en est de même sur tous les appareils Cortex-M. Cela rend plus facile la portabilité du logiciel d’un appareil Cortex-M à l’autre, et permet une meilleure réutilisation du logiciel. Il rend également plus facile pour les fournisseurs d’outils, comme le contrôle de débogage pour les appareils Cortex-M3/M4, de travailler de la même manière.
Mémoire pile (Stack memory)
Comme dans presque toutes les architectures de processeur, les processeurs Cortex-M ont besoin de mémoire pile pour fonctionner. C’est une sorte de mécanisme d’utilisation de mémoire qui permet à une partie de la mémoire à devenir comme une mémoire tampon LIFO (Last In First Out) pour le stockage de données. Les processeurs ARM utilisent la mémoire principale du système pour les opérations de mémoire de la pile, et ont l’instruction PUSH pour stocker des données dans la pile et l’instruction POP pour récupérer les données de la pile. Le pointeur courant de pile (R13) sélectionnée est automatiquement ajusté pour chaque opération de PUSH et POP.
La mémoire pile peut être utilisée pour:
• Le stockage temporaire des données originales quand une fonction en cours d’exécution doit utiliser des registres (dans la banque de registre) pour le traitement de données. Les valeurs peuvent être restaurées à la fin de la fonction de sorte que le programme qui a appelé la fonction ne perde pas ses données.
• Le transfert des informations à des fonctions ou des sous-programmes.
• Stocker des variables locales.
• Maintenir l’état du processeur et les valeurs des registres dans le cas où des exceptions se produiraient.
Les processeurs Cortex-M utilisent un modèle de mémoire pile appelée « full descending stack ». Lorsque le processeur est lancé, le SP est réglé pour pointer à la fin de l’espace mémoire réservé pour la mémoire pile. Pour chaque opération PUSH, le processeur décrémente premièrement la SP, puis stocke la valeur dans l’emplacement de mémoire indiqué par SP. Pendant les opérations, le SP pointe à l’emplacement de mémoire où les dernières données ont été sauvées dans la pile comme le montre la fig 2.10. Dans une opération de POP, la valeur dans l’emplacement de mémoire indiqué par SP est lue, puis la valeur de SP est incrémentée automatiquement [9]. L’utilisation la plus courante des instructions PUSH et POP est de sauver le contenu des banques de registre quand un appel de fonction/sous-routine est fait.
Table des matières
INTRODUCTION
Chapitre I : LES PROCESSEURS ARM CORTEX
I.1. GENERALITE SUR LE PROCESSEUR ARM
I.2. HISTORIQUE
I.3. LES FAMILLES DES PROCESSEURS ARM
a) Convention d’appellation des coeurs des processeurs ARM
i. Les ARM Classic cores
ii. Les ARM Cortex cores
b) La famille ARM Cortex
i. Les ARM Cortex-A
ii. Les ARM Cortex-R
iii. Les ARM Cortex-M
c) Comparaison entre les ARM Cortex 32 bits
I.4. LES MICROPROCESSEURS ARM CORTEX-M
a) Les architectures ARMv6-M et ARMv7-M
b) ARM Cortex-M3
c) ARM Cortex-M0
d) ARM Cortex-M0+
e) ARM Cortex-M4
f) ARM Cortex-M7
Chapitre II : LA TECHNOLOGIE ARM CORTEX- M3/M4
II.1. VUE INTERNE DE L’ARM CORTEX-M3
II.2. MODELES DU PROGRAMMEUR
a) Mode d’opération et état d’opération
i. Les états de fonctionnement
ii. Les modes d’opération
b) Registres
i. Registres à usage général R0 à R7
ii. Registres à usage général R8 à R12
iii. Registres de pointeur de pile R13 (SP)
iv. Registre de lien R14 (LR)
v. Registre compteur de programme R15 (PC)
c) Registres spéciaux
i. Les registres d’états de programmes (xPSR)
ii. Les registres de masque d’interruption (PRIMASK,
FAULTMASK et BASEPRI)
iii. Le registre de contrôle (CONTROL)
d) Registres virgule flottante
i. Registre d’état et de contrôle de virgule flottante
ii. Registres de mémoire mappée de virgule flottante
II.3. SYSTEME DE MEMOIRE
a) Mémoire mappée (Memory map)
b) Mémoire pile (Stack Memory)
c) MPU (Memory Protection Unit)
II.4. EXCEPTION ET INTERRUPTION
Chapitre III : LA PROGRAMMATION EN C SUR UN MICROCONTROLEUR ARM CORTEX-M3/M4
III.1. MICROCONTROLEURS ARM CORTEX-M3/M4
III.2. DEPLOIEMENT
a) Choix du microcontrôleur ARM Cortex-M3/M4
b) Outils de développement
i. Kit de développement
ii. Compilateur et assembleur
iii. Débogueur
iv. Types de données du langage C
III.3. L’API CMSIS
a) CMSIS-CORE
b) CMSIS-DRIVERS
c) CMSIS-DSP
d) CMSIS-RTOS
e) CMSIS-SVD ET CMSIS-DAP
III.4. INTERRUPTION
a) Configuration de table de vecteur
b) Configuration de la priorité d’interruption
c) Activation de l’interruption
d) Gestionnaire d’interruption
Chapitre IV : MISE EN PLACE D’UN RTOS POUR LES TRAITEMENTS DE DONNEES EN TEMPS REEL
IV.1. DESCRIPTION DU TRAVAIL ET DES MATERIELS
a) Les tâches effectuées par le microcontrôleur
b) Descriptions des matériels utilisés
i. Microcontrôleur STM32F407ZGT6
ii. PHY KS8721BL
iii. Capteur de température DS18B20
iv. Moteur à courant continu avec encodeur
IV.2. IMPLEMENTATION DU PROTOCOLE TCP/IP
IV.3. IMPLEMENTATION DU DSP
a) Analyseur de spectre numérique
b) Asservissement en vitesse d’un moteur à courant continu
IV.4. IMPLEMENTATION DES INTERFACES DE COMMANDE DU MOTEUR ET DES CAPTEURS
a) Génération du signal PWM pour la commande du moteur
b) Le thermomètre numérique
c) L’encodeur rotatif en quadrature
IV.5. IMPLEMENTATION DANS UN RTOS
IV.6. RESULTATS
CONCLUSION
Annexe 1 : ARM
Annexe 2 : DESCRIPTIONS DES REGISTRES DU CORTEX-M3
Annexe 3 : DETAILS TECHNIQUES DES MATERIELS UTILISES
Annexe 4 : MODELISATION DU MOTEUR A COURANT CONTINU
Annexe 5 : EXTRAIT DE CODE EN LANGAGE C
REFERENCES BIBLIOGRAPHIQUES