Si vos vars globales sont vraiment utilisées que dans une fonction, que vous perdez rien en les rendant dans les locaux statiques car le fait qu'ils étaient mondiale fait la fonction de toute façon qui les a utilisés non-réentrant. Vous gagnez un peu en limitant la portée de la variable.
Vous devez apporter cette modification à toutes les variables globales utilisées dans une seule fonction, puis examiner chaque variable locale statique pour voir si elle peut être rendue non statique (automatique).
La règle est la suivante: si la variable est utilisée dans la fonction avant d'être définie, laissez-la statique.
Exemple d'une variable pouvant être rendue locale automatique (vous devez mettre "int nplus4;
" à l'intérieur de la fonction (vous n'avez pas besoin de la mettre à zéro puisqu'elle est définie avant l'utilisation et cela devrait émettre un avertissement si vous l'utiliser avant de le mettre, une vérification utile).
int nplus4 = 0; // used only in add5
int add5 (int n) {
nplus4 = n + 4; // set
return nplus4 + 1; // use
}
le nplus4
var est défini avant d'être utilisé Voici un exemple qui devrait être laissé statique en mettant « static int nextn = 0;
» à l'intérieur de la fonction:
int nextn = 0; // used only in getn
int getn (void) {
int n = nextn++; // use, then use, then set
return n;
}
Notez que cela peut être compliqué, "nextn++
" n'est pas paramétré, c'est l'utilisation et le réglage car c'est équivalent à "nextn = nextn + 1
". Autre chose à surveiller: dans un environnement RTOS, l'espace de la pile peut être plus limité que la mémoire globale, donc faites attention à déplacer les grandes variables globales telles que "char buffer[10000]
" dans les fonctions.
Il est plus facile de rendre le multitâche de variables globales conscient en le protégeant avec mutex, de traiter la variable statique de portée de procédure. – landmn
Rien ne vous empêche de protéger une variable statique locale avec un mutex, comme vous l'avez fait avec la variable globale. En fait, si une variable globale a un mutex associé, vous devriez également déplacer ce mutex dans la portée. – mbyrne215
Peut-être que c'est lié à la mise en œuvre, mais les mutex dans le RTOS avec lesquels je travaille sont toujours globaux. Par conséquent, rendre la variable protégée aussi globale est plus intuitif pour moi. – landmn