Re: static class member as interrupt handler works, but not if class is templated

"Peter Sommerlad \(C++\) via Gcc-help" <[email protected]> Mon, 12 Apr 2021 11:20:50 +0200
Newsgroups gmane.comp.gcc.help,gmane.comp.hardware.avr.gcc
Message-ID <[email protected]>
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++

[email protected]
+41 79 432 23 32