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

Mike none at none.com
Wed Oct 23 23:50:06 PDT 2013


On Thursday, 24 October 2013 at 06:40:14 UTC, Iain Buclaw wrote:
>>> volatile was never a reliable method for dealing with memory 
>>> mapped I/O.
>>> 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.
>>
>>
>> Thanks for the answer, Walter. I think this would be 
>> acceptable in many
>> (most?) cases, but not where high performance is needed  I 
>> think these
>> functions add too much overhead if they are not inlined and in 
>> a critical
>> path (bit-banging IO, for example).  Afterall, a read/write to 
>> a volatile
>> address is a single atomic instruction, if done properly.
>>
>
> Operations on volatile are *not* atomic. Nor do they establish a
> proper happens-before relationship for threading.  This is why 
> we have
> core.atomic as a portable synchronisation mechanism in D.
>
>
> Regards

I probably shouldn't have used the word "operations".  What I 
meant is reading/writing to a volatile, aligned word in memory is 
an atomic operation.  At least on my target platform it is.  That 
may not be a correct generalization, however.

The point I'm trying to make is the Peek/Poke function proposal 
adds function overhead compared to the "volatile" method in C, 
and I'm just want to know if there's a way to to eliminate/reduce 
it.


More information about the Digitalmars-d mailing list