【发布时间】:2015-08-30 10:19:36
【问题描述】:
我有一个带有 48kb SRAM 的STM32F103VCT6 微控制器,最近我遇到了内存冲突:
我有一些静态变量(我们称之为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
所有静态变量(包括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)?
我正在使用带有 GNU Tools ARM Embedded 工具链的 CooCox IDE。
谢谢!
编辑:
对不起,这里有一些误解,A 不是 const,我之所以称它为静态只是因为关键字:
static uint8_t A[A_SIZE];
printf("A is at %p\n", &A);
这说明A位于内存的开头:
A is at 20000c08
【问题讨论】:
-
为什么你认为静态变量是在堆上分配的?从您的结果来看,它们似乎更有可能位于内存顶部,堆栈从它们下方开始。尝试打印
A的地址。 -
这可能由您的链接描述文件控制。阅读(并阅读地图文件以查看结果)
-
“我有一些静态变量(我们称之为 A)位于堆中” 这没有任何意义,所以问题也没有(为什么所有这些投票?)。静态变量和动态变量几乎是相互对立的,因此有“静态”和“动态”这两个词。静态变量分配在
.data/.bss,动态变量在堆上,局部变量在栈上。现在,您是在谈论静态变量还是动态变量?因为他们不可能同时成为两者。请展示“A”的变量声明和初始化。 -
@Lundin 误会,更新问题
标签: c embedded stm32 gnu-arm coocox