[resolu] [C] [GCC] static volatile variable et warning (ou pas)

static volatile variable et warning (ou pas) [resolu] [C] [GCC] - C - Programmation

Marsh Posté le 26-11-2020 à 18:24:49    

Ami(e)s du C Bonsoir :hello: ,
 
j'ai remarqué un truc que je ne comprend pas, quelqu'un pour me dire ce qui se passe?
 
J'ai besoin d'une variable globale pour passer des infos entre une ISR et le programme principal (pour µC). Je ne veux pas que cette variable soit accessible depuis un autre fichier (je considère que ça fait partie d'un code propre de limiter le scope de ses variables au maximum).
 
Donc:
1) ->volatile
2) ->static
 
Pour l'instant cette variable est juste déclarée mais utilisée nulle part:

Code :
  1. #include <stdbool.h>
  2. ...
  3. static volatile bool flag_write=false;


Je m'attendais à un warning "defined but not used" mais non, pas de warning. Par contre si je vire le "volatile" j'ai bien le warning.
 
Y a un truc qui m'échappe là. :??:  Pourquoi je n'ai pas de warning avec "volatile"? Est-ce que "volatile" annule le "static"?
 
avr-gcc (GCC) 5.4.0


Message édité par rat de combat le 28-11-2020 à 11:11:28
Reply

Marsh Posté le 26-11-2020 à 18:24:49   

Reply

Marsh Posté le 26-11-2020 à 22:05:01    

Le contraire serait apparemment un bug, qui était présent dans GCC 4.8 : https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57258
La raison est :

Citation :

a volatile variable is only unused if it is not
accessed, otherwise code will be generated for
using it
following the semantics of the abstract
machine

Reply

Marsh Posté le 28-11-2020 à 11:10:59    

Merci pour le lien. :jap:  
 
Je pense avoir compris. :o

Reply

Marsh Posté le 05-12-2020 à 11:45:28    

le qualifier volatile signifie entre autres que la variable peux être modifiée sans connaissance du compilateur (par exemple si elle est mappée sur un registre)
donc c'est normal qu'il ne te donne pas le warning car... il sais pas ^^

 

ah sinon, pour une var partagée entre une isr et le contexte normal, oublie pas d'y faire accès dans une section critique (disable/enable interrupt) si les manipulations que tu fait dessus ne sont pas atomiques.
(= pas une seule instruction = possible d'etre interrompu par une isr, ce qui inclus l'isr qui manipule la même var ! nice bugs en perspective :D )


Message édité par Ivanovitch le 05-12-2020 à 11:53:50
Reply

Marsh Posté le 05-12-2020 à 17:51:41    

Oui je sais pour le atomic, merci pour le rappel.

Reply

Marsh Posté le 07-12-2020 à 13:50:04    

Pour info (point 2) : https://gitlab.gnome.org/GNOME/glib/-/tags/2.67.1
Le lien donné (dans le lien ci-dessus) en contient plein d'autres, avec à priori pas mal de choses intéressantes (j'ai survolé vraiment très vite).
Ne pas se laisser déconcerter par le "No" sur la page en question !  :D


Message édité par kajoux le 07-12-2020 à 13:51:50
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed