Startup files for STM32F4xx
Mike via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Apr 25 17:14:42 PDT 2015
On Saturday, 25 April 2015 at 19:33:05 UTC, Johannes Pfau wrote:
>
> volatileLoad is not in gdc yet. I've written the code some
> months ago
> but I need to update it and then it needs to be reviewed.
It's officially in 2.067.0 for anyone who's wondering.
>
> Volatile!T: http://dpaste.dzfl.pl/dd7fa4c3d42b
>
> Volatile!size_t value;
> value += 1;
> assert(value == 1);
>
>
>
> Register wrapper: http://dpaste.dzfl.pl/3e6314714541
> Register definition:
>
> enum Level : ubyte
> {
> low = 0,
> high = 1
> }
>
> enum fields = [
> Field("PIN0", 0, 0, true, "Level", Access.readWrite),
> Field("PIN1", 1, 1, true, "Level", Access.readWrite),
> Field("TEST", 2, 4, false, "ubyte", Access.readWrite)];
>
> mixin(generateRegisterType!ubyte("PORT", fields));
> pragma(address, 0x25) extern __gshared PORTRegister PORTB;
>
> Usage:
> auto b = PORTB.load();
> PORTB.toggle!"PIN0";
> PORTB.PIN0 = Level.low;
> writeln(PORTB.PIN0);
> PORTB.TEST = 0b000;
>
That's some nice code! and really leveraging D to great effect.
I know that Volatile!(T) took some engineering to get right, so
it would be nice to have that as an "official" type IMO.
>
> The remaining problem is performance. (With optimization the
> generated
> code is as good as equivalent C code. However, we need to avoid
> size
> overhead: e.g. struct initializers and the opX functions
> shouldn't
> generate functions in the executable, though tha can be fixed
> with the
> linker)
I'm not sure I follow how the linker can solve this. Could you
elaborate?
Mike
More information about the Digitalmars-d-learn
mailing list