stm32堆栈整理

STM32在Keil环境下,堆栈大小虽已定义,但起始地址由用户程序变量数目决定,烧录后保持不变。堆栈生长方向从高地址向低地址,而堆从低地址向高地址生长,两者最终‘头碰头’。__initial_sp值等于SRAM起始地址加上可读可写数据段(RW)和零初始化变量(ZI)的大小,它表示栈的高地址。通过__initial_sp可以计算出栈和堆的大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32的堆栈大小在官方文件已经定义好了,分别是:
Heap_Size EQU 0x00000200 一共512字节
Stack_Size EQU 0x00000400 一共1K字节
/*********************************************************************************************/
但是STM32在keil环境下每次编译后的堆栈起始地址并不是固定的(就算事先已经定义好了堆栈的大小),因为栈的起始地址是由用户程序中事先定义好的变量数目决定的(实测是如此)。但欣慰的是,一旦这次编译之后,堆栈的首地址就不会再发生改变了,换言之,就是在烧完程序之后,堆栈的地址就永远不变了。
/*********************************************************************************************/
要关心STM32的堆栈关系,首先无法避免的就是下面这两幅图片了:
这里写图片描述
这里写图片描述
图一:MDK环境下,STM32 Bulid Output窗口部分截图
图二:MDK环境下,STM32的.map文件中关于堆栈地址的说明(绿色高亮部位)
/*********************************************************************************************/
STM32的内部sram的首地址为0x20000000,图二中的__initial_sp既为栈的高地址(也就是栈的首地址)(STM32的堆栈地址在MDK下的配置默认是连

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值