avr-chat
[Top][All Lists]
Advanced

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

Re: [avr-chat] ensuring that _delay_us() gets a compile-time double cons


From: Rogier Wolff
Subject: Re: [avr-chat] ensuring that _delay_us() gets a compile-time double constant
Date: Sun, 7 Dec 2014 11:02:16 +0100
User-agent: Mutt/1.5.21 (2010-09-15)

On Tue, Dec 02, 2014 at 04:35:10PM -0900, Britton Kerin wrote:
> On Tue, Dec 2, 2014 at 3:36 PM, Michael Hennebry
> <address@hidden> wrote:
> > On Tue, 2 Dec 2014, Britton Kerin wrote:
> >
> >> 1.  Does _delay_us() need a double const, or is an int const guaranteed
> >>    to work?    The avr libc manual just says "known const" in one place,
> >>    but the signature     calls for a double.
> >
> >
> > _delay_us needs a double const.
> > It will get a double whether you give it a double or some other number.
> > That is what prototypes are for.
> > Prototypes are ordinary C.
> 
> Yes, but in many cases the type coercian for that happens at run-time.

No. When it is a constant, this happens at compile time. This 
is what _delay_us depens on: It does a bunch of calculations, 
comes to "this requires XXX clocks delay" and then arranges for
that many clock cycles delay. There ends up being no function
call in your binary for _delay_us!

> >>    In file included from one_wire_slave.c:8:0:
> >>    /home/bkerin/opt/avr/avr/include/util/delay.h: In function
> >> ‘ows_write_bit’:
> >>    /home/bkerin/opt/avr/avr/include/util/delay.h:163:28: error:
> >> __builtin_avr_delay_cycles expects a compile time integer constant
> >>      __builtin_avr_delay_cycles(__ticks_dc);
> >
> >
> > My guess is that a variable or a non-constant
> > expression was passed to _delay_us.
> 
> Yes, sorry I wasn't clear:  This was what happens when I pass a known
> non-const.  I'm just wondering if this trap is dependable, and if it catches
> non-double consts, if that's an issue.

It catches the "non-constant" case. If you call _delay_us (1); the
compiler will make that into _delay_us (1.0); as the first step.

After some macro magic it will end up  __builtin_avr_delay_cycles(20);
(if your clock speed is 20MHz). Note that the argument is an integer
again!. 

        Roger. 

-- 
** address@hidden ** http://www.BitWizard.nl/ ** +31-15-2600998 **
**    Delftechpark 26 2628 XH  Delft, The Netherlands. KVK: 27239233    **
*-- BitWizard writes Linux device drivers for any device you may have! --*
The plan was simple, like my brother-in-law Phil. But unlike
Phil, this plan just might work.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]