[ECOS] Fwd: Re: [ECOS] contents of the table " hal_interrupt_handlers" arm7 processor
Bob Brusa
bob.brusa@gmail.com
Thu Sep 13 16:20:00 GMT 2012
-------- Original-Nachricht --------
Betreff: Re: [ECOS] contents of the table " hal_interrupt_handlers" arm7
processor
Datum: Thu, 13 Sep 2012 17:35:39 +0200
Von: Bob Brusa <bob.brusa@gmail.com>
An: Michael Bergandi <mbergandi@gmail.com>
Am 12.09.2012 22:11, schrieb Michael Bergandi:
> Bob,
>
>> I find, that the jump bne 10f is always executed and subsequently, the
>> correct handler is fetched from the table hal_interrupt_handlers. But hellas
>> - when I get my "spurious interrupt" I find that the interrupt source is
>> correct (10 for pwm), the datapointer however is zero und all entries in the
>> hal_interrupt_handlers table are filled with the address of the
>> hal_default_isr.
>
> This sounds like it is working correctly. An interrupt occurred, it found
> the handler and called it.
>
>
>
>> I would expect the table hal_interrupt_handlers to be initialized during
>> system startup. But obviously, this assumption is wrong. Which part of eCOS
>> (dynamically) modifies this table and why??
>> Thanks for help and advice....Bob
>
> hal_interrupt_handers is initialized at startup with hal_default_isr (which
> does nothing).
>
> A driver using interrupts would create an ISR and DSR (if required) and call
> cyg_drv_interrupt_create(). The handle returned by
> cyg_drv_interrupt_create() would then be used in the call to
> cyg_drv_interrupt_attach() to attach the interrupt to the hardware vector
> which places it in the hal_interrupt_handers table.
>
> --
> Mike
>
>
>
Hi Mike,
I found that all my previous findings were scrap - caused by a system
that had gone wild. The problem was the handling of the interrupt enable
and eoi in the pwm_isr.
In a way, the whole affair is a nice example for Murphys law: Read
instructions and this I finally did, although it was rather time
consuming :-)
The revised pwm_isr is attached - and with this isr, no more spurious
interrupts!
Thanks for help and best regards - Bob
-------------- next part --------------
static uint32_t pwm_isr(cyg_vector_t vector, cyg_addrword_t data)
{
static uint32_t pwmisr, icnt;
CYG_INTERRUPT_STATE istate;
CYG_ASSERT (CYGNUM_HAL_INTERRUPT_PWMC == vector, "Wrong interrupts");
pwms_idisable; // mask pwm interrupts
HAL_READ_UINT32(AT91_PWM + AT91_PWM_ISR, pwmisr); // clears pwm-interrupt
HAL_QUERY_INTERRUPTS(istate); // supervisor mode - interrupts are disabled
HAL_ENABLE_INTERRUPTS(); // turn them on to allow higher priority irs
icnt++; // to come through
while (pwmisr) {
if (icnt == 1) {
if (pwmisr & 7) { // pwm0..2 run synchroneously, hence only pwm0 has been set for interrupts
Set_LEDs();
Chk_Keys(); // Check if any key is pressed
}
if (pwmisr & 8) { // pwm3 interrupt
pwm3d.ticks++;
Read_AT91adc();
Do_Scan();
} // end pwm3 interrupt
} // end if icnt
else {
icnt = (icnt + 0); // just for the debugger
}
HAL_READ_UINT32(AT91_PWM + AT91_PWM_ISR, pwmisr); // clears pwm-interrupt
if (pwmisr & 0xf)
icnt = (icnt + 0); // just for the debugger
} // end while pwmisr
icnt--;
HAL_RESTORE_INTERRUPTS(istate); // turns interrupts off again
cyg_interrupt_acknowledge(vector); // write eoi to AIC
pwms_ienable; // unmask pwm interrupts and leave all the rest to ecos
return CYG_ISR_HANDLED;
} // end pwm_isr
-------------- next part --------------
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
More information about the Ecos-discuss
mailing list