[En-Nut-Discussion] Fwd: Re: UartAvrFlush -- deadlock imminent??
Harald Kipp
harald.kipp at egnite.de
Tue Nov 11 19:42:55 CET 2003
>Delivered-To: web2p2 at p15095813.pureserver.info
>Date: Wed, 5 Nov 2003 14:13:35 -0800 (PST)
>From: JasonG
>Subject: Re: UartAvrFlush -- deadlock imminent??
>To: en-nut-discussion at egnite.de
>
>
>Ok, the key here seems to be that we enter the NutThreadSwitch()
>function that will go ahead and repopulate all registers with that of
>the next thread, so that will end up allowing the tx IT to come through
>and properly post the event. I should have waited a few more minutes
>before sending the message!
>
>--- JasonG <jas_g at yahoo.com> wrote:
> >
> > This is from an older version of NutOS (2.5.91), but I think it's
> > idea
> > is still relevant.
> >
> > The function UartAvrFlush() might be called when someone wishes to
> > purge their output buffer. This results in the interrupts being
> > disabled. So below we're waiting on an event to post (which is done
> > Async in the TxComplete function that is registered for the UARTs
> > transmit complete handler), but interrupts are not enabled, so how
> > can
> > the TxComplete function ever be called? It's the only function that
> > posts an event to the queue that's being waited on.
> >
> > It seems like deadlock is imminent here unless the character has
> > already been posted resulting in a queue that has already been
> > signaled
> > and the event will immediately run through.
> >
> > Please correct my train of thought here, because this obviously isn't
> > the desired behavior. Why do we enter the critical section before
> > infinitely waiting on a character to arrive? We would also normally
> > want to let other tasks operate while this thread is suspended
> > waiting
> > for that character(s) to be sent out.
> >
> > Thanks!
> >
> >
> > int UartAvrFlush(NUTDEVICE *dev)
> > {
> > IFSTREAM *ifs = dev->dev_icb;
> > UARTDCB *dcb = dev->dev_dcb;
> >
> > /*
> > * Start any pending output.
> > */
> > if(UartAvrOutput(dev))
> > return -1;
> >
> > /*
> > * Wait until output buffer empty.
> > */
> > NutEnterCritical();
> > if(ifs->if_tx_idx != ifs->if_wr_idx)
> > NutEventWait(&dcb->dcb_tx_rdy, 0);
> > NutExitCritical();
> >
> > return 0;
> > }
> >
> > static inline void NutEnterCritical(void)
> > {
> > asm volatile(
> > "in __tmp_reg__, __SREG__" "\n\t"
> > "push __tmp_reg__" "\n\t"
> > "cli" "\n\t"
> > );
> > }
> >
> >
> > =====
> > JasonG
> > jas_g at yahoo.com
> >
>
>
>=====
>JasonG
>jas_g at yahoo.com
More information about the En-Nut-Discussion
mailing list