tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Waiting for a bit in a register to be cleared: which strategy?
On lug 03 11:15, Mouse wrote:
> I'm not sure what's "brutal" about those, but OK...
My ignorance about this kind of operations. Now I better understood,
thanks to your and Taylor's comments.
> Actually, because of your "& (uint32_t) NOT_CLEARED", it works
> regardless of the other bits in register A: you are masking off all but
> the low bit.
Oh, my fault. You are right.
> The other 31 bits - you're using bus_space_read_4, so it's reading 31
> bits. If register A is an 8-bit register
No, in this case it is a 32 bit register: this is why I used
bus_space_read_4.
> Efficient in terms of what resource? That is, what measure of
> efficiency are you interested in here?
Above all, the code complexity (not the hardware resource consumption).
> I'm having trouble thinking of one for which there's anything
> wrong with what you have.
OK, this is good!
> Check out the definition of __BIT - it is no different in practice
> from more or less what you're already doing.
Yes, now I better understood.
> There are multiple ways to do this.
>
> The simplest is probably to just put a limit on the iteration count:
[...]
> But this makes the timeout inherently dependent on the host CPU speed.
Yes, I excluded this because I would like to avoid using the CPU for
(potentially) millions of cycles and - as you said - because of the
CPU-dependent variable increment.
> If that's a problem, you could add a delay in the loop
I think this is the best in my case.
> If the device can be made to generate an interrupt when the bit
> changes, another answer is to make your driver enable that interrupt
> and go to sleep waiting for it. The changes for that are too large for
> me to give here; depending on the surrounding code structure, they may
> involve significant rearrangement.
Yes, check out my answer to Taylor, with a link to the device
documentation. Interrupts are maybe the ideal solution, but I'm
completely unable to handle them in a driver. I'm a complete newbie.
> The last two options have the advantage that they release the CPU to do
> other useful work while waiting. They have the disadvantage that they
> decrease responsiveness - the delay from the bit changing to the code
> reading register B increases significantly.
Yes, of coure.
> One is that busy-waiting is inefficient in that it does not allow the
> CPU to do any other useful work while waiting; if the delay is long
> compared to the time required to context-switch to doing other useful
> work, and there is, or might be, other useful work to do, this can be
> significant.
I think the bit is cleared almost immediately, according to how I guess
the device works, so this could not be the case.
> The other is that, as I wrote, for some buses and some devices, you
> have to access a register as the correct width or it will not work
[...]
> I don't
> know enough about your setup to tell whether it's an actual mismatch,
> nor, if it is, whether the difference matters.
I am sure that a 32 bit access is correct. My reply to Taylor (see the
bottom of the text) should provide all the elements to evaluate the
device.
Thanks for your help!
Rocky
Home |
Main Index |
Thread Index |
Old Index