avr-chat
[Top][All Lists]
Advanced

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

Re: [avr-chat] when is loop_until_bit_is_set/clear required after settin


From: Erik Christiansen
Subject: Re: [avr-chat] when is loop_until_bit_is_set/clear required after setting a bit?
Date: Thu, 8 Sep 2016 16:29:27 +1000
User-agent: Mutt/1.5.21 (2010-09-15)

On 07.09.16 14:19, Britton Kerin wrote:
> I remember reading somewhere in avr libc docs to do e.g. this:
> 
>     PCIFR = _BV (some_bit)
>     loop_until_bit_is_clear (PCIFR, some_bit);
> 
> This may be a bad example becuase of the odd write-one-to-clear
> semantics.  That isn't the point here, I don't remember which
> registers this advice applied to.  And I can't find it now.

The most common time that makes sense is when you need the result of a
hardware operation whose availability is flagged by the bit in question,
e.g. the result of an ADC measurement, or EEPROM write. It is of course
more efficient to take advantage of interrupts, where available, to
signal operation completion, as the cpu can do other stuff in the
interim.

Alternatively, if the bit were one of the general purpose flag bits,
being used as an interprocess semaphore, then you'd suspend the waiting
process, not loop.

> The only thing I could find in the datasheet that related to this was
> in section 13.2.4 of ATMega328P datasheet, where it says that you
> have to wait a cycle after assigning an output pin value before
> reading it back in.
> 
> Are there other cases where loop_until_* or a nop is required?

Neither a loop nor the nop is required if some other unrelated
instruction is moved in between, to take its place, but that does assume
we're writing the routine in assembler, and I hear that there are few of
us remaining who often do.

Erik



reply via email to

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