Hi, Am 12.04.21 um 11:20 schrieb Peter Sommerlad (C++):
- why is the special name __vector_10 used to get the function address into the interrupt table? Is there another way, or is the environment insisting on such a name? Can you change the linker (i.e. with a dedicated map file) to get the Dummy<i>::Handler into the table.
Currently the library (avr-libc) has a interrupt vector table which simple uses the names __vector_xx. The linker collects all functions with this naming conventions and replace the function address in that table.
- Is the static Handler() function dependent on the template parameter? If not, you can put it into a base class of the class template.
Yes, if not, it can be omitted, quite clear.
- what is the means that a function is considered to be an interrupt handler? What does the tooling do between the compiler generating object code and the binary that ends up in flash? How does it work?
The attribute for an interrupt handler added to a function adds the following to the code of the function: Save all registers .. normal function content ... restore all registers use "reti" instead of "ret" for returning to the "calling context".
- figure out, where the special handling of the __vector_10 seems to happen, and why it is not happening in the class template case. This might help diagnose if and where to fix it within the compiler.
That is compiler internals... yes, if it is a compiler bug, it is the way to have a solution. But in that case, it seems to be a generic problem for gcc as attributes are not assigned to any templated class member functions. No idea if this is related to the target ( avr ) or generic for all platforms. But I never did any change inside the compiler. Any help is welcome!
In the end, you might need to either change the tools or their configuration to get what you want.
I was in hope, that I did something wrong or a workaround is known to this problem. If that is not the case, I can fix the compiler, change the linker, modify the avr-libc... yes. But in all this cases, I will still use C style handlers for this purpose. It is uggly, but C++ on AVR is always ugly ( v-table in RAM, jump for switch case in RAM, no STL support ). If someone can point me to the "problem" inside the compiler, I can give it a try, but it seems to be the long way :-) But maybe a funny one and helpful for others. In general: Why assigning attributes to member functions in templated class context fails? For me it looks like a bug. Klaus