[ECOS] Thread scheduling

Jonathan Larmour jifl@eCosCentric.com
Wed Mar 3 20:50:00 GMT 2004

Giovanni Perbellini wrote:
> Hi all,
> I don't understand the behavoir of the scheduler.

I hope this isn't your homework ;-).

> I have a simple application running two threads with euqal priority
> (priority = 12).
> When the execution starts the ISR function is executed and then the DSR
> function is called.The DSR function executes the tick method to calculate the tick SW and
> finally the timeslice function is executed to assign a time slot to a
> thread (let's suppose to have a single cpu with the threads timeslice
> disabled...unique timeslice associates to 1 cpu).
> The timeslice calls timeslice_cpu function that checks if the current
> thread is running, then tries to rotate the run queue and finally the
> need_reschule flag is set.
>         if( thread->get_state() == Cyg_Thread::RUNNING )
>         {
>             Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler;
>             CYG_INSTRUMENT_MLQ( TIMESLICE, thread, 0);
>             CYG_ASSERTCLASS( thread, "Bad current thread");
>             CYG_ASSERTCLASS( sched, "Bad scheduler");
>             cyg_priority pri    = thread->priority;
>             Cyg_RunQueue *queue = &sched->run_queue[pri];
>             // In SMP systems we set the head of the queue to point to
>             // the thread immediately after the current
>             // thread. schedule() will then pick that thread, or one
>             // after it to run next.
>             queue->to_head( thread->get_next() );
>       #else
>             queue->rotate();
>       #endif
>             if( queue->get_head() != thread )
>                 sched->set_need_reschedule();
>             timeslice_count[cpu_this] = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS;
>         }
> What happens when this function is finished?

Execution returns from the DSR.

> Is the schedule method called?
> I guess that the scheduler executes the same prevoius thread even if it
> should the context switch. Why?

No.  After the DSR returns, the HAL's interrupt processing in vectors.S 
will then call interrupt_end in src/intr/intr.cxx. This calls 
Cyg_Scheduler::unlock, which, if the scheduler count is 0 will call 
unlock_inner in src/sched/sched.cxx. That function actually does the 
context switch - have a look.

eCosCentric    http://www.eCosCentric.com/    The eCos and RedBoot experts
 >>>>> Visit us in booth 2527 at the Embedded Systems Conference 2004 <<<<<
March 30 - April 1, San Francisco http://www.esconline.com/electronicaUSA/
--["No sense being pessimistic, it wouldn't work anyway"]-- Opinions==mine

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

More information about the Ecos-discuss mailing list