ARM bare-metal programming in D (cont) - volatile

Iain Buclaw ibuclaw at ubuntu.com
Wed Oct 23 23:36:50 PDT 2013


On 24 October 2013 06:37, Walter Bright <newshound2 at digitalmars.com> wrote:
> On 10/23/2013 5:43 PM, Mike wrote:
>>
>> I'm interested in ARM bare-metal programming with D, and I'm trying to get
>> my
>> head wrapped around how to approach this.  I'm making progress, but I
>> found
>> something that was surprising to me: deprecation of the volatile keyword.
>>
>> In the bare-metal/hardware/driver world, this keyword is important to
>> ensure the
>> optimizer doesn't cache reads to memory-mapped IO, as some hardware
>> peripheral
>> may modify the value without involving the processor.
>>
>> I've read a few discussions on the D forums about the volatile keyword
>> debate,
>> but noone seemed to reconcile the need for volatile in memory-mapped IO.
>> Was
>> this an oversight?
>>
>> What's D's answer to this?  If one were to use D to read from
>> memory-mapped IO,
>> how would one ensure the compiler doesn't cache the value?
>
>
> volatile was never a reliable method for dealing with memory mapped I/O.

Are you talking dmd or in general (it's hard to tell).  In gdc,
volatile is the same as in gcc/g++ in behaviour.  Although in one
aspect, when the default storage model was switched to thread-local,
that made volatile on it's own pointless.

As a side note, 'shared' is considered a volatile type in gdc, which
differs from the deprecated keyword which set volatile at a
decl/expression level.  There is a difference in semantics, but it
escapes this author at 6.30am in the morning.  :o)

In any case, using shared would be my recommended route for you to go down.


> The correct and guaranteed way to make this work is to write two "peek" and
> "poke" functions to read/write a particular memory address:
>
>     int peek(int* p);
>     void poke(int* p, int value);
>
> Implement them in the obvious way, and compile them separately so the
> optimizer will not try to inline/optimize them.

+1.  Using an optimiser along with code that talks to hardware can
result in bizarre behaviour.

-- 
Iain Buclaw

*(p < e ? p++ : p) = (c & 0x0f) + '0';


More information about the Digitalmars-d mailing list