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]

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


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