avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


From: Trampas Stern
Subject: Re: static class member as interrupt handler works, but not if class is templated
Date: Sat, 10 Apr 2021 15:36:18 -0400

I wish there was a better way to interrupt handlers in classes, for embedded.  For example I write a UART class as a driver which I initialize by passing a pointer to hardware address.  However because different UARTs use different interrupt vectors I end up having to have the extern C and create each handler which then I have to register a callback for the handler to call the correct method in class instance.  

If you guys have a better way I would love to know. 

Thanks
Trampas



On Sat, Apr 10, 2021 at 11:26 AM Jonathan Wakely <jwakely.gcc@gmail.com> wrote:


On Sat, 10 Apr 2021, 15:07 Klaus Rudolph via Gcc-help, <gcc-help@gcc.gnu.org> wrote:
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;

This doesn't cause the instantiation of the member function.

Have you tried an explicit instantiation?

template class Dummy<1>;


 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]