URL: https://linuxfr.org/forums/programmation-c--2/posts/volatile-struct-et-interruptions Title: Volatile, struct et interruptions. Authors: totof2000 Date: 2016年01月13日T22:23:25+01:00 License: CC By-SA Tags: Score: 2 Bonsoir à tous. Je suis en train de me poser plusieurs questions à propos de la façon de déclarer des variables devant être modifiées par une interruption. Je dispose d'une structure de ce type : struct buffer_t { byte *buff; int size; int head=0; int tail=0; byte status=BUFF_EMPTY; }; Cette structure représente un buffer circulaire rempli par une routine d'interruption, et (probablement) vidé par une autre routine d'interruption (pour l'instant je considère que ce n'est pas le cas). Je sais que lorsqu'on utilise une variable devant être modifiée par une interruption, on déclare cette variable volatile. Quand il s'agit d'une seule variable c'est simple. Par contre, quid d'une structure ? Personnellement, je pense que je dois déclarer volatile les éléments de la structure pouvant être modifiés par les interruptions. Dans mon cas il s'agit de: - head : modifié par l'interruption qui vide mon buffer si j'utilise une routine d'interruption pour le vider. Si ce n'est pas le cas, pas besoin de la déclarer volatile. - tail : modifié par l'interruption qui remplit le buffer. - status : modifié également par la lecture ou l'écriture d'un élément dans mon buffer. Les éléments size, ainsi que le pointeur sur byte buff ne changent pas, eux. par contre les éléments pointés par buff seront modifiés par la routine qui écrit (mais pas par celle qui lit puisqu'elle n'aura qu'à incrémenter l'index head pour supprimer l'élément de tête de mon buffer). Ma première question : je déclare ça comment ? a première vue je ferais un truc du genre : typedef volatile byte v_byte; puis je déclarerais ma structure ainsi : struct buffer_t { v_byte *buff; [ ... ] }; Qu'en pensez vous ? Enfin, mon buffer sera déclaré comme variable globale de la façon suivante : struct buffer_t buffer; Aurai-je besoin de déclarer un pointeur de type volatile sur ce buffer pour pouvoir y accéder dans mon interruption ? A priori, je pense que si je déclare un pointeur, il ne doit pas être de type volatile car cette valeur n'est jamais modifiée durant toute la vie du programme. Et vous, que me conseillez-vous ?