This interrupt server task is a hack. It works for proper interrupt controllers. You must be able to disable a single interrupt source in the interrupt controller.

On 28/05/15 14:23, Isaac Gutekunst wrote:
I'm going to chime in since this sounds like a similar problem I've experienced on a PIC32.

I wanted to reword what Ragunath said in my own words to see if I understand it.

1) The RX ISR fires, vectoring the code to the ISR entry.
2) The code in the ISR disables interrupts, creates an event to be handled by RTEMS (in a non interrupt context)
3) At some point (dispatch function), interrupts are enabled
4) Since the RTEMS task responsible for performing non-generic handling hasn't run, the hardware condition that created the initial interrupt has not been cleared. Therefore, the interrupt controller vectors to the ISR entry again, repeating the cycle.

Yes, this is how it works on the beagle BSP. With the ARM GIC it works like this:

1) The RX ISR fires, vectoring the code to the ISR entry.
2) The code in the ISR disables exactly this interrupt source, creates an event to be handled by RTEMS (in a non interrupt context) 3) The interrupt server thread eventually calls the real ISR routine which clears the interrupt condition.
4) The interrupt server thread enables exactly this interrupt source.



In this case, the fundamental problem is that an ISR will continue firing until the condition causing it is resolved. In the case of an RX interrupt, that usually would mean reading data from a SFR or buffer. I'm not familiar with this specific case, but it sounds awfully similar.

Does this sound right?

If so, it seems like a rather fundamental problem I haven't been able to resolve. I'm hoping someone has found a reasonable solution that I wasn't smart enough to figure out my self.

Isaac

On Thu, May 28, 2015 at 8:01 AM, Sebastian Huber <sebastian.hu...@embedded-brains.de <mailto:sebastian.hu...@embedded-brains.de>> wrote:

    It depends on the capabilities of the interrupt controller. Maybe
    you have to drop the support for nested interrupts. The
    bsp_interrupt_dispatch() function for a state of the art interrupt
    controller looks like this (arm-gic-irq.c):

    void bsp_interrupt_dispatch(void)
    {
      volatile gic_cpuif *cpuif = GIC_CPUIF;
      uint32_t icciar = cpuif->icciar;
      rtems_vector_number vector = GIC_CPUIF_ICCIAR_ACKINTID_GET(icciar);
      rtems_vector_number spurious = 1023;

      if (vector != spurious) {
        uint32_t psr = _ARMV4_Status_irq_enable();

        bsp_interrupt_handler_dispatch(vector);

        _ARMV4_Status_restore(psr);

        cpuif->icceoir = icciar;

      }
    }

    On 28/05/15 13:50, ragu nath wrote:

        Hi Sebastian,

        The problem is with rx interrupt. We are enabling rx interrupt
        before
        it is processed. The rtems server task do not get an
        opportunity to
        run.

        I found this might be the logical explanation of the issue.
        bsp_interrupt_dispatch() calls bsp_interrupt_server_trigger which
disables the rx interrupt and creates BSP_INTERRUPT_EVENT . For this
        event, bsp_interrupt_server_task() was supposed to call the actual
        interrupt handler and then enable the rx interrupt. But before the
        event is processed, we enable the rx interrupt in dispatch
        function.
        So again rx interrupt is generated and event is created and
        the cycle
        goes on. Server task is never executed in turn actual interrupt
        handler is never executed.

        Since we enable the interrupt, it occurs again and again as we
        never handle it.

        Is there any other possibility that I might need to look into?


        Thanks,
        Ragunath

        On Thu, May 28, 2015 at 4:58 PM, Sebastian Huber
        <sebastian.hu...@embedded-brains.de
        <mailto:sebastian.hu...@embedded-brains.de>> wrote:

            Hello,

            the bsp_interrupt_dispatch() is quite complicated in the
            beagle BSP. Is the
            interrupt controller of this chip really that broken? Sane
            interrupt
            controllers block interrupts of equal or lower priority
            relative to the
            currently pending interrupt.


-- Sebastian Huber, embedded brains GmbH

    Address : Dornierstr. 4, D-82178 Puchheim, Germany
    Phone   : +49 89 189 47 41-16 <tel:%2B49%2089%20189%2047%2041-16>
    Fax     : +49 89 189 47 41-09 <tel:%2B49%2089%20189%2047%2041-09>
    E-Mail  : sebastian.hu...@embedded-brains.de
    <mailto:sebastian.hu...@embedded-brains.de>
    PGP     : Public key available on request.

    Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

    _______________________________________________
    devel mailing list
    devel@rtems.org <mailto:devel@rtems.org>
    http://lists.rtems.org/mailman/listinfo/devel



--
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.hu...@embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to