硬汉嵌入式论坛

 找回密码
 立即注册
查看: 676|回复: 6
收起左侧

[NUCLEO-H743ZI] keil生成bin文件的栈顶地址

[复制链接]

19

主题

28

回帖

85

积分

初级会员

积分
85
发表于 2025-2-20 09:41:05 | 显示全部楼层 |阅读模式
keil生成的bin文件起始地址的栈顶地址是由编译器随机决定的嘛?我有两个工程;一个代码量少,BIN文件大小42K,栈顶地址为0x240008A8;一个代码量大,BIN文件大小90K,栈顶地址为0x2000CD68
回复

使用道具 举报

19

主题

28

回帖

85

积分

初级会员

积分
85
 楼主| 发表于 2025-2-20 09:41:24 | 显示全部楼层
平台为STM32H743ZI
回复

使用道具 举报

4

主题

412

回帖

424

积分

高级会员

积分
424
发表于 2025-2-20 11:30:09 | 显示全部楼层
原因很简单堆栈地址在全局变量的后面所以堆和栈地址都是动态的。自己看一眼.map文件就知道了 关键词STACK  RW-data + ZI-data
更多高级玩法可以看傻孩子大佬的文章

这么好用?!99%开发者从未听说过的堆栈模型(加量增强版)
https://mp.weixin.qq.com/s?__biz ... 3306887461322753#rd
Snipaste_2025-02-20_10-34-15.png
回复

使用道具 举报

0

主题

49

回帖

49

积分

初级会员

积分
49
发表于 2025-2-20 14:22:48 | 显示全部楼层
keil 是你已经占用的堆内存(全局变量之类的)+ 你申明的栈大小(keil 配置页面设定)来做栈顶地址,不同工程全局变量数量不同,栈顶地址自然不同。
对于 keil,栈顶往上的内存是浪费的,除非你每次根据编译出来的 map 文件,计算浪费的内存大小是多少,然后修改栈申明的大小,相应加大。
很傻的要手动操作。

而 stm32cubemx 生成的 makefile + gcc 工程,栈固定设定在内存顶部,可以最大程度避免栈溢出。
回复

使用道具 举报

19

主题

28

回帖

85

积分

初级会员

积分
85
 楼主| 发表于 2025-2-20 14:39:50 | 显示全部楼层
cctv180 发表于 2025-2-20 11:30
原因很简单堆栈地址在全局变量的后面所以堆和栈地址都是动态的。自己看一眼.map文件就知道了 关键词STACK   ...

我懂了,楼主的意思就是说如果在SRAM2也就是0x24000000~0x24080000有全局变量,编译器就给他分配内存,那么栈顶就是从0x24000000开始;如果在全局变量在0x20000000~0x20020000之间,那么栈顶就是从0x20000000开始。
回复

使用道具 举报

4

主题

412

回帖

424

积分

高级会员

积分
424
发表于 2025-2-20 15:54:26 | 显示全部楼层
Luo990619 发表于 2025-2-20 14:39
我懂了,楼主的意思就是说如果在SRAM2也就是0x24000000~0x24080000有全局变量,编译器就给他分配内存,那 ...

还是没搞对啊,栈顶不可能是起始地址,栈的生长方向是自上而下即压栈后地址变小,好好看看那个文章吧

按你例子1 栈顶在0x24080008 + (栈大小位置)(8字节对齐)
例子2 栈顶在0x20020008+ (栈大小位置)
回复

使用道具 举报

19

主题

28

回帖

85

积分

初级会员

积分
85
 楼主| 发表于 2025-2-20 16:38:58 | 显示全部楼层
cctv180 发表于 2025-2-20 15:54
还是没搞对啊,栈顶不可能是起始地址,栈的生长方向是自上而下即压栈后地址变小,好好看看那个文章吧

...

好的明白了,我就是你这个意思,我没有表达清楚,感谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 08:58 , Processed in 0.042062 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表