On Thursday, 24 October 2013 at 06:41:54 UTC, Timo Sintonen wrote:
On Thursday, 24 October 2013 at 05:37:49 UTC, Walter Bright 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. 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.

Yes, this is a simplest way to do it and works with gdc when compiled in separate file with no optimizations and inlining.

But todays peripherals may have tens of registers and they are usually represented as a struct. Using the peripheral often require several register access. Doing it this way will not make code very readable.

As a workaround I have all register access functions in a separate file and compile those files in a separate directory with no optimizations. The amount of code generated is 3-4 times more and this is a problem because in controllers memory and speed are always too small.

+1, This is what I feared. I don't think D needs a volatile keyword, but it would be nice to have *some* way to avoid this overhead using language features.

I'm beginning to think inline ASM is the only way to avoid this. That's not a deal breaker for me, but it makes me sad.

Reply via email to