This is the mail archive of the
ecos-patches@sources.redhat.com
mailing list for the eCos project.
Re: us_delay() improvement
- From: Jonathan Larmour <jifl at eCosCentric dot com>
- To: Nick Garnett <nickg at ecoscentric dot com>
- Cc: ecos-patches at sources dot redhat dot com
- Date: Tue, 24 Jun 2003 00:23:15 +0100
- Subject: Re: us_delay() improvement
- References: <m3ptl96hvs.fsf@miso.calivar.com>
Nick Garnett wrote:
+ if( usecs > usec_per_period/2 )
+ slice = CYGNUM_KERNEL_COUNTERS_RTC_PERIOD/2;
+ else if( CYGNUM_KERNEL_COUNTERS_RTC_PERIOD >= 0x7FFFFFFF/usec_per_period )
+ slice = usecs * ticks_per_usec;
+ else
+ {
+ slice = usecs*CYGNUM_KERNEL_COUNTERS_RTC_PERIOD;
+ slice /= usec_per_period;
+ }
I've been thinking about this.... we get overflow if
usecs*CYGNUM_KERNEL_COUNTERS_RTC_PERIOD overflows, which means that since
usecs should be at most usec_per_period/2, we have to "play safe" if
plugging usecs == usec_per_period/2 in to the multiplication would
overflow, because that's the worst case.
So we get the expression to test as:
(usec_per_period/2)*CYGNUM_KERNEL_COUNTERS_RTC_PERIOD >= 0x7FFFFFFF
which we reorganise to prevent overflow of this expression to become:
CYGNUM_KERNEL_COUNTERS_RTC_PERIOD/2 >= 0x7FFFFFFF/usec_per_period
which should be sufficient. The code as written will unnecessarily catch
certain configurations I'd think.
+ // Adjust by elapsed, not slice, since an interrupt may
+ // have been stalling us for some time.
+
+ if( CYGNUM_KERNEL_COUNTERS_RTC_PERIOD >= 0x7FFFFFFF/usec_per_period )
+ elapsed_usec = elapsed / ticks_per_usec;
+ else
+ {
+ elapsed_usec = elapsed * usec_per_period;
+ elapsed_usec = elapsed_usec / CYGNUM_KERNEL_COUNTERS_RTC_PERIOD;
+ }
FAOD the above wouldn't have the same issue because of the additional
complication that elapsed may be greater than slice, so the risk of
overflow is even higher, but by an indeterminate amount to make things
more fun ;-). A factor of two fudge seems as good/bad as any other amount
then.
Jifl
--
eCosCentric http://www.eCosCentric.com/ The eCos and RedBoot experts
--[ "You can complain because roses have thorns, or you ]--
--[ can rejoice because thorns have roses." -Lincoln ]-- Opinions==mine