我有一个STM32F103VCT6
微控制器,SRAM的48KB,而且最近我有一个内存冲突:如何将堆栈对齐到SRAM的末尾?
我有一些静态变量(可以称之为A
)位于与0x7000
大小堆和我写了一些简单的功能获取有关堆和栈信息:
void check(int depth) {
char c;
char *ptr = malloc(1);
printf("stack at %p, heap at %p\n", &c, ptr);
if (depth <= 0) return;
check(depth-1);
}
所以我有这样的事情:
stack at 2000939b, heap at 20008fd0
stack at 20009383, heap at 20008fe0
stack at 2000936b, heap at 20008ff0
stack at 20009353, heap at 20009000
stack at 2000933b, heap at 20009010
stack at 20009323, heap at 20009020
stack at 2000930b, heap at 20009030
stack at 200092f3, heap at 20009040
stack at 200092db, heap at 20009050
stack at 200092c3, heap at 20009060
stack at 200092ab, heap at 20009070
所有静态变量(incliding A
)已经得到了他们的堆,所以堆位于0x8fd0
。而且看起来,原来,堆栈指针位于0x939b
,那就是远离48KB(0xc000
)
当我改变了A
可变大小0x4000
我有这样的画面:
stack at 2000639b, heap at 20005fd0
stack at 20006383, heap at 20005fe0
stack at 2000636b, heap at 20005ff0
stack at 20006353, heap at 20006000
stack at 2000633b, heap at 20006010
stack at 20006323, heap at 20006020
stack at 2000630b, heap at 20006030
stack at 200062f3, heap at 20006040
stack at 200062db, heap at 20006050
stack at 200062c3, heap at 20006060
stack at 200062ab, heap at 20006070
所以,似乎堆栈位置不是位于SRAM的末尾,而是一些如何依赖用户定义的变量。
如何将堆栈对齐到SRAM的最末端(48kb)?
我正在使用CooCox IDE和GNU Tools ARM Embedded
toolchain。
谢谢!
编辑:
对不起,我有些误会这里,A
不是const的,我已经把它称为静态唯一关键字的原因是:
static uint8_t A[A_SIZE];
printf("A is at %p\n", &A);
这表明A
位于内存开始:
A is at 20000c08
为什么你认为静态变量分配在堆上?从您的结果看来,它们更有可能位于公羊顶部,并且堆叠从它们下面开始。试着打印'A'的地址。 – caf
这可能是由您的链接脚本控制的。阅读它(并阅读mapfile以查看其结果) –
“我有一些静态变量(让我们称之为A)位于堆中”这没有任何意义,所以也没有问题(为什么所有这些投票? )。静态变量和动态变量几乎是彼此的对立面,因此是“静态”和“动态”。静态变量分配在'.data/.bss'中,堆中的动态变量和堆栈中的局部变量。现在,你在谈论静态变量还是动态变量?因为它们不能同时存在。请显示“A”的变量声明和初始化。 – Lundin