打印
[STM32F1]

STM32为什么有两个堆栈

[复制链接]
1267|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xxmmi|  楼主 | 2023-8-3 23:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先来说堆栈是什么

堆(Heap):堆可以理解为一块内存,用户代码使用内存时从这块内存中分配,比如malloc函数。对于单片机来说一般情况下没有动态分配内存能力,大多数情况下不使用堆,有些操作系统有自己的内存分配函数。

栈(Stack):当func1调用func2时,处理器要保存现场(入栈),这里主要是func1的局部变量压入栈中,func2执行完毕后,从栈中恢复现场(出栈),func1继续执行。同样道理从用户程序到中断服务程序也有入栈出栈操作。有一点要注意,函数调用层次越深,局部变量越多(静态局部变量不算),使用的栈就越多,因此要合理编写代码。STM32是cortex-m3内核芯片,此内核是先进后出,满递减栈,先进后出好理解,所谓满递减栈就是栈指针指的位置总是满的,入栈时栈指针先减一个位置(对于cortex-m3来说是4个字节),然后放入数据。

综上所述,堆用的比较少,栈用的很多,但是基本上都是处理器自己处理,编程者无需过多干预。另外我们通常所说的“堆栈”这个词一般指的是栈。

cortex-m3有两个栈,也就是说有两个栈指针,可以通过配置寄存器设置使用哪个栈。栈虽然有两个,但是同一时间只能用一个。

第一个栈:MSP主栈

CONTROL[1]=0时,只使用MSP,这时候用户程序和异常(handler)共享同一个MSP栈。为了便于理解,说的直白一点,用户程序和中断程序都使用MSP,数据都保存在同一个栈中。

第二个栈:PSP进程栈

CONTROL[1]=1时,MSP和PSP都使用。用户程序使用PSP,中断程序使用MSP,数据保存在不同的两个栈中。比如说程序正在顺序执行,突然产生一个中断,处理器把现场保存在PSP栈中,然后进入中断服务程序,中断服务程序中使用MSP栈,退出中断时从PSP还原现场,返回用户程序。

有人说了,编程好几年了,没觉得有俩栈呀?一般我们裸跑程序(不跑操作系统)的情况下,默认使用的是MSP,因为Cortex-M3内核的芯片上电后,寄存器CONTROL[1]默认是0,使用MSP,异常和用户程序,都用这一个栈。PSP根本就没用到,那位又说了,PSP什么时候用?搞过实时操作系统的朋友一般都知道这个PSP。操作系统为每个任务或者说线程分配了各自的栈,栈各用各的,互不干扰,线程栈用PSP,内核用MSP,把栈区分开更保险。

使用特权

评论回复
沙发
juliestephen| | 2023-8-7 08:33 | 只看该作者
堆栈 多大?               

使用特权

评论回复
板凳
primojones| | 2023-8-7 18:03 | 只看该作者
中断处理更加可靠和高效,避免了可能发生的堆栈溢出和数据覆盖问题。

使用特权

评论回复
地板
hilahope| | 2023-8-7 19:15 | 只看该作者
堆栈分开使用。这样可以确保中断处理不会干扰主堆栈上的代码执行,并最大程度地减少因堆栈溢出而导致的问题。

使用特权

评论回复
5
zerorobert| | 2023-8-7 21:11 | 只看该作者
通过使用两个堆栈,STM32可以有效地管理中断和异常处理

使用特权

评论回复
6
lihuami| | 2023-8-9 15:20 | 只看该作者
stm32的双堆栈是什么意思?  

使用特权

评论回复
7
kkzz| | 2023-8-9 21:02 | 只看该作者
STM32堆栈解读 堆是堆,栈是栈,都属于RAM,当内存不够时,要知道所定义数据存在哪里

使用特权

评论回复
8
belindagraham| | 2023-8-9 21:13 | 只看该作者
在未使用操作系统的情况,一般只用一个 MSP。

使用特权

评论回复
9
minzisc| | 2023-8-9 21:24 | 只看该作者
分析.map文件, 堆和栈               

使用特权

评论回复
10
sheflynn| | 2023-8-9 22:49 | 只看该作者
这种设计可以提高系统的可靠性和稳定性。

使用特权

评论回复
11
Stahan| | 2023-8-11 23:44 | 只看该作者
是为了中断使用方便吗?

使用特权

评论回复
12
MessageRing| | 2023-8-12 23:52 | 只看该作者
好像是为了避免栈溢出和数据覆盖的吧

使用特权

评论回复
13
macpherson| | 2023-8-13 21:48 | 只看该作者
默认堆栈,用于处理中断和异常。

使用特权

评论回复
14
youtome| | 2023-8-14 10:09 | 只看该作者
STM32单片机闪存存储器里存储的是哪些内容?

使用特权

评论回复
15
jackcat| | 2023-8-14 12:18 | 只看该作者
STM32单片机能够有效地处理多个中断和异常情况。

使用特权

评论回复
16
geraldbetty| | 2023-8-14 14:18 | 只看该作者
MSP主堆栈,用于中断异常处理服务 Psp线程堆栈,用于线程任务

使用特权

评论回复
17
jackcat| | 2023-8-14 16:05 | 只看该作者
STM32 物理上有两个栈,一个是 PSP,一个是 MSP  

使用特权

评论回复
18
wwppd| | 2023-8-14 16:37 | 只看该作者
data和bss比较好理解就是一些全局变量。堆和栈的空间可以由我们来自由设定

使用特权

评论回复
19
ulystronglll| | 2023-8-14 18:46 | 只看该作者
STM32单片机中有两个堆栈的设计是为了支持不同的运行模式和中断处理。

使用特权

评论回复
20
maudlu| | 2023-8-14 20:37 | 只看该作者
保系统在这些情况下的稳定性和可靠性。

使用特权

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

本版积分规则

369

主题

4278

帖子

2

粉丝