From: arighi Date: Fri, 4 Feb 2011 10:15:57 +0000 (+0000) Subject: timer: fix a build warning and add a comment X-Git-Tag: 2.7.0~285 X-Git-Url: https://codewiz.org/gitweb?a=commitdiff_plain;h=9ce278eab99540113abad1e55026fb9d3aa3c2e2;p=bertos.git timer: fix a build warning and add a comment Fix the following build warning: bertos/drv/timer.c:292: warning: signed and unsigned type in conditional expression And comment the formula used to evaluate the timer delta. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@4681 38d2e660-2303-0410-9eaa-f027e97ec537 --- diff --git a/bertos/drv/timer.c b/bertos/drv/timer.c index 4d130946..d75f15ab 100644 --- a/bertos/drv/timer.c +++ b/bertos/drv/timer.c @@ -289,7 +289,27 @@ void timer_busyWait(hptime_t delay) for (;;) { now = timer_hw_hpread(); - delta = (now < prev) ? (TIMER_HW_CNT - prev + now) : (now - prev); + /* + * The timer counter may wrap here and "prev" can become + * greater than "now". So, be sure to always evaluate a + * coherent timer difference: + * + * 0 prev now TIMER_HW_CNT + * |_____|_______________|_____| + * ^^^^^^^^^^^^^^^ + * delta = now - prev + * + * 0 now prev TIMER_HW_CNT + * |_____|_______________|_____| + * ^^^^^ ^^^^^ + * delta = (TIMER_HW_CNT - prev) + now + * + * NOTE: TIMER_HW_CNT can be any value, not necessarily a power + * of 2. For this reason the "%" operator is not suitable for + * the generic case. + */ + delta = (now < prev) ? ((hptime_t)TIMER_HW_CNT - prev + now) : + (now - prev); if (delta >= delay) break; delay -= delta;