APU, RPU et mémoires
Comprendre les processeurs applicatifs et temps réel, les caches, les espaces d'adressage et les mémoires d'un Zynq.
Deux types de processeurs
Un Zynq UltraScale+ MPSoC possède une APU et une RPU. Ces unités répondent à des besoins différents.
L'Application Processing Unit utilise des Cortex-A53. Elle vise les applications riches, Linux et les traitements qui profitent des caches, de la mémoire virtuelle et de plusieurs coeurs.
La Real-time Processing Unit utilise deux Cortex-R5. Elle vise une réponse déterministe, donc un temps d'exécution dont les limites sont connues. Les coeurs peuvent fonctionner séparément ou en lockstep, un mode où ils exécutent les mêmes instructions afin de détecter une divergence.
| Propriété | APU | RPU |
|---|---|---|
| Processeur | Cortex-A53 | Cortex-R5 |
| Usage principal | Application et système d'exploitation | Temps réel et sûreté |
| Gestion mémoire | MMU et mémoire virtuelle | MPU sans traduction d'adresse |
| Mémoire locale | Caches | TCM et caches |
| Exécution redondante | Non prévue comme mode principal | Mode lockstep disponible |
L'APU
L'APU constitue l'unité de calcul générale la plus performante du PS. Chaque coeur dispose d'un cache L1. Les coeurs partagent un cache L2 et une infrastructure de cohérence.
La Memory Management Unit, ou MMU, traduit les adresses virtuelles et applique des attributs mémoire. Linux l'utilise pour isoler les processus. Une application bare-metal peut aussi configurer ces attributs afin de distinguer la mémoire normale des registres de périphériques.
Un registre de périphérique ne doit pas être traité comme une zone de RAM mise en cache. Les bibliothèques Xilinx fournissent des fonctions d'entrée et sortie qui préservent mieux la sémantique de l'accès matériel.
#include "xil_io.h"
u32 read_status(UINTPTR base)
{
return Xil_In32(base + 0x04U);
}
void start_accelerator(UINTPTR base)
{
Xil_Out32(base + 0x00U, 0x01U);
}Les offsets doivent venir de la spécification de l'IP. L'adresse de base doit venir de xparameters.h ou d'une description de matériel équivalente.
La RPU
La RPU est conçue pour le temps réel. Chaque Cortex-R5 peut accéder à une Tightly Coupled Memory, ou TCM, sans traverser la mémoire principale. L'Error Correction Code, ou ECC, détecte et corrige certaines erreurs dans les bits mémorisés.
La Memory Protection Unit, ou MPU, protège des régions de mémoire sans créer d'espace d'adresses virtuelles. Cette simplicité rend le comportement plus déterministe.
Le mode lockstep utilise les deux coeurs pour exécuter le même programme. Il améliore la détection des fautes, mais il ne double pas la puissance de calcul. Le mode split permet aux deux coeurs d'exécuter des programmes différents.
Les mémoires du système
Un système Zynq combine plusieurs mémoires.
| Mémoire | Propriété | Usage fréquent |
|---|---|---|
| OCM | Interne au PS et rapide | Démarrage, données à faible latence |
| TCM | Très proche du RPU | Code et données temps réel |
| DDR | Grande capacité externe | Applications, Linux, buffers |
| BRAM et UltraRAM | Dans la PL | Buffers matériels et tables locales |
| Cache | Transparent pour le processeur | Réduction de la latence moyenne |
La DDR offre la capacité, mais sa latence varie. Les arbitrages, les rafraîchissements et les autres maîtres AXI influencent le temps d'accès. Une exigence temps réel stricte peut justifier l'usage de TCM, d'OCM ou de BRAM.
La carte mémoire
Chaque maître possède une vue de l'espace d'adressage. Les périphériques du PS et de la PL apparaissent à des adresses définies par l'architecture et par le Block Design.
Sur Zynq-7000, les ports maîtres généralistes du PS donnent accès à des fenêtres destinées aux périphériques de la PL. Sur MPSoC, l'espace d'adressage est plus large et dépend aussi du maître utilisé.
Il faut distinguer trois informations.
- L'adresse visible par le processeur.
- L'adresse utilisée par un autre maître, par exemple un DMA.
- Les attributs de cache et de protection associés à la région.
Deux blocs peuvent viser les mêmes cellules DDR tout en utilisant des chemins et des politiques de cohérence différents.
Les caches et le DMA
Un DMA lit et écrit la mémoire sans passer par les instructions de copie du processeur. Le cache du processeur peut alors contenir une ancienne copie des données.
Avant qu'un DMA lise un buffer produit par le CPU, le logiciel doit généralement nettoyer le cache correspondant. Après qu'un DMA a écrit un buffer, le logiciel doit généralement invalider les lignes concernées avant de lire les nouvelles données.
#include "xil_cache.h"
Xil_DCacheFlushRange((UINTPTR)tx_buffer, tx_size);
start_dma_transfer(tx_buffer, rx_buffer, tx_size);
wait_for_dma();
Xil_DCacheInvalidateRange((UINTPTR)rx_buffer, tx_size);La séquence exacte dépend du port AXI et du niveau de cohérence choisi. Un port cohérent réduit certaines opérations de maintenance, mais il ne supprime pas le besoin de comprendre les attributs mémoire et le propriétaire du buffer.
Interruptions et timers
Le GIC reçoit les interruptions, applique les priorités et les dirige vers les coeurs. Un timer peut produire une interruption périodique. Un périphérique de la PL peut signaler une fin de traitement.
Une routine d'interruption doit rester courte. Elle acquitte la source, enregistre l'événement et laisse le traitement long à la boucle principale ou à une tâche.
L'attente active convient à un test court. Elle consomme le processeur et rend le temps de réponse dépendant de la boucle. Une interruption convient mieux lorsque le processeur doit effectuer d'autres tâches.
Références officielles
Les cartes mémoire, caches et processeurs sont décrits dans UG585 pour Zynq-7000 et dans UG1085 pour Zynq UltraScale+ MPSoC.
À retenir
L'APU vise les applications et les systèmes d'exploitation. La RPU vise le temps réel. La DDR apporte la capacité. OCM et TCM apportent une latence plus faible. Les caches améliorent les performances, mais ils imposent une politique claire lorsque le processeur partage des buffers avec un DMA ou la PL.
Tester mes connaissances - Quiz du chapitre