web-dev-qa-db-fra.com

Est nécessaire d'utiliser volatile lors de l'écriture sur le matériel dans C ou C ++?

Est-il nécessaire d'utiliser volatile lors de l'écriture sur le matériel (disons une FIFO) en C ou C++. Il est facile de confirmer de la documentation en ligne que volatile est nécessaire lors de la lecture du matériel, mais qu'en est-il de l'écriture? Je crains qu'un optimisateur puisse éliminer une boucle pour écrire un éventail de valeurs à une FIFO et écrivez simplement la dernière entrée.

17
Nigel Davies

Selon la norme C (C99 §6.7.3 Note de bas de page 106, page 109 ICI ):

Une déclaration volatile peut être utilisée pour décrire un objet correspondant à un port d'entrée/sortie mappé de mémoire ou d'un objet accédé par une fonction d'interruption de manière asynchrone. Les actions sur des objets ainsi déclarés ne doivent pas être "optimisées" par une mise en œuvre ou une réorganisation, sauf autorisation autorisée par les règles d'évaluation des expressions.

Si vous travaillez avec un compilateur C conformiste, vous avez raison de supposer qu'il serait nécessaire d'utiliser volatile lors de l'écriture sur le matériel mappé en mémoire.


Selon la machine et le compilateur spécifiques, vous travaillez sur, volatile l'utilisation de volatile pourrait, au plus, être redondant:

Une implémentation pourrait définir une correspondance individuelle entre la sémantique abstraite et réelle: à chaque point de séquence, les valeurs des objets réels conviendront avec ceux spécifiés par la sémantique abstraite. Le mot clé volatile serait alors redondant.


Selon C++, selon le dernier brouillon :

Note 5: volatile est un indice à la mise en œuvre pour éviter une optimisation agressive impliquant l'objet, car la valeur de l'objet peut être modifiée par des moyens indétectables par une implémentation. En outre, pour certaines implémentations, la volatilité peut indiquer que des instructions de matériel spécial sont nécessaires pour accéder à l'objet. Voir [INTRO.EXECUTION] Pour une sémantique détaillée. En général, la sémantique de volatils est destinée à être la même en C++ comme dans C . - Note de fin

2
Marco Bonelli