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: Peter Sommerlad (C++)
Subject: Re: static class member as interrupt handler works, but not if class is templated
Date: Mon, 12 Apr 2021 11:20:50 +0200
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:52.0) Gecko/20100101 PostboxApp/7.0.47

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@sommerlad.ch
+41 79 432 23 32



reply via email to

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