2015-10-14 3 views
0

Ma compréhension de «fonction réentrante» est que c'est une fonction qui peut être interrompue (par exemple par un ISR ou un appel récursif) et reprise par la suite de sorte que la sortie globale de la fonction ne soit affectée dans aucun manière par l'interruption.Confusion concernant les fonctions réentrantes

Voici un exemple d'une fonction rentrante de Wikipedia https://en.wikipedia.org/wiki/Reentrancy_(computing)

int t; 

void swap(int *x, int *y) 
{ 
    int s; 

    s = t; // save global variable 
    t = *x; 
    *x = *y; 

    // hardware interrupt might invoke isr() here! 
    *y = t; 
    t = s; // restore global variable 
} 

void isr() 
{ 
    int x = 1, y = 2; 
    swap(&x, &y); 
} 

Je pensais, si nous modifions la RSR comme ceci:

void isr() 
{ 
    t=0; 
} 

Et disons donc que le La fonction main appelle la fonction swap, mais soudainement une interruption se produit, alors la sortie serait sûrement déformée car le swap ne serait pas correct, ce qui dans mon esprit rend cette fonction non-réentrante.

Est-ce que ma pensée est bonne ou mauvaise? Y a-t-il une erreur dans ma compréhension de la réentrance?

Répondre

1

La réponse à votre question:

que la fonction principale appelle la fonction d'échange, mais tout à coup une interruption se produit, la sortie serait sûrement obtenir déformée que l'échange ne serait pas approprié, ce qui mon esprit rend cette fonction non réentrante.

Est-ce que non, parce que la ré-entrée est (par définition) définie par rapport à soi-même. Si les appels isr sont inversés, l'autre échange sera sûr. Cependant, swap est thread-dangereux, cependant.

La bonne façon de penser dépend de la définition précise de réentrance et filet de sécurité (Voir, par exemple Threadsafe vs re-entrant) Wikipédia, la source du code en question, a choisi la définition de la fonction rentrante d'être « si elle peut être interrompu au milieu de son exécution et ensuite appelé de nouveau en toute sécurité ("rentré") avant que ses invocations précédentes ne terminent l'exécution ".

1

Je n'ai jamais entendu le terme ré-entrée utilisé dans le contexte des routines de service d'interruption. Il incombe généralement aux ISR (et/ou au système d'exploitation) de maintenir la cohérence - le code d'application ne devrait pas avoir besoin de savoir quoi faire d'une interruption. Qu'une fonction est rentrante signifie généralement qu'elle peut être appelée à partir de plusieurs threads simultanément - ou par elle-même récursivement (directement ou via une chaîne d'appel plus élaborée) - tout en conservant une cohérence interne. Pour que les fonctions soient réentrantes, elles doivent généralement éviter d'utiliser des variables statiques et, bien sûr, éviter les appels à d'autres fonctions qui ne sont pas elles-mêmes rentrantes.