Yahoo Groups archive

Lpc2000

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

Message

Re: Undocumented Timer Interrupt Feature, or Silicon Bug...

2004-10-12 by vaughan_anztec

Thanks for the confirmation. And thank you to Robert for his prompt 
and insightful replies.

Now, time to go and fix that wall that I'd been bashing my head 
against... :-)

Regards




Vaughan

--- In lpc2000@yahoogroups.com, "g2100g" <g2100g@e...> wrote:
> 
> There is a silicon bug, which Philips has confirmed, but has yet to 
> publish.
> 
> If the timer hardware triggers an interrupt at the same time that 
the 
> core is writing to the timer IR register to clear an interrupt on a 
> different channel, the new interrupt does not get set.  This 
problem 
> can occur with an input capture, as well as with a match.  That is 
a 
> bit more difficult to work around.
> 
> As for there being a similar problem on the UART IIR, do you have a 
> reproducible situation to determine this?
> 
> I suspect there are probably other registers (which can be written 
to 
> by both the core and peripheral hardware) which exhibit a similar 
> problem.  I don't know how much Philips has determined about the 
> specifics and extent of this bug, since first confirming its 
> existence.
> 
> 
> 
> --- In lpc2000@yahoogroups.com, Robert Adsett <subscriptions@a...> 
> wrote:
> > At 12:42 AM 10/12/04 +0000, you wrote:
> > 
> > 
> > >--- In lpc2000@yahoogroups.com, Robert Adsett 
<subscriptions@a...>
> > >wrote:
> > > > At 08:03 PM 10/11/04 +0000, you wrote:
> > > >
> > > >
> > > > >...Or am I doing something wrong?
> > > > No answers, only questions.
> > > >
> > > > You are running at full speed, ie MAM fully enabled, a 
divisor 
> of 1
> > > > on the peripheral bus?
> > >
> > >External clock is 10MHz, PLL is enabled and multiplies this to 
> 60MHz.
> > >MAM is enabled and MAMTIM is set to 3. VPBDIV is set to 1. As 
far 
> as
> > >I can see, the core is working at 60MHz (e.g. baud rate divisors 
> work
> > >out as expected for this value). Interestingly, I tried clocking 
TC
> > >at this rate (i.e. one count every 16.7ns) with appropriate MR
> > >values. The problem I've outlined was much much worse i.e. 
> interrupts
> > >were lost almost immediately.
> > 
> > Interesting, not sure what that means but interesting.
> > 
> > > > Have you measured how long an interrupt takes?  IE done 
> something
> > >like
> > > > toggle a pin at the beginning and end of your dispatch 
> routine?  If
> > > > possible I'd consider generating assembly from the C and 
> inserting
> > >the pin
> > > > toggle as close to the start and end of your interrupt as
> > >possible.  I'm
> > > > wondering if latency or simple overhead and execution time 
> isn't a
> > >part of
> > > > the issue.
> > >
> > >That's what I initally thought. However, the final code only 
takes
> > >around 2us to action ANY of the various events. Assuming ALL 
events
> > >occur simultaneously, I could get a maximum of 6us latency (give 
or
> > >take!). The sample code I posted also exhibits the same behavior 
> and
> > >it is very minimalistic (I didn't measure the various execution 
> paths
> > >but I would be surprised to see any event taking much longer 
than 
> 1us
> > >to process). Also, my bit bashed port with the clock stopping
> > >workaround is very reliable at 9600 bps full duplex and passably 
so
> > >at 19k2 full duplex. This wouldn't be the case if my event 
> processing
> > >was taking a long time.
> > 
> > That's sort of what I was expecting, but it did need to be 
checked.
> > 
> > 
> > >I think your previous post hit the nail on the head - when there 
> are
> > >simulataneous accesses to an interrupt register, it does not
> > >accurately reflect what's happened.
> > 
> > And on reflection, I'm wondering if it isn't more similar to what 
I 
> saw on 
> > the serial port IIR than I first thought.  What I saw appeared to 
> behave as 
> > if the interrupt flag was lost if the event causing the interrupt 
> occurred 
> > at the same time that the previous interrupt condition was being 
> > cleared.  You do have places where that sequence can occur and 
> turning off 
> > the counter would eliminate the problem (no interrupt source, no 
> chance of 
> > conflict).
> > 
> > If that is the case it should be possible to narrow the region 
that 
> the 
> > clock/counter must be disabled.
> > 
> > Specifically you have several lines of this form
> > 
> >              TIMER0_IR = TIMER0_IR_CR1;
> > 
> > to clear the interrupt source just serviced, and you (in 
> your 'working' 
> > version) disable the counter for the entire interrupt.  If you 
> replace the 
> > above line with
> > 
> >      TIMER0_TCR = 0; /*Stop the clock before clearing the 
interrupt 
> source. */
> >      TIMER0_IR = TIMER0_IR_CR1;
> >      TIMER0_TCR = 1; /*Restart the clock*/
> > 
> > then if that hypothesized race condition actually exists you 
should 
> still 
> > be protected against it (I suppose it might be possible you would 
> have to 
> > wait an instruction for the counter to stop).
> > 
> > Hmm, this might also explain why a faster counter showed the 
> problem more 
> > readily.  A faster counter would be more likely to have an edge 
> just as the 
> > constant was being stored in TIMER0_IR.
> > 
> > If you try this please let us know.  I, for one, would be very 
> interested 
> > in the results.
> > 
> > 
> > > > One of the reasons I'm asking is I did some measurements on 
> timing
> > >(polled,
> > > > no Interrupts) and found that the smallest time period I could
> > >effectively
> > > > wait for was about 11uS.  That obviously included overhead 
but 
> your
> > > > routines will too.  If your timing was similar (and I would 
> naively
> > >expect
> > > > it might be faster) then that would give an overhead of 44uS 
if 
> all
> > >four
> > > > happened at the 'same' time.  That's close enough to your 52uS
> > >cycle time
> > > > that I'd want to check how long it was actually taking.
> > >Hmmmm.... It still shouldn't miss events though!
> > 
> > Well, it might, if you wrote to clear an event just as (or after) 
a 
> second 
> > one of the same kind had been flagged.  That doesn't fit with 
your 
> timing 
> > though.  I think the possibility of a HW race is a better fit to 
> the 
> > observations, ugly though.
> > 
> > Robert
> > 
> > " 'Freedom' has no meaning of itself.  There are always 
> restrictions,
> > be they legal, genetic, or physical.  If you don't believe me, 
try 
> to
> > chew a radio signal. "
> > 
> >                          Kelvin Throop, III

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.