Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Message

Re: [lpc2000] UART TX FIFO and INTs problem - SOLVED

2004-02-22 by Bill Knight

I don't think using the default handler to mask the problem is
the answer.  You might however, use it to inform the user &/or
yourself of an internal error so it can be corrected in the
next release of your code.

-Bill



On Mon, 23 Feb 2004 03:04:05 +1100, microbit wrote:

Hi Bill,

Thanks for the prompt response.
This has actually been my main problem.
It's not my "style" when I develop to just change my SW, and go
"oh, yeah, well it works like that but not like that, so what".
If I write code a particular way, then I expect it to work a particular way,
and if it doesn't - I want to know why !

Anywho, I'm glad I persisted with this.
I had indeed noticed that I didn't have this weird problems either when I
used
Gloabl enable/disable on IRQ. Bah,what a pain.

I'll use your workaround, it sounds plausible.
I can't believe that this problem didn't show up when just printing away
with printf(), but ONLY when running the BASIC interpreter, and with a
specific
program running !

Do you think I should maintain a Default_IRQ handler (I don't plan to use
non-vectored
INTs), case this happens again ?

I'm naturally concerned that if I write to ViCVectAddr at end of Default_IRQ
handler,
that I'll miss actual INTs, as opposed to spurious INTs.

Your summary must be dead-on, because I found that different optimisations
would
exhibit the problem or not.

Thanks a lot !
Kris



Bill wrote :

> Kris
>   Thanks for spotting this.  It's the old spurious interrupt problem.
> The fix is to disable global interrupts around the first read-modify-write
> instruction.  Doing the direct write (U0IER = xxx) can still allow the
problem
> to happen.  What happens is the interrupt occurs and is recognized while
> the masking instruction is executing but before it has completed.  Then
> when the instruction does complete, the interrupt can't find the vector
> so uses the default.  So to fix:

> Disable global interrupts
> mask interrupt
> Enable global interrupts

> do your stuff
> unmask interrupt

> NOTE: I don't think this last modification of the mask register needs
> protection.  Someone correct me if I am wrong.


> Regards
> -Bill Knight
> R O SoftWare



> On Mon, 23 Feb 2004 02:09:38 +1100, microbit wrote:

> Hi all,

> This s a hairy one - ARM Gurus, please read this !!!
> (Bill, this will cause a problem in your UART package too, since you
> set VicDefVectAddr to the Reset Vector, and you also use a RMW
> operation on UxIER)

> I figured out why I was getting "resets" while UART0 is TXing
> interrupt driven.
> The problem only occurs when I disable the THE interrupt by masking :

> U0IER &= ~ 0x02;    /* Disable THE */
> ......
> U0IER |= 0x02;

> When I disable and then re-enable THE interrupts with a direct write :

> U0IER = 0x01;        /* Disable THE, leave RDA enabled */
> .....
> U0IER = 0x03;        /* Reenable THE */

> I didn't get these "resets".

> This is the problem :
> -----------------------

> I didn't have VicDefVectAddr specified, so it was set to its default
0x00000000
> address. (All IRQs are disabled, except for VIC Channel # 6)
> While U0IER &= ~ 0x02 is executing, there MUST be a few cycles where the
THE
> is disabled, BUT the interrupt asserts at the right moment, hence causing
a non-vectored
> assertion.... (which of course vectors to 0x000000, and ultimately results
in a RESET)
> Is this a known problem on the VIC ?
> Is this normal on the VIC ?

> I put in a "dummy" function default_IRQ_handler() so I can break on it,
and when it hits
> that function, VicRawIntr reads 0x3008.
> If I merely indicate on a LED when that function is hit, but then return
from interrupt, the
> execution happpily picks up after the U0IER &=~0x02; statement, and things
run as good as gold.
> NO TX interrupts were missed by the looks of it, since the non-vectored
dummy function doesn't
> service or alter anything, the pending interrupt must be serviced when THE
is re-emabled.

> Are there any ARM gurus here that can shed some light on this ?
> I've been just about driven to tears over this problem.
> I can't just use a direct write (I have an interrupt on the other UART in
RX, and that operates on
> a CRC function, the RF transmit function needs to operate on the same CRC
function, so I need
> masking of the Interrupt Enables, rather than directly setting/clearing
all INT sources on UxIER)

> As far as I'm concerned this classifies as a silicon BUG, since UxIER bits
cannot assert themselves,
> and it is indeed a R/W register.

> BTW : How do I work out with VicRawIntr (0x3008 in my case) which Slot/Int
is asserted ?
> I can't find a bitmap on it.

> Best regards,
> Kris





>       Yahoo! Groups Sponsor
>             ADVERTISEMENT





> --------------------------------------------------------------------------
------
> Yahoo! Groups Links

>   a.. To visit your group on the web, go to:
>   http://groups.yahoo.com/group/lpc2000/

>   b.. To unsubscribe from this group, send an email to:
>   lpc2000-unsubscribe@yahoogroups.com

>   c.. Your use of Yahoo! Groups is subject to the Yahoo! Terms of Service.






Yahoo! Groups Links

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.