Table of Contents
Pourquoi la performance en temps réel compte dans la robotique moderne
Les systèmes robotiques fonctionnent dans des environnements où le timing est tout. Un robot qui prend trop de temps pour traiter des données de capteur ou calculer une commande moteur peut manquer un événement critique, se heurter à un obstacle ou ne pas exécuter un mouvement précis.
Les systèmes en temps réel doivent garantir que les réponses se produisent dans un délai limité. C'est particulièrement difficile en robotique, où la boucle de commande doit lire des capteurs, traiter des données, calculer des commandes et actionner des moteurs en microsecondes. Tout retard dans cette boucle peut dégrader les performances ou causer une défaillance totale. Pour répondre à ces exigences de timing strictes, les ingénieurs doivent exploiter tous les niveaux de l'architecture informatique, et l'un des outils les plus puissants disponibles est le registre humble.
Quels sont les registres et pourquoi ont-ils de l'importance?
Les registres sont les emplacements de stockage les plus rapides dans un processeur informatique. Ils sont intégrés directement dans le cœur du processeur et fonctionnent à la même vitesse d'horloge que le processeur lui-même. Contrairement à la mémoire principale (RAM), qui peut prendre des dizaines ou des centaines de cycles d'horloge à accéder, les registres fournissent des données en un seul cycle.
Dans un système robotique typique, les registres détiennent des résultats intermédiaires d'opérations arithmétiques, des compteurs de boucle, des données de capteur qui doivent être immédiatement mises en œuvre et contrôlent les variables qui changent chaque cycle de contrôle.
Chaque processeur moderne a un nombre limité de registres, généralement entre 16 et 32 registres à usage général dans un microcontrôleur typique, bien que certaines architectures comme ARM ont plus. Cette rareté signifie que l'attribution de registres, le processus de détermination des variables qui vivent dans des registres à un moment donné, est un problème critique d'optimisation.
Le rôle des registres dans la hiérarchie de la mémoire
Pour apprécier pleinement l'impact des registres sur les performances en temps réel, il aide à comprendre où ils s'inscrivent dans la hiérarchie de la mémoire. La hiérarchie, du plus rapide au plus lent, est :
- Enregistrements: Accès sur puce, accès à un cycle, capacité très limitée (quelques centaines d'octets au total).
- Cache (L1, L2, L3):[ Sur puce ou très proche, quelques cycles de latence d'accès, une capacité plus grande (kilooctets à mégaoctets).
- Mémoire principale (RAM): Déchiqueteuse, de dizaines à des centaines de cycles latence, grande capacité (gigaoctets).
- Stockage secondaire (Flash, SSD, HDD):[ Déchipeur, des millions de latences de cycles, capacité massive (teraoctets).
Les registres sont le seul niveau de stockage qui peut suivre la vitesse d'exécution du processeur. Chaque instruction qui fonctionne sur des données lit habituellement ses opérandes à partir de registres et écrit des résultats dans des registres. Lorsque les données ne sont pas dans un registre, le processeur doit exécuter une instruction de chargement ou de stockage, qui introduit un retard variable qui peut perturber le comportement en temps réel.
Quantification de l'impact des registres sur la performance
La différence de performance entre l'accès au registre et l'accès à la mémoire est stupéfiante.
- Accès au registre : un cycle d'horloge (10 nanosecondes).
- Accès au cache L1 : deux à quatre cycles d'horloge (20-40 nanosecondes).
- Accès RAM : 20-50 cycles d'horloge (200-500 nanosecondes).
Dans une boucle de contrôle en temps réel à 1 kHz, le budget de la boucle est de 1 milliseconde. Si chaque itération nécessite 100 accès à la mémoire et chaque accès à la mémoire coûte 10 fois plus qu'un accès à un registre, le coût total de la latence de la mémoire pourrait consommer 500 microsecondes, la moitié du budget entier.
Types de registres utilisés en robotique
Registres généraux des activités
Il s'agit des registres de chevaux de travail utilisés pour les opérations de mouvements arithmétiques, logiques et de données. Ils détiennent des variables, des résultats intermédiaires et des adresses. En temps réel, les codes robotiques, les compteurs de boucle critique, les valeurs temporaires de fusion de capteurs et les variables d'état du contrôleur PID devraient idéalement occuper des registres à usage général pour la durée du cycle de contrôle.
Registres des biens spéciaux
La plupart des processeurs comprennent des registres avec des fonctions dédiées qui sont directement pertinentes pour le contrôle robotique en temps réel:
- Compte-programme (PC):[ Tient l'adresse de la prochaine instruction. Dans les systèmes en temps réel, les gestionnaires d'interruption modifient le PC pour répondre aux événements critiques en temps.
- Stack Pointer (SP):[ Points en haut de la pile d'appel. Les systèmes en temps réel doivent gérer soigneusement la pile pour éviter les débordements pendant les interruptions imbriquées.
- Statut Register (SR): Contient des drapeaux de condition (zéro, transporter, déborder, interrompre activer). Le code de contrôle en temps réel vérifie fréquemment ces drapeaux pour prendre des décisions en fraction de seconde.
- Lien Register (LR): Sur les architectures ARM, conserve l'adresse de retour pour les appels de fonction. La gestion rapide des interruptions dépend de l'utilisation efficace du LR.
Registres de mémoire pour périphériques
Dans la robotique embarquée, de nombreux périphériques (timeurs, ADC, générateurs PWM, encodeurs) sont contrôlés par des registres macnés à la mémoire. Ce sont des adresses spéciales qui, lorsqu'elles sont lues ou écrites, communiquent directement avec le matériel. L'accès à ces registres est aussi rapide qu'un accès à la mémoire, mais souvent beaucoup plus rapide que de passer par une pile de pilotes.
Stratégies pour une utilisation efficace du registre dans le contrôle robotique en temps réel
Identifier et hiérarchiser les données critiques en temps
Les données d'un système robotique ne nécessitent pas toutes un accès au niveau du registre. La clé est d'identifier le sous-ensemble de variables auxquelles on accède à chaque cycle de contrôle et dont la latence affecte directement les performances du système.
- Lectures de capteurs de codeurs, IMU, capteurs de force et caméras.
- Points de consigne et trajectoires de référence pour le contrôleur.
- Termes d'erreur et accumulateurs intégrés dans les boucles PID.
- Indiquer les variables dans les filtres Kalman ou d'autres algorithmes d'estimation.
- Pointeurs de tampon de communication pour les protocoles en temps réel comme EtherCAT ou CAN FD.
Si le processeur ne peut pas les conserver simultanément en raison de la pression de l'enregistrement, la meilleure option est d'organiser le code de façon que les variables les plus fréquemment consultées soient toujours dans les registres au besoin.
Fonctions en ligne et réduction de l'appel de fonction
Pour les boucles de contrôle en temps réel, il est possible d'aligner les fonctions critiques sur les lignes de contrôle. Par exemple, une matrice multiplie pour le jacobin d'un robot ou une mise à jour de quaternion pour l'estimation de l'orientation peut être alignée pour garder tous les résultats intermédiaires dans les registres plutôt que de les déverser sur la pile.
Utiliser les optimisations Compiler Intelligemment
Les compilateurs modernes ont des passes sophistiquées d'attribution de registre. Les drapeaux comme et permettent une optimisation agressive, mais ils peuvent aussi introduire un comportement non déterministe si le compilateur réorganise les instructions de manière à violer les contraintes de temps. Pour le code en temps réel dur, envisager d'utiliser (optimiser pour la taille) avec une allocation manuelle prudente de registre via le mot clé (qui est une indication, pas une garantie) ou un assemblage en ligne pour les chemins les plus chauds.
Ensembles de registres dédiés à l'utilisation des gestionnaires d'interruption
De nombreux processeurs, en particulier la série ARM Cortex-M, ont un jeu de registres en banque pour les gestionnaires d'interruption. Cela signifie que lorsqu'un feu d'interruption, le processeur peut passer à un jeu de registres neufs sans enregistrer le contexte actuel. Cette fonctionnalité matérielle réduit considérablement la latence d'interruption et est essentielle pour les interruptions de capteurs haute fréquence.
Manuel Enregistrer l'attribution avec l'assemblage Inline
Lorsque l'attribution de registre générée par le compilateur est insuffisante pour des garanties en temps réel, l'assemblage manuel en ligne donne aux ingénieurs un contrôle complet. Par exemple, sur un ARM Cortex-M4 effectuant un calcul PID 32 bits, on peut lier le terme d'erreur à R0, le terme intégral à R1, et le terme dérivé à R2, et exécuter le calcul entier sans charge de mémoire ni stockage.
Étude de cas pratique : S'inscrire Optimisation dans un robot quadruplé
Considérez un robot quadruplé qui effectue un trot dynamique à 3 m/s. Chaque jambe a trois articulations, et le système de commande doit calculer la cinématique inverse, les couples d'articulation et les forces de réaction au sol à 500 Hz. La boucle de commande traite 12 articulations, chacune nécessitant une mise à jour PID, un contrôle de limite de couple et une conversion de commande courante.
Dans la version non optimisée, toutes les variables sont stockées en RAM. La boucle de contrôle prend 520 microsecondes, laissant seulement 480 microsecondes pour la lecture et la communication des capteurs dans le cycle 1 kHz. Cela ne laisse aucune marge d'erreur, et toute panne de cache ou interruption provoque le dépassement de la boucle.
Après optimisation de l'enregistrement:
- Tous les coefficients PID et les variables d'état pour chaque joint sont cartographiés sur un ensemble de registres dédié, mis à jour sur chaque cycle.
- Les opérations mathématiques critiques (sinus/cosine pour cinématique) utilisent une approximation rapide qui fonctionne entièrement dans les registres.
- L'assemblage en ligne est utilisé pour la boucle interne des opérations de la matrice.
- La fonction de commande principale est alignée, éliminant les frais généraux d'appel de fonction.
La boucle optimisée fonctionne à 180 microsecondes, libérant 820 microsecondes pour le traitement et la communication des capteurs. Le robot peut désormais gérer des entrées de capteurs supplémentaires (LiDAR, caméra de profondeur) sans sacrifier le taux de contrôle. L'amélioration est presque entièrement venue de réduire la latence d'accès à la mémoire en gardant les données dans les registres.
Pièges communs dans l'utilisation des registres pour les systèmes en temps réel
Sur-reliance sur l'optimisation du compilateur
Les compilateurs sont bons pour l'optimisation générale, mais ils ne peuvent pas comprendre pleinement les contraintes en temps réel d'un système robotique. Un compilateur peut renverser un registre à la mémoire juste parce qu'il voit un chemin de code faible-probabilité, ignorant que ce déversement causera une violation de calendrier dans le cas courant. Toujours profiler et inspecter l'assemblage généré pour le code en temps réel.
S'inscrire Fausse faim dans les boucles complexes
Les algorithmes de contrôle complexes, tels que le contrôle prédictif du modèle ou la dynamique du corps entier, nécessitent de nombreuses variables d'état. Avec des registres limités, le compilateur doit en déverser certains vers la mémoire. Cela peut causer un timing imprévisible si les modèles de déversement varient avec les données d'entrée. La solution est de simplifier l'algorithme, de le briser en petites phases qui s'inscrivent dans les registres, ou d'utiliser un processeur avec plus de registres.
Ignorer les effets de latences intermittentes
Si la boucle de commande principale utilise tous les registres disponibles, le contexte d'interruption prend plus de temps, augmentant la latence. Une stratégie commune est de réserver quelques registres exclusivement pour les gestionnaires d'interruption, en veillant à ce que la routine de service d'interruption puisse démarrer immédiatement sans enregistrer le fichier de registre complet.
Interférence antérieure liée à la cache
Dans les systèmes avec caches, un accès à la mémoire mal chronométré peut causer une panne de cache, qui déclenche une récupération de mémoire qui interfère avec le comportement en temps réel. Les registres, étant au sommet de la hiérarchie, n'ont pas de pannes de cache. En gardant autant de données que possible dans les registres, les ingénieurs évitent le non-déterminisme du comportement de cache.
Outils et techniques pour l'analyse de l'utilisation du registre
Analyse des sorties du compilateur
La plupart des compilateurs peuvent afficher des listes de montage avec des annotations d'allocation de registre. Pour GCC, utilisez pour voir quelles variables sont assignées à quels registres. C'est la façon la plus directe de vérifier que les variables critiques restent dans les registres tout au long de la boucle de contrôle.
Simulateurs à cycle accuré
Des outils comme QEMU ou des simulateurs spécifiques aux fournisseurs (p. ex. ARM Fast Models) peuvent compter les cycles et révéler les événements de déversement de registre. L'exécution de la boucle de contrôle dans un simulateur avec profilage de registre activé peut identifier exactement quand et pourquoi les registres sont déversés dans la mémoire.
Compteurs de performance matérielle
Les microcontrôleurs modernes ont des compteurs de performance intégrés qui peuvent mesurer les pannes de cache, les erreurs de prévision des branches et les décrochages de pipelines. En corrélant ces événements avec les décisions d'attribution des registres, les ingénieurs peuvent affiner leur code pour l'exploitation déterministe en temps réel.
Tendances futures : Registre des fichiers et robotique en temps réel
Fichiers de registre plus grands
Les architectures de processeurs sont en tendance vers des fichiers de registre plus grands. Le RISC-V, par exemple, permet des extensions personnalisées qui peuvent ajouter plus de registres. Comme les processeurs souples basés sur FPGA deviennent plus courants dans la robotique, les ingénieurs peuvent concevoir des fichiers de registre personnalisés adaptés à leurs charges de travail spécifiques en temps réel, comme un ensemble de registres dédié pour chaque axe d'un bras robotique.
Enregistrer Windows pour le changement de contexte rapide
Certaines architectures, comme SPARC et RISC-V avec l'extension « Zcmp », supportent les fenêtres de registre. Elles permettent à plusieurs appels de fonctions d'utiliser des registres frais sans enregistrer/restaurer explicitement, réduisant les frais généraux en code en temps réel profondément imbriqué.
Allocation de registre assisté par AI
Les techniques d'apprentissage automatique sont appliquées pour enregistrer les décisions d'attribution, en particulier pour les codes complexes avec des chemins imprévisibles. À l'avenir, les compilateurs peuvent apprendre les modèles en temps réel d'un système robotique et allouer des registres pour minimiser le temps d'exécution le plus défavorable plutôt que le cas moyen, profitant directement aux performances en temps réel difficiles.
Intégration de l'optimisation des registres dans le flux de travail pour le développement
L'optimisation des registres ne devrait pas être une réflexion après-vente dans la conception des systèmes robotiques. Elle devrait être intégrée dans le flux de travail de développement dès le début:
- Profiler tôt:[ Avant d'écrire un code optimisé, mesurez le calendrier de la boucle de contrôle de base et identifiez les goulets d'étranglement d'accès à la mémoire.
- Identifiez les chemins chauds: Déterminez quels chemins de code exécutent chaque cycle de contrôle et quelles données sont accessibles sur chaque itération.
- Allocate registers manuellement:[ Pour les chemins les plus chauds, utilisez l'assemblage en ligne ou la liaison de registre spécifique au compilateur pour garantir un accès rapide.
- Vérifier le déterminisme:[ Utiliser des compteurs de cycle et l'analyse du temps d'exécution du pire cas (WCET) pour confirmer que le code optimisé par le registre répond aux garanties en temps réel dans toutes les conditions.
- Utilisation du registre de documents:[ Maintenir une documentation claire pour laquelle les registres sont réservés, surtout si le code sera maintenu par plusieurs ingénieurs.
Conclusion
Les registres ne sont pas seulement un concept d'architecture informatique abstraite. Ils sont un outil pratique et de haut niveau pour atteindre des performances en temps réel en robotique. En comprenant comment fonctionnent les registres, en identifiant les données qui ont le plus besoin de leur vitesse, et en appliquant des techniques d'optimisation manuelle où les compilateurs sont en panne, les ingénieurs peuvent réduire considérablement la latence de la boucle de contrôle et améliorer la fiabilité du système.
La différence entre un robot qui se contrôle dans les registres et un robot qui se déverse dans la mémoire sur chaque cycle est la différence entre un système qui ne remplit que son budget de synchronisation et un système qui a une marge de manœuvre pour l'innovation.
Pour plus de détails sur ce sujet, envisagez d'explorer les ressources sur la conception de systèmes embarqués pour la robotique, comme le Embeddd Related guide to register allocation in real-time systems[, la documentation ARM architecture documentation for register use in Cortex-M processers, et la spécification RISC-V pour les extensions personnalisées pertinentes pour la robotique. Ces références fournissent des informations architecturales plus approfondies qui peuvent éclairer les décisions d'optimisation des registres réels dans les systèmes de contrôle robotique.