La méthode GNAT, telle qu'elle est utilisée dans l'application AdaCore Bibliothèque des conducteurs d'Ada est d'utiliser l'aspect "GNAT uniquement". Volatile_Full_Access
à propos duquel l Manuel de référence GNAT dit
L'effet est similaire à celui de pragma Volatile, sauf que toute référence à l'objet est garantie de n'être faite qu'avec des instructions qui lisent ou écrivent tous les bits de l'objet. En outre, si l'objet est d'un type composite, toute référence à un sous-composant de l'objet est garantie pour lire et/ou écrire tous les bits de l'objet.
L'intention est que cela soit adapté à l'utilisation de périphériques d'E/S à mémoire partagée sur certaines machines. Notez qu'il y a deux aspects importants pour lesquels ceci est différent de pragma Atomic. Premièrement, une référence à un objet Volatile_Full_Access n'est pas une action séquentielle au sens de RM 9.10 et, par conséquent, ne crée pas de point de synchronisation. Deuxièmement, dans le cas de pragma Atomic, il n'y a aucune garantie que tous les bits seront accédés si la référence n'est pas à l'objet entier ; le compilateur est autorisé (et le fera généralement) à accéder à une partie seulement de l'objet dans ce cas.
Leur code est le suivant
-- Control register 1
type CR1_Register is record
-- Send break
SBK : Boolean := False;
...
end record
with Volatile_Full_Access, Size => 32,
Bit_Order => System.Low_Order_First;
for CR1_Register use record
SBK at 0 range 0 .. 0;
...
end record;