Escolar Documentos
Profissional Documentos
Cultura Documentos
RealTimeOperatingSystem
ARM
Cours ARM 21 et 22 novembre 2007
Introduction :
Beaucoup de choix dans les configurations pour les compilateurs, librairies, jeux
d’instructions…
Si on fait de mauvais choix, on peut aboutir à des différences de vitesse d’un facteur 50, avec
la même fréquence de clock.
Une des raisons de la migration des concepteurs vers les architectures ARM est le
développement des interfaces type CAN, Ethernet ou USB.
ARM : Advanced RISC Machines
- Commence en 1990
- 1991 conception de l’architecture ARM6
- 2000 : début de la production des chips
- 2004 : première année a dépasser le million de chips
- 2007 2.5 milliard de chips produits.
- 771 nouvelles versions de l’architecture développée en 2006
Les processeurs 32 bits sont entrain de prendre le dessus sur les autres, les 16 sont maintenant
plus chers sur le marché que les 32. Pour 7 euro, on peut obtenir un magnifique
microcontrôleur ARM.
On peut observer aussi au niveau du marché que la progression la plus importante est prévue
pour les chips embarqués (10x dans 5 ans)
Dans les applications qui demandent une faible consommation, l’objectif est de faire le
maximum de choses en un minimum de coups de clock et de repasser ensuite en mode basse
consommation.
Dans la plupart des cas, une architecture ARM7 est suffisante, on peut utiliser l’architecture
ARM9, au-delà, (ARM11) c’est un peu lourd.
Dans la terminologie ARM, on nomme Word les mots de 32 bits. Halfword les mots de 16
bits et byte les 8 bits.
Les variables de 32 bits sont systématiquement attribuées à des adresses multiples de 4. Dans
le cas de tailles de variables hétérogènes, il faut les classer par taille, ce qui évitera de définir
dans la mémoire des emplacements avec des trous entre les variables 8 et la prochaine de 32
p.exemple.
Comparaison entre les architectures ARM 7 et 9
Arm7 :
3 étapes dans le pipeline. Data et code sur le même bus interne, ce qui ralenti les transferts.
1.9 Clock Per Instruction
Jeux d’instruction ARM et Thumb
Arm 9 :
5 étapes dans le pipeline. Deux bus séparés pour data et instructions.
1.5 Clock Par Instruction
Jeux d’instruction ARM et Thumb
Cortex-M3 :
Semblable à l’ARM 3 mais avec un contrôleur d’interruption, le mode Thumb-2 et un temps
d’interruption réduit à la moitié du ARM 7. On peut assigner des zones mémoires utilisables
(et protéger le reste des action liées à l’interrupt) pour chaque interruption.
Interruptions :
Pas de contrôleur d’interruption.
Deux types d’interruptions :
- IRQ : interrution standard
- FIQ : interruption rapide, avec une plus haute priorité.
Les choix de compilateur, options et code écrit peuvent diminuer dramatiquement les
performances d’un bon microcontrôleur facteur 50...
ARM mode :
Switch global de la génération de
code
On peut choisir pour chaque
fonction __arm ou __thumb
Ex : viod wait(viod) __arm
Permet le changement de
mode Thumb / ARM
Les options de débbuging en simulation sont plus étendues qu’en débbuging « hardware »
(p.ex. 2 « breakpoint » seulement)
Donner un nom.
Choisir la famille …
Et le micro.
Répondre oui à la question. Si on ne le fait pas, il va modifier la librairie originale, ce qui est
rarement une bonne idée.
On peut configurer toutes les options de compilation de manière différente pour chacun de
chips
La fonction clic droit Ö execution profiling Ö time peut afficher le temps d’exécution pour
chaque instruction.
Retarget.c : permet de re-spécifier des fonctions déjà présentes dans les une librairie.
(exemple : on peut se faire un printf() personnel pour envoyer les messages sur CAN bus.)
Le RTOS peut souvent dialoguer avec les tâches via une mailbox où chacun dépose des
messages que l’autre lit lorsqu’il est actif.
Toute tâche est définie par le RTOS avec un identifiant et un niveau de priorité.
Elle peut être dans plusieurs états :
- En attente (d’un évènement, interrupt, donnée, …)
- Prête à être exécutée (attend le contrôleur)
- En cours (consomme du temps contrôleur)
Mise en œuvre du temps réel :
Description des différentes manières de gérer le temps processeur :
Simple :
Les tâches s’exécutent jusqu’à leur fin dans l’ordre de leur priorité.
Coopératif :
Les tâches sont coresponsables de l’exécution de toutes. Le RTOS possède des instructions
qui permettent aux tâches de se mettre en veille et de laisser du temps de calcul aux autres.
Préemptif :
Le mode préemptif permet à une tâche de s’exécuter tant qu’aucune autre de priorité
supérieure ne demande du temps de calcul. Aussitôt qu’une interruption ou une tâche de plus
haute priorité pointe son nez, la tâche en cours se met en pause et cède la main aux tâches plus
importantes. C’est le système qui permet la plus grande vitesse d’exécution globale du travail.
Place mémoire :
Les tâches sont stockées en RAM avec chacune sa pile, cela génère à chaque fois de la place
occupée pour chacune d’elle.
Librairies :
Chez Keil,(par opposition aux autres fournisseurs moins bons…) on achète un pack qui
contient toutes les librairies pour toutes les interfaces (TCP/IP, USB, file system, CAN
driver,…)
Les informations de la fenête RTX Kernel ne sont mises à jour en temps réel que lors d’une
simulation, si on fait tourner le soft sur le uP, elle n’est mise à jour que lors de l’arrêt du
programme.
On peut ainsi déterminer que durant 37% du temps, le processeur attend dans une boucle
« for » à la ligne OS_idle_demon. Ce temps serait normalement utilisé pour mettre le CPU en
pause et économiser de l’énergie.
Comme le port « LED » est le port 7, on peut modifier les valeurs des leds dans le panneau
« GPIO 7 » (en mode « Debug/simulation »)
Choix du microcontroleur
STR912FW44
Pour positionner un bit sur un port, on doit définir les options de « peripheral reset register » à
« not in reset » pour les ports concernés et on doit activer le clock sur le « Peripheral clock
gatering ».
On peut alors afficher les valeurs envoyées par l’agent temps réel du CPU sur l’écran en
tapant « d ».
On trouve cette librairie dans le répertoire … des librairies.
Bus interne :
NXP est le seul qui offre une architecture avec plusieurs bus internes, ce qui permet un
écoulement des informations fluides et un gain de temps pour le traitement de quantité
importantes de données.
Timers :
On touve des compteurs 16 bits dans toutes les configurations, mais NXP fournit des
compteurs 32 bits que l’on peut chaîner et ainsi avoir un compteur 64 bits. Cela peut être
séduisant, mais il faut prendre garde à la portabilité d’applications qui sont développées sur
une particularité d’un seul fabricant.
USB :
Ils ont en général 16 ports logiques, mais Atmel est un peu plus léger sur ce point. Lors de
l’énumération, les différences de taille de buffer sont communiquées et ce n’est pas un
problème en soit, un buffer plus important va, bien sûr fluidifier le flux de données.
On trouve actuellement les USB 1.0 et 2.0, avec un supplément à 2.0 : OTG On The Go qui
permet une connexion directe entre deux périphériques (sans Hub).
L’énumération est la procédure qui va permettre la reconnaissance des périphériques par le
gestionnaire de bus.
Les hubs peuvent (si tout est implémenté) dire aux périphériques connectés, combien
d’énergie ils ont le droit de consommer.
Pour One The Go, un élément peut être soit host, soit périphérique.
Le signal est sous forme NRZ (zéro Ö change, 1 Ö ne change pas). Pour des raisons de
synchronisation, on a de toute manière un zéro tous les 6 « 1 ».
La question est posée de trouver une manière de passer un message (8 bits) au périphérique.
On peut faire un compteur sur les cases à cocher en écrivant :
byte count ;
…
InReport |= count <<2 ;
count++;
On trouve deux variables outreport et inreport dans les fichier hiduser et demo.
Deux fonctions SetOutReport et GetInReport permettent d’envoyer le contenu des deux
variables ci-dessus.
L’exemple memory.uv2 permet d’utiliser la ram du microcontrôleur comme une clé USB…
de 30kb…
Can Bus :
ST a un seul port Can alors que les autres on 2 ou 4 ports. NXP n’a pas de buffer d’entrée
pour la réception des messages.
On a une distance maximum de transmission, pour les distances supérieures à 10m, on doit
déjà diminuer le taux max (1Mbps).
On utilise un signal différentiel pour la communication, qui donne une forte immunité au bruit
des communications Can bus.
Ce bus a une configuration à plusieurs maîtres, si deux émettuers parlent en même temps,
l’émetteur qui a la plus grande priorité va faire passer son message.
Il existe une version MicroCanOpen qui peut être utilisé librement (pour l’éducation) et
permet de se frotter à Can open sans bourse délier. www.microcanopen.com
On trouve chez www.esacademy.com des outils (Can open magic prods) qui permettent de
définir la structure d’un réseau Can, simuler des nœud, envoyer des messages, …
TCP/IP
On trouve dans TCP-IP les couches traditionnelles des protocoles de communication.
On n’est (dieu merci) pas obligé d’implémenter tous les protocoles dérivés de TCP/IP.
Choix de l’adresse IP
La toolbox est définie dans le fichier Sim.ini, ou on voit la configuration des boutons et
l’assignation des valeurs aux entrées ad00 et ad01.
On peut définir les priorités des interruptions avec l’instruction VICVectCntl4 et les lire dans
la fenêtre « Vectored Interrupt Controller). Donner les valeurs du prescaler et des valeurs pour
le compteur avec les instruction s T0xx et les lire dans la fenêtre du timer concerné.
La procédure T0ISR() change la valeur d’affichage des
leds et remet les compteurs à zéro.
Banque de registre
Dans l’architecture ARM, chaque mode de fonctionnement du processeur a des registres
dédiés.