Unable to reconfigure the stack size

Fabricio de Novaes Kucinskis fabricio at satelite.dea.inpe.br
Sun Nov 20 15:19:07 UTC 2011


Hello everybody,

I have an application that has blown the stack, tried a lot of things to fix 
it, and up to now nothing worked. In fact, nothing that I've tried so far had 
any effect on the stack size. 

It's clear to me that I'm missing or misunderstanding something. In order to 
discover what, follows a detailed description (sorry for the length) of my 
problem, and what I've tried - my hope is that, by describing in detail, I 
expose what I'm doing wrong and allow you to point it.

I'm using RTEMS 4.10.0 for the SIS BSP.

I have a task that demands more than the RTEMS default stack size for the 
ERC32 (I'm using SIS to try it, but I think this should not be an issue). At 
some point a local variable is overwritten by a memcpy applied to a large 
array in the .bss area, and the application falls in an infinite loop.

Follows the stack report taken immediatelly before the blow:

Stack usage by thread
    ID      NAME    LOW          HIGH     CURRENT     AVAILABLE     USED
0x09010001  IDLE 000205E2D0 - 000205F2DF 000205F0A0      4096        752
0x0A010002  ISIS 0002060BB0 - 0002061BBF 00020617C8      4096       4036
0xFFFFFFFF  INTR 000205C5D0 - 000205D5CF 0000000000      4080        576
Memory exception at 2cbe13c (illegal address)
Unexpected trap ( 9) at address 0x02014228
data access exception at 0x02CBE13C

Note: the "Memory exception" error only happens when I enable the stack 
checker, but I assume this is expected.

"Ok", I thought, "the default stack is not enough, so let's change it" - and 
that's what I've been trying to do for the last couple of days, with no 
success.

The first thing I tried was to change the stack size for the application, 
setting CONFIGURE_MINIMUM_STACK_SIZE to 8 kbytes, and changing the creation of 
the task, using RTEMS_CONFIGURED_MINIMUM_STACK_SIZE. But as a 
new stack report has shown, it seems to have no effect on the stack size. The 
same goes for the CONFIGURE_EXTRA_TASK_STACKS #define.

Starting to be worried, I've tried to change the start address of the RTEMS 
work area by using CONFIGURE_EXECUTIVE_RAM_WORK_AREA, just to see what 
happens. Again, nothing different.

To illustrate, follows the configuration with everything I tried. The 
corresponding stack report is exactly the same as above.

#define CONFIGURE_MINIMUM_STACK_SIZE 		(1024 * 8)
#define CONFIGURE_EXTRA_TASK_STACKS 		(1024 * 8)
#define CONFIGURE_EXECUTIVE_RAM_WORK_AREA	0x02100000
#define CONFIGURE_STACK_CHECKER_ENABLED

Now a little bit desperate, I went into the ERC32 BSP code. There is a 
STACK_SIZE defined in the start.S file, but not used there. The same is 
redefined in bspgetworkarea.c. But the way it is used suggests to me that the 
RTEMS work area shall not touch into this area:

void bsp_get_work_area(...) {
  /* must be identical to STACK_SIZE in start.S */
  #define STACK_SIZE (16 * 1024)
  *work_area_start      = &end;
  *work_area_size       = (void *)rdb_start - (void *)&end - STACK_SIZE;
  
Being "end" a symbol set at linkcmds.base, pointing to the end of the .bss 
area, and "rdb_start" pointing to the end of RAM, I assumed that RTEMS sets 
the ERC stack pointer to work_area_start + work_area_size, but this seems not 
to be the case. 

Digging deeper into the BSP code, I saw that _CPU_Context_switch saves the 
registers, including the stack pointer (not touched by RTEMS yet). At the 
first call to _CPU_Context_restore_heir, the stack pointer is "restored" to an 
address that I couldn't relate to anything:

- work_area_start = 0x205c150 (end of the .bss section)
- work_area_size = 0x39feb0 (last RAM address - first free RAM address - 
STACK_SIZE)
- restored stack pointer at _CPU_Context_restore_heir = 0x20606f0 (???)

That's when I, already dizzy, stopped trying and decided to ask the list. It 
shall be something (maybe elementary) that I'm doing wrong, but I don't know 
what it could be, nor where to look at anymore.

Thanks for your time and best regards,

Fabrício Kucinskis.



More information about the users mailing list