2015-12-15 1 views
0

Les fonctions NVIC_EnableIRQ et NVIC_DisableIRQ sont destinées à activer et désactiver les interruptions sur un numéro d'IRQ donné. Pourquoi n'y a-t-il aucune fonction pour obtenir l'état actuel d'activation/désactivation de cette IRQ?Pourquoi CMSIS n'offre-t-il pas une fonction permettant de lire un statut IRQ activé/désactivé?

Le cas d'utilisation est la fonction typique qui doit désactiver l'interruption d'un module (IRQ) avant de continuer. Une fois la fonction terminée, l'IRQ sera réactivée. Mais pour être sûr, il faut d'abord lire si l'IRQ a été activé au moment où la fonction a été appelée.

Étant donné que la fonction n'est pas fournie par CMSIS, je suppose que mon cas d'utilisation ci-dessus est en quelque sorte erroné. Mais je ne vois pas comment.

Des indices?

Merci

(en utilisant CMSIS 4.1)

Répondre

0

Je pense que votre cas d'utilisation pourrait avoir un sens dans certaines situations.

Vous devez créer la fonction pour lire vous-même l'état activé de l'IRQ.

Vous avez juste besoin de vous assurer qu'aucune interruption ne modifie l'état activé entre la lecture de l'état activé et la désactivation réelle. Dans ce cas, vous finirez par définir le mauvais état activé après l'exécution de votre fonction.

Vous pouvez utiliser __disable_irq(); désactiver globalement tous irqs (Keil) Syntaxe:

bool isEnabled; 
__disable_irq(); 
isEnabled = ReadIrqEnabledState(irqNr); 
__enable_irq(); 

yourFunction(); 

if(isEnabled) 
    NVIC_EnableIrq(irqNr); 
else 
    NVIC_DisableIrq(irqNr); 
0

Vous pouvez utiliser cette fonction. Cela fonctionne bien ...

inline bool IsIRQEnabled (IRQn_Type IRQn) 
{ 
    return (0 != (NVIC->ISER[(uint32_t)((int32_t)IRQn) >> 5] & (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)))); 
}