This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: delay_us()


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]