4 votes

STM32F4 UART adressage demi-mot

J'essaie de créer mon propre code pour l'UART du STM32F4. Une particularité de cette puce est que si vous utilisez l'adressage par octet comme le fait le compilateur GNAT, lorsque vous définissez un seul bit, le bit correspondant dans l'autre octet du demi-mot est défini. La fiche technique indique d'utiliser l'adressage par demi-mot. Existe-t-il un moyen d'indiquer au compilateur de faire cela ? J'ai essayé pour CR1_register 'Taille utiliser 16 ;

mais cela n'a eu aucun effet. L'écriture du mot entier de 16 bits fonctionne, mais vous perdez la possibilité de définir des bits nommés.

5voto

ClearCloud8 Points 101

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;

1voto

Vovanium Points 2170

La méthode portable consiste à le faire explicitement : lire l'enregistrement entier, le modifier, puis le réécrire. Tant qu'il est déclaré Volatile un compilateur n'optimisera pas les lectures et les écritures.

    -- excerpt from my working code --
    declare
        R : Control_Register_1 := Module.CR1;
    begin
        R.UE := True;
        Module.CR1 := R;
    end;

C'est très verbeux, mais cela fait son travail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X