This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: DSR interruptible by scheduler + memory barriers


On 22.05.2012 20:01, Martin Laabs wrote:

> unfortunately I couldn't find the answer in the documentation. If the
> scheduler runs a DSR. Can this DSR become interrupted by an other thread
> or another DSR? (Of cause an ISR can interrupt it)

No. The scheduler lock is claimed while running the DSR
and as far as I know the DSRs are serialized. I can't
comment on multiprocessor cases.

> The background is that I wanna share data between a thread an a DSR and
> want to know whether I have to call cyg_(un)lock_scheduler when changing
> the data.

You most probably want to. A thread cannot preempt a DSR, but a DSR
will preempt a thread. So the structures used by both should
be protected.

> And another question about that - how are memory barriers implemented in
> eCos? (Are they implemented at all?)

Search for the HAL_REORDER_BARRIER in your HAL.

> Background: I have - for example - a status bit field that is copied to
> a (ISR/DSR) shared variable in the ISR. Now - if the compiler decides to
> put this variable into a register (in the ISR function) the DSR will get
> the wrong data. I could of cause declare the variable as volatile but
> this might be a performance issue in other cases where more data is
> affected.

A memory barrier and volatile are different beasts. A barrier
only prevents reordering of the memory accesses; it does nothing
with decisions of the compiler what to put in a register or
what optimization it can perform. At least not generally -
maybe gcc gives more guarantees. But it does this even regarding
visibility from other processor cores.

On the other side volatile guarantees that all memory accesses
actually take place and prevents reordering of the volatile
accesses. It does not preserve any order with relation to
non-volatile ones and on a multiprocessor system the order
observed from another processor might be different.


Regarding your case: an eCos driver should not allow the ISR
from the same source to be called before the DSR is complete
(you normally mask and ack the interrupt source in the ISR
and unmask at the end of its DSR).

For the thread/DSR synchronisation use cyg_drv_dsr_lock/unlock
which on systems with scheduler map to cyg_scheduler_lock/unlock.
This guarantees that no DSR will run while a thread is in this
section.

You for sure don't need the barrier here - the lock/unlock will
take care of this (if not, it is a bug).

Strictly said you need volatile here, because if the compiler
provably finds out that the lock/unlock calls do not touch
the variable in question, it is free to cache it in the register
across that call. However, with the function being in another
compilation unit this would be only possible with some
link-time optimization and it would need adressing at much
broader level anyway.

Regards
-- 
                                        Stano

-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]