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]

Re: using threads causes exceptions


Hi,
>>
>> I'm using eCos on an XScale PXA270 and i have a problem using >> threads.
>> My
>> program does only start a thread from main() and after this function
>> calls
>> from thread causes ABORT DATA exceptions (MMU info: Imprecise >> External
>> Data
>> Abort). Even a printf causes this exception. The strange thing is, >> the
>> eCos
>> thread tests are working, even the stress test. Do i have to do some
>> initialisation? Should i better use cyg_start() instead of main()?
>
> Using main() is just fine. Most likely, you've not created the
> stack for the thread correctly. Or perhaps it's something within
> your thread itself.
>
> Have you tried running the program using GDB? Then you can catch
> the culprit and know where to start looking.


So ... made it through gdb which gave me:
[New Thread 2]

Program received signal SIGTRAP, Trace/breakpoint trap.
[Switching to Thread 2]
0xa008c72c in main_stack ()

This version is a bit smaller and does give me no exceptions like ABORT
DMA, but only the gdb output. Any suggestions?

It's pretty obvious that you've not set your thread up properly since it's trying to execute from the stack! Look carefully at how you created the thread - compare it against the examples and tests.

From gdb it looks like a corrupt stack, but i don't why.

If you still can't figure out what's wrong, you could send a
*fragment* of your code, showing how you are creating the thread,
etc.  Note: we don't want/need to see your whole program, just
this portion.

#define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL*2)


static cyg_thread thread_data;
static cyg_handle_t thread_handle;

static void decoder_audio(cyg_addrword_t data)
{
diag_printf("i'm here\n");
// more complex C++ stuff here
// and a endless loop calling some methods
}


int main(void) { void *stack = malloc(STACK_SIZE);

cyg_thread_create(0,                // Priority - just a number
 test_thread,          // entry
 0,                 // entry parameter
 0,    // Name
 stack,         // Stack
 STACK_SIZE,        // Size
 &thread_handle,    // Handle
 &thread_data       // Thread data structure
 );
cyg_thread_resume(thread_handle);  // Start it
cyg_scheduler_start();

printf("main end\n");
}

I even tried 1MB stack size with no change.

Bye...


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