Accessing peripheral registers - the next version

Timo Sintonen via D.gnu d.gnu at puremagic.com
Sat Aug 27 01:05:08 PDT 2016


I updated my system to gdc master. As expected, my program that 
uses shared variables to accress hardware registers did not work 
any more. I took the old Volatile datatype we made some years ago 
and the modified version is something like this:

struct Volatile(T) {
      T raw;

      nothrow:

      @disable this(this);

      A opAssign(A)(A a) { volatileStore(&raw, a); return a; }

      T load() @property { return volatileLoad(&raw); }

      alias load this;

      void opOpAssign(string OP)(const T rhs) {
           auto v = volatileLoad(&raw);
           mixin("v " ~ OP ~ "= rhs;");
           volatileStore(&raw, v);
      }
}

I did some simple tests and this seems to work.

My question is: is this the way we should go?
If it is, what would be the preferred name for this type? Also 
what would you think should be the module and file name?



More information about the D.gnu mailing list