This is the mail archive of the
ecos-discuss@sources.redhat.com
mailing list for the eCos project.
Re: delay_us()
- From: Jonathan Larmour <jifl at eCosCentric dot com>
- To: Motoya Kurotsu <kurotsu at allied-telesis dot co dot jp>
- Cc: ecos-discuss at sources dot redhat dot com
- Date: Tue, 25 Mar 2003 12:07:32 +0000
- Subject: Re: [ECOS] delay_us()
- References: <20030317160537.A19066@white.office1>
Motoya Kurotsu wrote:
Hi all;
I would like to ask you how to think about the following issue.
The delay_us() take cares the large number of delay without kernel,
calling hal_delay_us() -- at least in mips architecture -- but not do so
with kernel. I think that it should not vary how to take care the large number
of delay depending on the use of kernel. Considering that some ethernet
drivers actually use this function with the value of several seconds,
That's unfortunate, but I see it's true, or at least I see 100ms max for
most now anyway, which is still quite a lot. However the CF driver and the
82559 driver go up to 500ms and 2 *seconds* respectively. Do you have any
other fixed examples of ethernet drivers and specific HAL platforms this
has problems right now with?
I think that delay_us() should take care of the large number of delay
as well with the kernel.
Hmm... really the drivers shouldn't be using such large values, and should
instead loop with smaller values, i.e. for (i=0;i<10;i++) HAL_DELAY_US(10000);
Please tell me how you think ahout it?
Not sure about adding a dependency on a 64-bit type in hal common code.
I think I'd try and fix the problem by adding loops where required, and
then impose an API limit on this by also adding an assertion in hal_if.c's
delay_us() to barf if some maximum value is exceeded, perhaps 100000 us,
i.e. 100ms.
The attachment is just an example to clarify the overflow issue.
3/17/03
Motoya Kurotsu
Allied Telesis K.K.
--- hal_if.c.orig Mon Mar 17 15:08:38 2003
+++ hal_if.c Mon Mar 17 15:39:38 2003
@@ -125,10 +125,10 @@
#ifdef CYGPKG_KERNEL
{
cyg_int32 start, elapsed;
- cyg_int32 usec_ticks, slice;
+ cyg_int64 usec_ticks, slice;
// How many ticks total we should wait for.
- usec_ticks = usecs*CYGNUM_KERNEL_COUNTERS_RTC_PERIOD;
+ usec_ticks = (cyg_int64)usecs*CYGNUM_KERNEL_COUNTERS_RTC_PERIOD;
usec_ticks /= CYGNUM_HAL_RTC_NUMERATOR/CYGNUM_HAL_RTC_DENOMINATOR/1000;
do {
--
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
--
Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
and search the list archive: http://sources.redhat.com/ml/ecos-discuss