STM32F0 - 关于内存(栈、堆)的问题

问题描述 投票:0回答:1

我对STM32微控制器(cortex M0)的堆栈和堆内存有点困惑。

首先,它们是 RAM 的一部分,但它们是数据表中描述的 RAM 大小的一部分吗?

其次,如果我通过告诉链接器来减少堆内存(我不使用任何 malloc),我可以增加 RAM 内存来存储更多全局和静态局部变量(这些变量存储在 RAM 内存的数据部分中) ?

最后,我在某个地方看到堆栈内存用于局部变量,但我在其他地方看到它用于静态数据..事实是什么?

额外问题:STM32数据表的内存映射图中显示的保留空间是什么?

你能给它带来光明吗?

提前谢谢您,

memory stack system heap stm32f0
1个回答
0
投票

RAM是内存,它是一个物理的东西。

栈和堆不是部分或RAM;它们是抽象结构,类似于 variablearrayobject 等。这些通过工具链(IDE,但最终由链接器)“定位”到 RAM 中。 堆栈通常由硬件直接支持(有一个或多个堆栈指针寄存器和自动使用它的指令)并且是某些功能所必需的,例如从被调用的函数返回。编译器还可以并且确实

使用堆栈来存储局部变量

和自动变量(寄存器溢出,即计算所需的值不适合寄存器并且需要临时存储在某个地方)。 静态变量与全局变量一起存储在其他地方,而不是存储在堆栈中。

ARM Cortex-M 处理器中的堆栈向下增长,因此堆栈指针通常初始化为堆栈顶部;然后链接器从堆栈底部找到静态/全局变量。编译器和链接器通常不会计算运行时将使用多少堆栈(有时它们会计算,但仅作为高级分析,并且有警告),因为在某些情况下很难甚至不可能计算它(例如,当使用函数指针时) )。假设您知道堆栈会增长多大(考虑到程序的复杂性和局部变量的使用)。估计堆栈使用情况的一种常见但不完善的方法是用已知模式(通常是可识别的“幻数”,例如

0xDEADBEEF

)填充 RAM,尝试执行程序的所有可能的执行模式,然后观察有多少该模式已被堆栈“破坏”。 您在某些工具链中指定为堆栈大小的值只是一个“暂定”值,链接器使用它来警告您全局+静态变量的总和加上该数字超出了可用的总 RAM。

堆完全是一个软件结构。如果您不使用它,请将其设置为 0,然后就不用管它了。是的,如果它非零,它只是添加到上面的总和中,因此将其设置为 0 将“释放”内存(在该链接器中不会抱怨或拒绝生成输出)。

额外的答案,地址空间的保留部分是“不可触摸”的,这就是您需要知道的全部(实际上,没有别的了,它是未分配的空间,访问通常会导致硬故障)。

© www.soinside.com 2019 - 2024. All rights reserved.