打印
[应用相关]

STM32的堆栈介绍

[复制链接]
394|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
OKAKAKO|  楼主 | 2023-5-31 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先介绍下堆栈是个什么东西:
堆和栈是两个不一样的东西,不过它们本质都是一片内存区域,只不过这片内存具有自己独特的属性。堆栈都是一种数据项按序排列的数据结构,只能在一端对数据项进行插入和删除。
堆和栈最为突出的特点是两者存放数据类型的不同。
1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
除此之外,还有一个存放数据的地方叫做静态区,也叫全局区。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。该区域的数据是等程序结束后由系统进行释放。
好了,接下来说说STM32的堆和栈。首先有两个问题:1,STM32的堆和栈有多大,在哪里定义的;2,STM32的堆栈在空间上的分配以及增长方向又是怎么样的。
对于第一个问题:堆栈的大小是在STM32的启动文件里面定义的。通过汇编伪指令EQU
来定义大小。1.堆和栈大小
定义大小在startup_STM32f2xx.s
Stack_Size
EQU
0x00000800
AREA
STACK,
NOINIT,
READWRITE,
Stack_Mem
SPACE
Stack_Size
__initial_sp
;
Heap
Configuration
;
Heap
Size
(in
Bytes)
;
Heap_Size
EQU
0x00000800
AREA
HEAP,
NOINIT,
READWRITE,
__heap_base
2.堆和栈空间分配
栈:向低地址扩展
堆:向高地址扩展
栈:存函数的临时变量,即局部变量,函数返回时随时有可能被其他函数栈用。所以栈是一种分时轮流使用的存储区,编译器里定义的Stack_Size,是为了限定函数的局部数据活动的范围,操过这么范围有可以跑飞,也就是栈溢出;Stack_Size不影响Hex,更不影响Hex怎么运行的,只是在Debug调试时会提示错。有的人写单片机代码在函数里定义一个大数组
int
buf[8192],栈要是小于8192是会死的很惨。
堆:存的是全局变量,这变量理论上是所有函数都可以访问的,全局变量有的有初始值,但这个值不是存在RAM里的,是存在Hex里,下载到Flash里,上电由代码(编译器生成的汇编代码)搬到RAM去的。使用了malloc时分配情况:
STM32内存分配规律:
从0x20000000开始依次为:静态存储区+堆区+栈区
未使用malloc时分配情况
从0x20000000开始依次为:静态存储区+栈区
全局变量(静态变量)->堆区->栈区。

使用特权

评论回复
沙发
uytyu| | 2023-6-7 13:00 | 只看该作者
在STM32芯片中,堆栈的大小是可以配置的

使用特权

评论回复
板凳
uptown| | 2023-6-8 22:59 | 只看该作者
需要正确地设置堆栈指针,以确保堆栈的读写操作能够顺利进行。

使用特权

评论回复
地板
Undshing| | 2023-6-9 23:44 | 只看该作者
uytyu 发表于 2023-6-7 13:00
在STM32芯片中,堆栈的大小是可以配置的

堆栈大小怎么调节啊?在启动文件里吗?

使用特权

评论回复
5
rosemoore| | 2023-6-10 17:40 | 只看该作者
STM32中的堆栈区是位于CM3内核中吗?其堆栈去多大?

使用特权

评论回复
6
AloneKaven| | 2023-6-10 23:06 | 只看该作者
堆栈在哪里定义的?

使用特权

评论回复
7
uytyu| | 2023-6-13 21:55 | 只看该作者
通常需要根据实际应用需求进行设置和调整。

使用特权

评论回复
8
loutin| | 2023-6-13 22:26 | 只看该作者
在使用堆栈时需要了解相关的寄存器和操作方法,并结合实际应用场景进行相应的设置和调试。

使用特权

评论回复
9
Stahan| | 2023-6-13 22:47 | 只看该作者
堆栈大小如何设置啊?

使用特权

评论回复
10
uptown| | 2023-6-14 11:32 | 只看该作者
根据实际应用需求,设置合适的堆栈大小,以避免堆栈溢出或者空间浪费等问题。

使用特权

评论回复
11
pmp| | 2023-6-14 15:47 | 只看该作者
stm32定义全局变量与堆栈有关吗

使用特权

评论回复
12
burgessmaggie| | 2023-6-14 18:31 | 只看该作者
stm32中的堆栈地址在哪里定义的

使用特权

评论回复
13
deliahouse887| | 2023-6-14 19:34 | 只看该作者
堆栈采用“后进先出”的原则,即最后入栈的数据最先出栈,可以有效地保护程序现场和避免数据冲突等问题。

使用特权

评论回复
14
MessageRing| | 2023-6-14 22:29 | 只看该作者
AloneKaven 发表于 2023-6-10 23:06
堆栈在哪里定义的?

MDK的启动文件开始,有一段汇编代码是分配堆栈大小的。

使用特权

评论回复
15
wwppd| | 2023-6-15 22:28 | 只看该作者
stm32怎么判断使用堆栈大小              

使用特权

评论回复
16
51xlf| | 2023-6-19 08:45 | 只看该作者
堆栈溢出,怎么办               

使用特权

评论回复
17
pmp| | 2023-6-19 09:41 | 只看该作者
stm32 怎么实现外部ram加载

使用特权

评论回复
18
uptown| | 2023-6-19 11:25 | 只看该作者
堆栈是一种用于管理函数调用、参数传递和局部变量等的重要机制。

使用特权

评论回复
19
olivem55arlowe| | 2023-6-19 12:29 | 只看该作者
可以通过编译器和调试工具等手段,对堆栈进行优化和调试,提高系统性能和稳定性。

使用特权

评论回复
20
uytyu| | 2023-6-19 14:41 | 只看该作者
stm32 如何查看堆栈是否溢出

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

153

主题

1075

帖子

3

粉丝