Klaus,
I do not have a solution, but I try to be helpful and give a list what I
would try to understand the situation:
- 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.
- Is the static Handler() function dependent on the template parameter?
If not, you can put it into a base class of the class template.
- 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?
- 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 what I have in the top of my head at the moment.
In the end, you might need to either change the tools or their
configuration to get what you want.
Regards
Peter.
Klaus Rudolph wrote on 10.04.21 15:33:
Hi all,
if I write a class with static member function I can use it as an
interrupt handler as follows:
class Dummy
{
static void Handler() __asm__("__vector_10")
__attribute__((__signal__, __used__, __externally_visible__));
};
void Dummy::Handler()
{
}
I can see the vector is entered in the handler table:
1c: 0c 94 34 00 jmp 0x68 ; 0x68 <__bad_interrupt>
20: 0c 94 34 00 jmp 0x68 ; 0x68 <__bad_interrupt>
24: 0c 94 34 00 jmp 0x68 ; 0x68 <__bad_interrupt>
28: 0c 94 36 00 jmp 0x6c ; 0x6c <__vector_10>
2c: 0c 94 34 00 jmp 0x68 ; 0x68 <__bad_interrupt>
30: 0c 94 34 00 jmp 0x68 ; 0x68 <__bad_interrupt>
###################
But if the class becomes a template, the function is not longer entered
in the handler. How can I fix it?
template < int i >
class Dummy
{
static void Handler() __asm__("__vector_10")
__attribute__((__signal__, __used__, __externally_visible__));
};
template < int i>
void Dummy<i>::Handler()
{
}
Dummy<1> d1;
20: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
24: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
28: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
2c: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
30: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
I tried it with avr-g++ (Fedora 10.2.0-1.fc33) 10.2.0
Thanks!
--
Peter Sommerlad
Better Software: Consulting, Training, Reviews
Modern, Safe & Agile C++
peter.cpp@xxxxxxxxxxxx
+41 79 432 23 32