Dear Wolfgang Denk,
> Dear Reinhard Meyer,
>
> In message<4cc66a67.4000...@emk-elektronik.de>  you wrote:
>>
>>> It fails in case the timer wraps around.
>>>
>>> Assume 32 bit counters, start time = 0xFFFFFFF0, delay = 0x20. It
>>> will compute end = 0x10, the while codition is immediately false, and
>>> you don't have any delay at all, which most probably generates a
>>> false error condition.
>>
>> I used and assumed a 64 bit counter, that will not wrap around while
>> our civilization still exists...
>
>
> The code is still wrong, and as a simple correct implementation exists
> there is no excuse for using such incorrect code.
>
> Please fix that!

Agreed here. People are invited to dig through u-boot and find all
those places.

>
>> If get_ticks() is only 32 bits worth, both methods will misbehave
>> at a 32 bit wrap over.
>
> No.
>
>>>     start = time();
>>>     while ((time() - start)<   delay)
>>>             ...
>>>
>>> This works much better (assuming unsigned arithmetics).
>>
>> True, provided the underlying timer is really 64 bits, otherwise
>> this fails, too...
 > You are wrong. Try for example this:
 >
 > --------------------- snip -------------------
 > #include <stdio.h>
 >
 > int main(void)
 > {
 >      unsigned int time = 0xFFFFFFF0;
 >      unsigned int delay = 0x20;
 >      unsigned int start;

You are wrong here, because you take it out of context.
My "demo" is using the (declared as) 64 bit function get_ticks().
I mentioned above that this function MUST be truly returning 64
bits worth of (incrementing) value to make any version work.
If get_ticks() just returns a 32 bit counter value neither method will work
reliably. Just check all implementations that this function is implemented
correctly.
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to