This is the mail archive of the
ecos-discuss@sourceware.org
mailing list for the eCos project.
Unexpected exit from threads
- From: David Luca <davidluca3000 at yahoo dot com>
- To: ecos-devel <ecos-devel at sourceware dot org>, ecos-discuss <ecos-discuss at sourceware dot org>
- Date: Thu, 23 Nov 2006 00:43:02 -0800 (PST)
- Subject: [ECOS] Unexpected exit from threads
Hello,
I tried the example found in twothreads.c, but renamed
the file to hello.cpp to compile it with g++.
I commented the printf calls and replaced with
lighting led functions. The code looks like:
void Led(int led)
{
int j;
for(j=0;j<100000;j++)
GPIO_clr(led);
for(j=0;j<100000;j++)
GPIO_set(led);
}
/* now declare (and allocate space for) some kernel
objects,
like the two threads we will use */
cyg_thread thread_s[2]; /* space for two thread
objects */
char stack[2][4096]; /* space for two 4K stacks */
/* now the handles for the threads */
cyg_handle_t simple_threadA, simple_threadB;
/* and now variables for the procedure which is the
thread */
cyg_thread_entry_t simple_program;
/* and now a mutex to protect calls to the C library
*/
cyg_mutex_t cliblock;
#ifdef __cplusplus
extern "C"{
#endif
void _impure_ptr()//required for C++ new operator
{
}
/* we install our own startup routine which sets up
threads */
void cyg_user_start(void)
{
// printf("Entering twothreads' cyg_user_start()
function\n");
cyg_mutex_init(&cliblock);
cyg_thread_create(4, simple_program,
(cyg_addrword_t) USR_LED0, "Thread A", (void *)
stack[0], 4096, &simple_threadA, &thread_s[0]);
cyg_thread_create(4, simple_program,
(cyg_addrword_t) USR_LED1, "Thread B", (void *)
stack[1], 4096, &simple_threadB, &thread_s[1]);
cyg_thread_resume(simple_threadA);
cyg_thread_resume(simple_threadB);
}
#ifdef __cplusplus
};//extern "C"{
#endif
/* this is a simple program which runs in a thread */
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 = 200 + (rand() % 50);
/* note: printf() must be protected by a
call to cyg_mutex_lock() */
cyg_mutex_lock(&cliblock);
{
Led(message); //light up/down led in 2 tasks
// printf("Thread %d: and now a delay of %d clock
ticks\n",
// message, delay);
}
cyg_mutex_unlock(&cliblock);
cyg_thread_delay(delay);
}
}
When I run this example, I can see that each of the 2
leds are lit, then the threads exits without
continuing. Is there something wrong with the
scheduler? The platform used is based on Agilent
AAED2000 (Arm920). If you have any ideas, please
inform me. Thank you in advance,
David Luca.
____________________________________________________________________________________
Do you Yahoo!?
Everyone is raving about the all-new Yahoo! Mail beta.
http://new.mail.yahoo.com
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss