This is the mail archive of the
ecos-discuss@sources.redhat.com
mailing list for the eCos project.
RE: question about Synchronization Levels in eCOS? Thanksalot.
- From: "Gary D. Thomas" <gary dot thomas at mind dot be>
- To: QiangHuang <jameshq at liverpool dot ac dot uk>
- Cc: eCos Discussion <ecos-discuss at sources dot redhat dot com>
- Date: 06 May 2003 07:32:09 -0600
- Subject: RE: [ECOS] question about Synchronization Levels in eCOS? Thanksalot.
- Organization:
- References: <ONEOIJPPOKNBBKJKCGLCAEJGCAAA.jameshq@liv.ac.uk>
On Tue, 2003-05-06 at 07:25, QiangHuang wrote:
> Thanks Gary.
>
>
> Suppose the following:
>
> thread1( )
> {
>
> cyg_flag_wait( &flag );
>
> }
>
> isr( )
> {
> // if cyg_flag_setbits(&flag) called here what problem would be?
> }
>
> dsr( )
> {
> // if cyg_flag_setbits(&flag) called here would this be OK?
> }
>
>
> Q1: But can I awaken a thread in DSR( ) by calling cyg_flag_setbits( ) ?
>
Yes.
> Q2: If I use the cyg_flag_setbits( ) in ISR( ) to awaken a thread what problem would happen? (affect the IRQ responsing time?)
>
As I said, since ISR routines can be called - *EVEN WHEN THE
KERNEL DATA STRUCTURES ARE IN FLUX* - calling any kernel
function which might manipulate data structures, e.g. awaken
a thread, would be disastrous. Of course, you might get
away with it 99.999% of the time, but it would still be
potentially fatal.
Bottom line: don't do it.
Hint: there is a whole section in the eCos documentation
which discusses what functions can be called when [safely].
Perhaps reading that would answer your questions.
> Thanks a lot.
>
> -----Original Message-----
> From: Gary D. Thomas [mailto:gary.thomas@mind.be]
> Sent: 06 May 2003 14:13
> To: QiangHuang
> Cc: eCos Discussion
> Subject: Re: [ECOS] question about Synchronization Levels in eCOS?
> Thanks alot.
>
>
> On Tue, 2003-05-06 at 06:51, QiangHuang wrote:
> > Hi all:
> > I have some question about the Synchronization Levels in ecos. Can I set
> > the flag bit or post semaphore in a ISR()? if not why? As mentioned in the
> > ecos doc as:
> > " Since it would be dangerous for an ISR or DSR to make a call that might
> > reschedule the current thread (by trying to lock a mutex for example) all
> > functions in this API have an associated synchronization level. "
> >
> > I can't completely understand why calling a function :
> > yg_drv_cond_signal( ) in isr() or dsr() should be forbidden. Is this just
> > to signal a condiction probably awaken a waiting thread. Then the awaken
> > thread might be able to run after exiting isr( ) and dsr( ), if this is
> > thread that the application want to run when such IRQ occured. so why ? how
> > does this compare to "cyg_flag_setbits( )" and "cyg_semaphore_post( )"
>
> This is illegal because ISR routines can be called at any point
> that interrupts are enabled. This includes during what some
> systems call "critical sections", e.g. places where the kernel
> is manipulating it's own internal data structures etc.
>
> We allow ISR routines to be called like this in order to keep
> interrupt response time to a minimum. The ISR is then expected
> to dispatch a DSR if more extensive (or dangerous) operations
> are required. In this way, pure interrupt response time is
> minimized and the kernel is kept fast and simple.
>
> --
> Gary D. Thomas <gary.thomas@mind.be>
--
Gary D. Thomas <gary.thomas@mind.be>
--
Before posting, please read the FAQ: http://sources.redhat.com/fom/ecos
and search the list archive: http://sources.redhat.com/ml/ecos-discuss