[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: load average patches for MiNT 1.10 + patches



In <2d7f745a1e7e81@anuurn.do.open.de> you wrote :

>>michael smith writes:
>>>  but I don't believe in that sort
>>> of ceiling regardless of how it's implemented, and someone is _bound_ to harp
>>> on it.)
>>
>> true.  thats also why you should always do timeouts checks like this
>>
>>    unsigned tick = timer counter (like _hz_200) + time to wait;
>>    for (...)
>>         if (timer counter - tick > 0)  break;
>>
>>instead of
>>    ...
>>         if (timer counter > tick)  break;
>>
>>(and any compiler that `optimizes' the difference away should be shot. :)
>
>I don't quite see the difference between these two checks - they _both_
>will come into trouble if `counter + time to wait' exceeds the value range
>of `unsigned'!
>The only *real* solution I can see is expanding the timer to a `long
>long'...


No, there is an easier way... (I use it a lot because most microcontrollers
don't have large registers 8)

	old_counter = counter++;
	if (counter < old_counter)								/* wrap condition */
		last_match = MAX_SIGNED_LONG - last_match;	/* result is -ve */

	if (counter > (last_match + increment))			/* next event */
	{
		...

Note that the old_counter, counter and last_match need to be signed values.

>Martin


--
--
mike smith : silicon grease monkey  | If you think it can't be done, |
miff@asharak.apana.org.au           | it means you don't have enough |
miff@apanix.apana.org.au            | money in your budget.          |