comp.lang.ada
 help / color / mirror / Atom feed
From: daniel.dmk@googlemail.com
Subject: Re: Forcing GNAT to use 32-bit load/store instructions on ARM?
Date: Tue, 1 Jul 2014 14:55:13 -0700 (PDT)
Date: 2014-07-01T14:55:13-07:00	[thread overview]
Message-ID: <997f6d08-d5cc-44b4-b31b-c9de3450ad38@googlegroups.com> (raw)
In-Reply-To: <c1glt9F8dvoU1@mid.individual.net>

On Tuesday, 1 July 2014 22:01:35 UTC+1, Niklas Holsti  wrote:
> On 14-07-01 23:40 , Simon Clubley wrote:
> 
> 
> >> On Tuesday, 1 July 2014 13:03:30 UTC+1, Simon Clubley  wrote:
> 
> >>>
> 
> >>> Pragma Atomic _should_ have given you the guarantee you needed.
> 
> 
> 
> Unfortunately not, see below.
> 
> 
> 
> >>> Are you double checked how it's being used in the code ?
> 
> >>
> 
> >> So I've set up a project to demonstrate only this problem. I've
> 
> >> created a package called "Test" which contains the structure
> 
> >> definition, and the definition of the register itself at the
> 
> >> fixed address:
> 
> >>
> 
> >>    with System;
> 
> >>
> 
> >>    package Test is
> 
> >>       type Bits_1 is mod 2**1 with Size => 1;
> 
> >>       type Bits_2 is mod 2**2 with Size => 2;
> 
> >>       type Bits_28 is mod 2**28 with Size => 28;
> 
> >>       
> 
> >>       type CR_Register is
> 
> >>          record
> 
> >>             Reserved_1 : Bits_2;
> 
> >>             RNGEN      : Bits_1;
> 
> >>             IE         : Bits_1;
> 
> >>             Reserved_2 : Bits_28;
> 
> >>          end record;
> 
> >>       for CR_Register use
> 
> >>          record
> 
> >>             Reserved_1 at 0 range 0 .. 1;
> 
> >>             RNGEN      at 0 range 2 .. 2;
> 
> >>             IE         at 0 range 3 .. 3;
> 
> >>             Reserved_2 at 0 range 4 .. 31;
> 
> >>          end record;
> 
> >>       for CR_Register'Size use 32;
> 
> >>
> 
> >>       CR : CR_Register with
> 
> >>         Volatile,
> 
> >>           Atomic,
> 
> >>           Address => System'To_Address(16#5006_0800#);
> 
> >>    end Test;
> 
> >>
> 
> >> So I've now defined the reserved bits in the register, and I have
> 
> >> added "Atomic" to the CR register.
> 
> >>
> 
> >> In my main procedure I have the following:
> 
> >>
> 
> >>    with System;
> 
> >>    with Test;
> 
> >>
> 
> >>    procedure Main
> 
> >>      with SPARK_Mode => On
> 
> >>    is
> 
> >>       pragma Priority(System.Priority'First);
> 
> >>       
> 
> >>    begin
> 
> >>       
> 
> >>       Test.CR.RNGEN := 1;
> 
> >>       
> 
> >>       loop
> 
> >>          null;
> 
> >>       end loop;
> 
> >>
> 
> >>    end Main;
> 
> >>
> 
> >> The line where I assign the RNGEN bit produces the following
> 
> >> assembly code (using no optimization: -O0):
> 
> >>
> 
> >>    mov.w   r3, #2048       ; 0x800
> 
> >>    movt    r3, #20486      ; 0x5006
> 
> >>    ldrb    r2, [r3, #0]
> 
> >>    orr.w   r2, r2, #4
> 
> >>    strb    r2, [r3, #0]
> 
> >>
> 
> > 
> 
> > This is the exact same issue I encountered when I tried to use bitfields
> 
> > in C instead of bitmasks. The difference here is that Ada's Atomic pragma
> 
> > is supposed to stop this type of code from being generated.
> 
> 
> 
> Actually not... as I also forgot... because the Ada rule is RM C.6(15):
> 
> 
> 
> "For an atomic object (including an atomic component) all reads and
> 
> updates of the object as a whole are indivisible."
> 
> 
> 
> Note the part "as a whole". If you access a component of an atomic
> 
> record, that is not accessing the record "as a whole".
> 

Aha, this clarifies it all perfectly. Thank you. I'll avoid modifying these registers in part, and make sure that the registers are always accessed in whole. 


  parent reply	other threads:[~2014-07-01 21:55 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-30 22:11 Forcing GNAT to use 32-bit load/store instructions on ARM? daniel.dmk
2014-06-30 23:41 ` Jeffrey Carter
2014-07-01 12:06   ` Simon Clubley
2014-07-01 15:44     ` Niklas Holsti
2014-07-01 17:26       ` Simon Clubley
2014-07-01 17:18     ` Simon Wright
2014-07-01 19:43       ` Simon Wright
2014-07-01 17:28     ` Jeffrey Carter
2014-07-01  0:55 ` anon
2014-07-01  4:30 ` Niklas Holsti
2014-07-01  8:11 ` Dmitry A. Kazakov
2014-07-01 12:09   ` Simon Clubley
2014-07-01 12:20     ` Dmitry A. Kazakov
2014-07-01 17:00       ` Simon Clubley
2014-07-01 19:36         ` Dmitry A. Kazakov
2014-07-01 20:08           ` Simon Clubley
2014-07-02 22:24             ` Randy Brukardt
2014-07-06 20:40               ` MatthiasR
2014-07-07  0:25                 ` Simon Clubley
2014-07-07 22:38                 ` Randy Brukardt
2014-07-08  6:51                   ` Simon Wright
2014-07-10 11:47                     ` Simon Wright
2014-07-10 13:06                       ` Simon Clubley
2014-07-11 18:05                         ` Simon Wright
2014-07-11 20:22                           ` Simon Clubley
2014-07-08  8:50                   ` Brian Drummond
2014-07-08 12:12                   ` Simon Clubley
2014-07-08 13:26                     ` G.B.
2014-07-08 17:13                       ` Simon Clubley
2014-07-08 15:36                     ` Adam Beneschan
2014-07-08 15:40                       ` Adam Beneschan
2014-07-08 20:34                     ` Randy Brukardt
2014-07-09  7:31                       ` Dmitry A. Kazakov
2014-07-10  0:11                         ` Simon Clubley
2014-07-20 11:35                   ` MatthiasR
2014-07-20 15:49                     ` Simon Clubley
2014-07-26 11:05                       ` MatthiasR
2014-08-10 11:20                         ` MatthiasR
2014-07-01 12:03 ` Simon Clubley
2014-07-01 19:52   ` daniel.dmk
2014-07-01 20:40     ` Simon Clubley
2014-07-01 20:55       ` Simon Clubley
2014-07-01 21:01       ` Niklas Holsti
2014-07-01 21:20         ` Simon Clubley
2014-07-01 22:38           ` Niklas Holsti
2014-07-02 16:49             ` Simon Clubley
2014-07-01 21:55         ` daniel.dmk [this message]
2014-07-02  7:30     ` Simon Wright
2014-07-02 18:52       ` daniel.dmk
2014-07-04 23:51       ` Niklas Holsti
2014-07-05  0:18         ` Niklas Holsti
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox