大家好
最近要用keil调试cortexM0的一个程序
之前代码比较小也比较简单都没什么问题
现在这个程序因为要用到很多很大的中间变量,debug的时候到了大数那里就跑不了了
堆栈分配以前也没分过,他的启动代码和网上别人讲的不一样,贴一下代码,大家帮忙看看吧
boot.c中
// Set up initial stack and heap
__value_in_regs struct __initial_stackheap
__user_initial_stackheap(unsigned R0, unsigned SP, unsigned R2, unsigned SL)
{
struct __initial_stackheap s;
s.heap_base = R0; /* low-address end of initial heap */
s.stack_base = SP; /* high-address end of initial stack */
s.heap_limit = s.stack_base; /* high-address end of initial heap */
s.stack_limit = s.heap_base; /* low-address end of initial stack */
return s;
}
还有rt_misc.c中相关代码
/*
This must return a pointer to __USER_LIBSPACE_SIZE bytes of zero-initialised space, used to store vital static data such as
errno, the heap state, and the FP status word.*/
#define __USER_LIBSPACE_SIZE 96
extern void *__user_libspace(void);
/*
* This can be defined to override the standard memory models' way
* of determining where to put the initial stack and heap.
*
* The input parameters R0 and R2 contain nothing useful. The input
* parameters SP and SL are the values that were in SP and SL when
* the program began execution (so you can return them if you want
* to keep that stack).
*
* The two `limit' fields in the return structure are ignored if
* you are using the one-region memory model: the memory region is
* taken to be all the space between heap_base and stack_base.
*/
struct __initial_stackheap {
unsigned heap_base; /* low-address end of initial heap */
unsigned stack_base; /* high-address end of initial stack */
unsigned heap_limit; /* high-address end of initial heap */
unsigned stack_limit; /* low-address end of initial stack */
};
extern __value_in_regs struct __initial_stackheap
__user_initial_stackheap(unsigned /*R0*/, unsigned /*SP*/,
unsigned /*R2*/, unsigned /*SL*/);
/*
* This can be defined to give bounds on the address space the heap
* will ever use.
*/
struct __heap_extent {
unsigned base, range;
};
extern __value_in_regs struct __heap_extent
__user_heap_extent(unsigned /*ignore*/, unsigned /*ignore*/);
/*
* This can be defined to specify how much spare stack is needed
* below SL in addition to the 256 bytes required by ATPCS:
* `always' gives the number of bytes of extra stack required at
* all instants (so that an interrupt handler has space to run in,
* for example), while `cleanup' gives the number of bytes of extra
* stack required to be available after a stack overflow has
* occurred, so that the stack overflow routine (e.g. SIGSTAK
* handler) has room to tidy up.
*/
struct __stack_slop {
unsigned always, cleanup;
};
extern __value_in_regs struct __stack_slop
__user_stack_slop(unsigned /*ignore*/, unsigned /*ignore*/);
/*
* This can be defined to return extra blocks of memory, separate
* from the initial one, to be used by the heap. It should place a
* pointer to a block of at least the requested size in `*base',
* and return the size of the block. It should return 0 if no such
* block can be returned, in which case the value stored at `*base'
* is never used.
*/
extern unsigned __user_heap_extend(int /*ignore*/,
void ** /*base*/,
unsigned /*requestedsize*/);
这个应该是比较原始的代码
我RAM只是一个模型,分配的起始地址是0x20000000
请问下这里堆栈应该怎么分呢
谢谢
|