This is the mail archive of the ecos-discuss@sources.redhat.com 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: Scheduler problem


"liu hua" <rongye_liu@hotmail.com> writes:

> In the tewothreads example program, if I don't use cyg_thread_delay()
> in the 'simple_program' thread, or if use cyg_thread_delay(0), the two
> threads cannt be scheduled normally.  The result is only one thread
> can run, and another thread is hung. thread program:
> void simple_program(cyg_addrword_t data)
> {
>   int message = (int) data;
>   int delay;
> 
>   printf("Beginning execution; thread data is %d\n", message);
> 
>   //cyg_thread_delay(200);
> 
>   for (;;) {
>     //delay = 0+ (rand() % 0);
> 
>     /* note: printf() must be protected by a
>        call to cyg_mutex_lock() */
>     cyg_mutex_lock(&cliblock); {
>       printf("Thread %d: and now a delay of %d clock ticks\n",
> 	     message, delay);
>     }
>     cyg_mutex_unlock(&cliblock);
>     cyg_thread_delay(0);
>   }
> }
> Output result:
> Thread 0: and now a delay of 0 clock ticks
> Thread 0: and now a delay of 0 clock ticks
> Thread 0: and now a delay of 0 clock ticks
> Thread 0: and now a delay of 0 clock ticks
> ...

Thread 0 is higher priority that thread 1. Without the delays, thread
0 is always runnable and will always occupy the CPU. Thread 1 will
never get to execute.

> 
> So, in my ecos application which have many thread have follow program:
> while (1)
> {
>   ...
> }

If you write all your threads to just loop like this, then only the
highest priority thread will run. Just like you discovered above.


> If must I use cyg_thread_delay(delay) in it? ie:
> while (1)
> {
>  ...
>   cyg_thread_delay(delay);
> }
> 
> If I must use cyg_thread_delay() in these threads, the performance of
> ecos will be a bad thing.


The general approach for writing multi-threaded applications is to
make threads wait for some event, do some processing, and then go back
to waiting. The event may be an interrupt, a timer, or a
synchronization action by some other thread.

-- 
Nick Garnett                                     eCos Kernel Architect
http://www.ecoscentric.com                The eCos and RedBoot experts


-- 
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]