I am giving brief introduction about my project environment.
I have an elf image, created using WinARM tool chain. I have used gcc
4.1.1
I have to run the code(debug the elf image) on ARM9 platform.Our board
we have 64MB sdram.I have used the start-up code and Linker script for
initial configuaration. Iam using RealView Debugger for debugging the
target.
In the tool we have to mention a 'Top Memory' from which address the SP
is configuerd, they are recomending it should at highest possible
address.So i placed the 'Top Memory' at 0x04000000 (64MB).
According to the sbrk() implimention , that we are using with WinARM
(systemcalls.c)
HeaP comes after the Stack .So heap is allocated at rest of the memory
after stack Am I right? If so how can we overcome these conflicing
situations.
Actual problem is that while trying to allocate memory, it is returning
a NULL pointer allways.
------------------------------------------------------------------------
-------
This is the part of Linker script i used.
ENTRY(_start)
STACK_SIZE = 10M ;
/* Memory Definitions */
MEMORY
{
RAM (rw) : ORIGIN = 0x00008000, LENGTH = 0x03ff8000
}
/* Section Definitions */
SECTIONS
{
/* first section is .text which is used for code */
. = 0x8000 ;
.text :
{
*crt0.o (.text) /* Startup code */
*(.text) /* remaining code */
*(.rodata) /* read-only data (constants) */
} > RAM
. = ALIGN(4);
_etext = . ;
PROVIDE (etext = .);
/* .data section which is used for initialized data */
.data :
{
_data = .;
*(.data)
} > RAM
. = ALIGN(4);
_edata = . ;
PROVIDE (edata = .);
/* .bss section which is used for uninitialized data */
.bss (NOLOAD) :
{
__bss_start = . ;
_bss_start_ = . ;
*(.bss)
*(COMMON)
. = ALIGN(4);
} > RAM
. = ALIGN(4);
_bss_end_ = . ;
PROVIDE (__bss_end = .);
.stack ALIGN(256) :
{
. += STACK_SIZE;
PROVIDE (_stack = .);
} > RAM
_end = . ;
PROVIDE (end = .);
------------------------------------------------------------------------
-----
this the sbrk() implimentaion i have used
caddr_t
_sbrk (int incr)
{
extern char end asm ("end"); /* Defined by the linker. */
static char * heap_end;
char * prev_heap_end;
if (heap_end == NULL)
heap_end = & end;
prev_heap_end = heap_end;
if (heap_end + incr > stack_ptr)
{
/* Some of the libstdc++-v3 tests rely upon detecting
out of memory errors, so do not abort here. */
#if 0
extern void abort (void);
_write (1, "_sbrk: Heap and stack collision\n", 32);
abort ();
#else
errno = ENOMEM;
return (caddr_t) -1;
#endif
}
heap_end += incr;
return (caddr_t) prev_heap_end;
}
Thaks in advace for your great answers
regards
Thejus
I hope that I understand your problem correctly... Thejus Kuttian wrote: > In the tool we have to mention a 'Top Memory' from which address the SP > is configuerd, they are recomending it should at highest possible > address.So i placed the 'Top Memory' at 0x04000000 (64MB). Which "tool"? Which SP (IRQ, SVC, ...)? > According to the sbrk() implimention , that we are using with WinARM > (systemcalls.c) > HeaP comes after the Stack .So heap is allocated at rest of the memory > after stack Am I right? If so how can we overcome these conflicing > situations. Your configuration looks like this. But it's difficult to understand your setup completely without the initialistion-code for the stack-pointers. Please show your startup-code or at least the parts where the stack-pointers are initialized. > Actual problem is that while trying to allocate memory, it is returning > a NULL pointer allways. Verify that the "end"-address is assigned correclty: see map-file, sym-file etc. If you have a Hardware-Debugger or Simulator: set a breakpoint in sbrk and see what's going on. > This is the part of Linker script i used. > > ENTRY(_start) > STACK_SIZE = 10M ; > > /* Memory Definitions */ > MEMORY > { > > RAM (rw) : ORIGIN = 0x00008000, LENGTH = 0x03ff8000 > > } ... > . = ALIGN(4); > > _bss_end_ = . ; > > PROVIDE (__bss_end = .); > > > .stack ALIGN(256) : > { > . += STACK_SIZE; > PROVIDE (_stack = .); > } > RAM I wrote that the tools wants "the stack" at the top of RAM. Here you create a section stack right after the bss. Is "_stack" used in the startup-code? > _end = . ; > PROVIDE (end = .); So the head starts after the memory-area reserved for the stack. At least it should when sbrk "sees this end". You may: (1) remove the section .stack from the linker-script (STACK_SIZE is no longer needed) (2) add a "variable" like i.e. __TOP_STACK into the linker script. i.e. like __TOP_STACK=0x04000000 of with newer versions of the binutils __TOP_STACK=ORIGIN(RAM)+LENGTH(RAM); (3) use __TOP_STACK for the stack-pointer initialisation in the startup-code. Roughly like this: ... .RAM_TOP: .word __TOP_STACK ldr r0,.RAM_TOP msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT mov r13, r0 sub r0, r0, #IRQ_STACK_SIZE ... init for the other modes ... This should create a "layout" like this: TEXT|DATA|BSS|HEAP--> .....<--STACK| The basic method is demonstrated in my "AT91SAM7S gamma" example at http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/index_at91.html#at91_gamma At least the parts about the stack-location and setup should be portable. Martin Thomas
Hi ,
Thanks and Thanks alot Martin , i just tried your opinion ie, i
applied modifications in both startup code and linkerscript..
regards
Thejus
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.