Interruptions et contrôleur GIC
Configurer une interruption Zynq de la source au processeur, écrire une ISR courte et analyser la latence.
Chargement…
Configurer une interruption Zynq de la source au processeur, écrire une ISR courte et analyser la latence.
Une interruption permet à un périphérique de demander un traitement. Une exception peut aussi provenir de l'exécution du processeur, par exemple d'un accès interdit. La table des vecteurs dirige vers les gestionnaires concernés.
Le périphérique positionne son état puis sa requête si le masque local l'autorise. Le GIC vérifie activation, priorité et cible processeur. Le gestionnaire général appelle l'ISR enregistrée ; celle-ci traite et acquitte la source avant le retour.
Activer le GIC seul ne suffit pas : source locale et exceptions processeur doivent aussi être actives.
Le pilote XScuGic recherche la configuration, initialise l'instance puis raccorde le gestionnaire au processeur :
XScuGic gic;
int gic_init(void)
{
XScuGic_Config *config;
int status;
config = XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID);
if (config == NULL) {
return XST_FAILURE;
}
status = XScuGic_CfgInitialize(&gic, config, config->CpuBaseAddress);
if (status != XST_SUCCESS) {
return status;
}
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, &gic);
Xil_ExceptionEnable();
return XST_SUCCESS;
}Ce flux emploie les symboles d'identifiants du BSP historique. Adaptez les paramètres aux en-têtes générés lorsque votre plateforme utilise un autre flux.
Pour un TTC en mode intervalle, calculez préscaler et intervalle à partir de son horloge. La routine lit et acquitte les causes puis signale l'événement :
static volatile u8 update_flag;
static void tick_handler(void *reference)
{
XTtcPs *timer = (XTtcPs *)reference;
u32 status = XTtcPs_GetInterruptStatus(timer);
XTtcPs_ClearInterruptStatus(timer, status);
if ((status & XTTCPS_IXR_INTERVAL_MASK) != 0U) {
update_flag = 1U;
}
}int status = XScuGic_Connect(&gic, XPAR_XTTCPS_0_INTR,
(Xil_InterruptHandler)tick_handler, &timer);
if (status != XST_SUCCESS) {
return status;
}
XScuGic_Enable(&gic, XPAR_XTTCPS_0_INTR);
XTtcPs_EnableInterrupts(&timer, XTTCPS_IXR_INTERVAL_MASK);La configuration complète doit aussi initialiser le TTC, fixer son intervalle, choisir le type de déclenchement du GIC et démarrer le timer. Contrôlez le retour de la connexion avant d'activer la source.
Une source au niveau reste active jusqu'à l'effacement de sa cause. Oublier cet acquittement peut rappeler l'ISR immédiatement. Une source au front exige une impulsion et une chaîne de synchronisation compatibles ; le type configuré doit correspondre au périphérique réel.
Le GIC gère des interruptions privées et partagées. Son acquittement ne remplace pas nécessairement celui du périphérique.
La latence inclut masquage, arbitrage, entrée dans le gestionnaire et accès mémoire/cache. Une ISR en DDR peut subir un premier accès coûteux. Un placement en OCM ou une optimisation de cache doit être compatible avec la cible et mesuré.
Gardez l'ISR courte : acquittement et enregistrement de l'événement, puis calcul et affichage ailleurs. volatile rend visibles les changements d'un drapeau, mais n'assure pas l'atomicité d'une séquence lecture/effacement. Le drapeau fusionne plusieurs ticks ; pour les compter sans perte, utilisez une stratégie de compteur et de section critique adaptée.
Vérifiez état et masque du périphérique, identifiant généré, connexion et activation GIC, puis activation globale. Si l'ISR se répète sans arrêt, contrôlez acquittement et mode front/niveau.
La documentation SCU GIC et l'exemple d'initialisation précisent l'API.
Tester mes connaissances - Quiz du chapitre