OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4124|回复: 4

求助,关于启动文件中的堆栈

[复制链接]

6

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2016-4-2
在线时间
66 小时
发表于 2016-7-25 10:46:26 | 显示全部楼层 |阅读模式
1金钱
在启动文件中定义了栈的大小是0x400,堆的大小是0x200
Stack_Size      EQU    0x00000400

              AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem    SPACE  Stack_Size
__initial_sp

Heap_Size     EQU    0x00000200

            AREA    HEAP, NOINIT, READWRITE,ALIGN=3
__heap_base
Heap_Mem  SPACE   Heap_Size
__heap_limit

那么栈顶地址不是应该是0x20000600吗?但我在map文件查到的是0x20000738
__initial_sp                             0x20000738   Data           0  startup_stm32f40_41xxx.o(STACK)

请问是不是我理解错了






最佳答案

查看完整内容[请看2#楼]

只是在这里定义了一个数组,但链接脚本中并没有限制一定要把这stack和heap这两个数组放在哪里。 只是规定了启动入口放在FLASH的0地址。
享受学习中的乐子,做合格的程序猿
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3708
金钱
3708
注册时间
2011-5-23
在线时间
2010 小时
发表于 2016-7-25 10:46:27 | 显示全部楼层
只是在这里定义了一个数组,但链接脚本中并没有限制一定要把这stack和heap这两个数组放在哪里。
只是规定了启动入口放在FLASH的0地址。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

6

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2016-4-2
在线时间
66 小时
 楼主| 发表于 2016-7-25 10:59:48 | 显示全部楼层
aozima 发表于 2016-7-25 10:57
只是在这里定义了一个数组,但链接脚本中并没有限制一定要把这stack和heap这两个数组放在哪里。
只是规定 ...

那请教一下栈顶地址 __initial_sp 是怎么算出来的啊
享受学习中的乐子,做合格的程序猿
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3708
金钱
3708
注册时间
2011-5-23
在线时间
2010 小时
发表于 2016-7-25 11:37:38 | 显示全部楼层
[mw_shl_code=c,true]Stack_Mem    SPACE  Stack_Size
__initial_sp[/mw_shl_code]
翻译成C语言就是  [mw_shl_code=c,true]u8 Stack_Mem[Stack_Size]
u32 __initial_sp[/mw_shl_code]

链接时按顺序排列,这样 __initial_sp 所在的地址就是 Stack_Mem 结束后的地址,也就是 Stack_Mem 的顶部了。
这里需要保证按顺序排列,可能是汇编中默认不改位置,如果是C中,两个定义在一块的变量,是不能保证位置连续的。
特别是在使用了按名称排序的情况下。

要想绝对可靠,应该使用 Stack_Mem的地址再加上 Stack_Size
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

6

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2016-4-2
在线时间
66 小时
 楼主| 发表于 2016-7-25 13:44:46 | 显示全部楼层
aozima 发表于 2016-7-25 11:37
翻译成C语言就是  [mw ...

嗯嗯,这几句汇编我看得懂。
[mw_shl_code=applescript,true]    HEAP                                     0x20000160   Section      512  startup_stm32f40_41xxx.o(HEAP)
    Heap_Mem                                 0x20000160   Data         512  startup_stm32f40_41xxx.o(HEAP)
    STACK                                    0x20000360   Section     1024  startup_stm32f40_41xxx.o(STACK)
    Stack_Mem                                0x20000360   Data        1024  startup_stm32f40_41xxx.o(STACK)
    __initial_sp                             0x20000760   Data           0  startup_stm32f40_41xxx.o(STACK)[/mw_shl_code]
这几句话是不是说栈从栈顶 0x20000760 开始向下生长,堆从0x20000160向上生长啊
享受学习中的乐子,做合格的程序猿
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 20:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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