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

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

Re: [avr-gcc-list] custom signal prologue


From: Christian Troedhandl
Subject: Re: [avr-gcc-list] custom signal prologue
Date: Tue, 23 Nov 2004 14:26:09 +0100 (MET)

On Tue, 23 Nov 2004, Ben Mann wrote:

Hi all,

Is there any way to customise the prologue of an interrupt handler?

To explain...

I have a UDR interrupt handler in which I'd like to enable interrupts so
that another very time-critical interrupt can be handled promptly.

The usually accepted method does not work for UDR

INTERRUPT(SIG_UART_DATA) {
    ...do something...
}

because as soon as sei is enabled another UDR interrupt immediately triggers
and hangs the processor.

An inefficient but workable solution in C appears to be:

SIGNAL(SIG_UART_DATA) {
   //Disable UDRIE
   UCSRB &= _BV(UDRIE);
   sei();
   ...do something...
   UCSRB |= _BV(UDRIE);
}

The problem being that with complex replacements for "do something", the
prologue consists of pushing qutie a few registers. The trimmed .lst excerpt
below demonstrates the code the compiler generates for the first couple of
lines above in my application.

[...]

I think using the naked function attribute should do the trick:
void MyInterruptHandler(void) __attribute__ ((signal));
void MyInterruptHandler(void)
{
        /* do something */
}


void SIG_UART_DATA (void) __attribute__ ((naked));
void SIG_UART_DATA (void)
{
        uint8_t ucsrb;
        asm volatile ("push %0\n\t" : "=r" (ucsrb) :);
        //Disable UDRIE
        ucsrb = UCSRB;
        UCSRB = ucsrb & _BV(UDRIE);
        sei();
        asm volatile ("pop %0\n\t" : "=r" (ucsrb) :);
        MyInterruptHandler();
        asm volatile("ret\n\t" : :);
}

resulting in:
0000008e <MyInterruptHandler>:
  8e:   1f 92           push    r1
  90:   0f 92           push    r0
  92:   0f b6           in      r0, 0x3f        ; 63
  94:   0f 92           push    r0
  96:   11 24           eor     r1, r1
  98:   0f 90           pop     r0
  9a:   0f be           out     0x3f, r0        ; 63
  9c:   0f 90           pop     r0
  9e:   1f 90           pop     r1
  a0:   18 95           reti

000000a2 <__vector_12>:
  a2:   8f 93           push    r24
  a4:   8a b1           in      r24, 0x0a       ; 10
  a6:   80 72           andi    r24, 0x20       ; 32
  a8:   8a b9           out     0x0a, r24       ; 10
  aa:   78 94           sei
  ac:   8f 91           pop     r24
  ae:   0e 94 47 00     call    0x8e
  b2:   08 95           ret

---------------------------------------------------------------------
Christian Troedhandl                   mailto:address@hidden
Real-Time Systems Group                     voice:+43 (1) 58801-58210
Vienna University of Technology
A-1040 Wien, Treitlstr. 3/182-1        http://www.vmars.tuwien.ac.at/



reply via email to

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