On Tuesday, 7 April 2015 at 20:33:26 UTC, Jens Bauer wrote:


Question number 2: Is it possible to change the VectorFunc to be a real function pointer, rather than a void* ?


I did something along these lines (modified to match your example) and it worked fine for me:

alias VectorFunc = void function();

@attribute("weak") @attribute("alias", "defaultHandler")
extern void Reset_Handler();

@attribute("weak") @attribute("alias", "defaultHandler")
extern void NMI_Handler()

@attribute("weak") @attribute("alias", "defaultHandler")
extern void HardFault_Handler();

@attribute("section",".isr_vector.ro")
immutable ISR[3] g_pfnVectors =
[
      &Reset_Handler
    , &NMI_Handler
    , &HardFault_Handler
];

I did this before "weak", "alias", and "section" attributes were added, however. To see my original code, look at the slide in the presentation here: https://youtu.be/o5m0m_ZG9e8?t=2332. My original code had everything decorated with extern(C) as well so I could refer to the symbol directly in my linker scripts. That may not be needed for you, so I left it out.

Question number 3: How can I call an external function and keep the binary file size down ?

Are you compiling with -ffunction-sections -fdata-sections and linking with --gc-sections? You may need to in order to get rid of some things.

What do you using for your D runtime? Perhaps some code in your runtime is implicitly linking to some code you're not directly calling.

I also add the following to my linker scripts to get rid of stuff I don't find necessary:

/DISCARD/ :
{
   *(.ARM.extab*)
   *(.ARM.exidx*)
}

/DISCARD/ :
{
   *(.ARM.attributes*)
   *(.comment)
}

You can see the latest incarnation of my linker script here: https://github.com/JinShil/stm32f42_discovery_demo/blob/master/linker/linker.ld


Question number 4: How can I reduce the function declaration of the Reset_Handler and NMI_Handler shown above ?

Try something along these lines.

enum weak = gcc.attribute.attribute("weak");
enum isrDefault = gcc.attribute.attribute("alias", "defaultHandler");

extern @weak @isrDefault void NMI_Handler();
extern @weak @isrDefault void HardFault_Handler();

I use this idiom briefly in my code here: https://github.com/JinShil/stm32f42_discovery_demo/blob/master/source/start.d

The enum thing kinda bugs me about D, but you'll see it used everywhere, especially phobos. It's called a manifest constant, and you can find a short blurb about it at the bottom of this page: http://dlang.org/enum.html

Mike

Reply via email to