ARM bare-metal programming in D (cont) - volatile
Johannes Pfau
nospam at example.com
Fri Oct 25 11:11:36 PDT 2013
Am Fri, 25 Oct 2013 17:20:23 +0200
schrieb "Timo Sintonen" <t.sintonen at luukku.com>:
> On Friday, 25 October 2013 at 13:07:56 UTC, Daniel Murphy wrote:
> > "Timo Sintonen" <t.sintonen at luukku.com> wrote:
>
> >> I have not (yet) had any problems when writing io registers
> >> but more with read access. Any operation after write should
> >> read the register back from real memory and not in processor
> >> registers. Any repetitive read should always read the real io
> >> register in memory. The hardware may change the register value
> >> at any time.
> >>
> >> Now a very common task like
> >> while (regs.status==0) ...
> >> may be optimized to an endless loop because the memory is read
> >> only once before the loop starts.
> >>
> >> I understood from earlier posts that variables should not be
> >> volatile but the operation should. It seems it is possible to
> >> guide the compiler like above. So would the right solution be
> >> to have a volatile block, similar to synchronized? Inside that
> >> block no memory access is optimized. This way no information
> >> of volatility is needed outside the block or in variables used
> >> there.
> >>
> >
> > Volatile blocks are already in the language, but they suck.
> > You don't want
> > to have to mark every access as volatile, because all accesses
> > to that
> > hardware register are going to be volatile. You want it to be
> > automatic.
> >
> > I'm really starting to think intrinsics are the way to go.
> > They are safe,
> > clear, and can be inlined. The semantics I imagine would be
> > along the lines
> > of llvm's volatile memory accesses
> > (http://llvm.org/docs/LangRef.html#volatile-memory-accesses)
>
> It seems that it is two different things here. As far as I
> understand, sharing means something like 'somebody may change my
> data' and volatility is something like 'I have to know
> immediately if the data is changed'. It has become obvious that
> these two are not easy to fit together and make a working model.
>
> The original question in this thread was to have a proper way to
> access hardware registers. So far, even the top people have
> offered only workarounds. I wonder how long D can be marketed as
> system language if it does not have a defined and reliable way to
> access system hardware.
>
> Register access occurs often in time critical places like
> interrupt routines. A library routine or external function is not
> a choice. Whatever the feature is, it has to be built in the
> language. I don't care if it is related to variables, blocks or
> files as long as I do not have to put these files in a separate
> directory like I do now.
>
> I would like to hear more what would be the options. Then we
> could make a decision what is the right way to go.
What's wrong with the solution Iain mentioned, i.e the way shared
is implemented in GDC?
http://forum.dlang.org/thread/bifrvifzrhgocrejepvc@forum.dlang.org?page=4#post-mailman.2475.1382646532.1719.digitalmars-d:40puremagic.com
http://forum.dlang.org/thread/bifrvifzrhgocrejepvc@forum.dlang.org?page=4#post-mailman.2480.1382655175.1719.digitalmars-d:40puremagic.com
More information about the Digitalmars-d
mailing list