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

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

 



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@xxxxxxxxx>
wrote:

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



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux