avr-libc icon indicating copy to clipboard operation
avr-libc copied to clipboard

[bug #59884] _delay_ms() documentation wrongly states delay can end up as 0 ms in certain situation

Open avrs-admin opened this issue 3 years ago • 0 comments

Sat 16 Jan 2021 12:33:02 AM CET

On a 16 MHz Arduino Mega 256, this code:

__builtin_avr_delay_cycles (100.0);   // Compiles, so we apparently have it debug_led_on (); _delay_ms (290000.0); debug_led_off (); assert (0);

leaves the debug led on for about 269 s.  Same for larger arguments to _delay_ms (e.g. 350000.0).  This is different from what this documentation implies will happen:

If the avr-gcc toolchain has __builtin_avr_delay_cycles() support, maximal possible delay is 4294967.295 ms/ F_CPU in MHz. For values greater than the maximal possible delay, overflows results in no delay i.e., 0ms.

A discussion on the avr-libc mailing list made clear that the problem is that the documented behavior depends on undefined behavior as described here:

https://lists.nongnu.org/archive/html/avr-libc-dev/2020-01/msg00009.html

Rather than document the particular behavior I would change the documentation for _delay_ms() (at least, not sure if _delay_us() or others might also need attention) to state the behavior in that circumstance is undefined ("propagate" the undefined).

This issue was migrated from https://savannah.nongnu.org/bugs/?59884

avrs-admin avatar Jan 31 '22 03:01 avrs-admin