野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 25051|回复: 5

关于栈STACK 申请空间的问题

[复制链接]
发表于 2021-4-7 03:07:54 | 显示全部楼层 |阅读模式
STM32 开发实战指南当中第15章,有提到启动文件中对栈的初始化摘取如下
野火论坛202104070301145989..png
后文提到stack 是从高地址向下生长的,但是从此段汇编描述中没有地方能够体现出来Stack是从高位生长的。只能看到申请了0x400的空间,并把SP 放在最高位,此时最高位是否是真正的栈底怎么知道呢?
想请教下各位的看法,另外SPACE 申请地址,是在哪个初始地址的情况下申请了0x400的地址呢?
新人发帖,请多多指教
回复

使用道具 举报

发表于 2021-4-7 10:34:47 | 显示全部楼层
野火论坛202104071034441036..png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-8 03:21:08 | 显示全部楼层

多谢回答,可能我描述的不够清晰,我想咨询的是,以上代码只做到了申请一段地址譬如地址为0xffff0000~0xfff0400,并把SP 放在地址末尾,即高地址处,但是这段内存绝对地址是否是在内存的最高地址,并没有办法确认。譬如既可能是0xffff0000~0xfff0400,也可能是0x00000000~0x00000400。这个怎么确保stack 申请的内存是在内存中地址较高的部分呢。如果heap Space完,立马stack Space,是否意味着二者地址相邻?而非一般理解的stack 在内存高地址处向下生长,距离heap 有充足的余量
回复 支持 反对

使用道具 举报

发表于 2021-4-8 09:26:56 | 显示全部楼层
(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。
(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。

补充栈区是函数调用时于保存现场的,用到那到那个就将他入栈,退出时还原。这是编译器的活,程序也不能乱操作这部分。余量要多少看你函数调用层数。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-9 02:49:59 | 显示全部楼层
cctv180 发表于 2021-4-8 09:26
(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结 ...

以上代码是汇编部分初始化内存的那段,我现在主要困惑的是,对于以上代码来说CPU 只是执行了一段分配内存,放置指针在高位的操作,但是该区域具体分配到哪里,是不是内存中的高位,并没有办法看出来。是否以上代码只是一个框架,实际上stack 栈的初始化并不像代码中体现的如此简单
回复 支持 反对

使用道具 举报

发表于 2021-4-9 15:20:26 | 显示全部楼层
xuanyuanjianyun 发表于 2021-4-9 02:49
以上代码是汇编部分初始化内存的那段,我现在主要困惑的是,对于以上代码来说CPU 只是执行了一段分配内存 ...

那个是链接器干的,建议你看友商的RTOS必备_硬件编程大全(STM32F103)里面有整个过程。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 21:01 , Processed in 0.055528 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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