ARM and interrupts

Toralf Lund toralf@procaptura.com
Fri Mar 19 17:38:00 GMT 2004


Bill Gatliff wrote:

> Toralf:
>
>
> __interrupt__ doesn't always work in gcc, and it appears to not work 
> with the version of the toolchain you are using.
>
> I prefer to write code that always works.  :^)  Hence, I don't use 
> __interrupt__.

Good point.

>
> From a philosophical point of view, you don't want to use something 
> like __interrupt__ anyway.  It ties your code to a compiler feature 
> that isn't consistently supported within gcc, and is done differently 
> across toolchains from other vendors.  Avoid it, you're better off in 
> the long run.

Yes, as long as there's no completely standardised way of doing it, that 
may be the best thing to do. The ARM/Motorola doc & example code sort of 
leaves the impression that the "__irq" keyword is standard, only it 
isn't really...

> And frankly, I'd prefer that gcc _not_ever_ support __interrupt__, so 
> that others would be forced to agree with me.  :^)
>
;-)

I've now tried something rather clever instead, which is

#define _IRQ(func, args) __attribute__((noreturn)) func ## args { 
__asm__("stmfd sp!,{r0-r4,r12,lr}");
#define _IRQ_RETURN }; __asm__("ldmfd sp,{r0-r4,r12,lr}\n\tsubs pc,lr,#4")

void _IRQ(IRQ_Handler, (void))
{
    short vectNum;

    vectNum = NIVECSR >> 16;    // determine highest pending normal 
interrupt       
    vect_IRQ[vectNum]();        // find the pointer to correct ISR in 
the look up table
    _IRQ_RETURN;
}

But of course, you normally don't want to be clever when writing code, 
so perhaps I ought to rewrite the hole thing in assembler...

>
> b.g.
>
>
>
> Toralf Lund wrote:
>
>> Bill Gatliff wrote:
>>
>>> Toralf:
>>>
>>>
>>> I've written ISRs in C, but you don't want to do that with GNU.  
>>> What you want to do instead is provide a "stub" ISR in assembly 
>>> language (only two or three instructions), that calls the C "ISR".  
>>> That way, you aren't dependent on gcc's intermittent support of the 
>>> __interrupt__ attribute.
>>
>>
>>
>> Is what you are saying basically that __attribute__((interrupt)) 
>> doesn't work? I did find the doc on this after all (in gcc info 
>> page), and tried
>>
>> __attribute__((interrupt("IRQ"))) void IRQ_Handler(void)
>>
>> but got
>>
>> mc9328irq.c:88: warning: `interrupt' attribute directive ignored
>>
>>>
>>> See the Evaluator7T tutorial in the wiki or under 'articles' on my 
>>> website, I think I provide a few examples.
>>>
>>> Regards,
>>>
>>>
>>> b.g.
>>>
>>>
>>> Toralf Lund wrote:
>>>


------
Want more information?  See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com



More information about the crossgcc mailing list