打印
[经验分享]

单片机堆栈说明与全局变量和局部变量的存储位置

[复制链接]
2744|68
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
alvpeg|  楼主 | 2024-9-26 14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
全局变量存储在静态区。

局部变量,以及形参,返回值等存储在栈中,由编译器自动分配和释放。

动态申请的内存,如malloc函数或new函数申请的存储与堆中。

程序代码下载存储在FLASH中,一些常量也存在这里。

单片机“系统堆、栈”分配

在FreeRTOS开发时,需要为每个任务分配一定的内存,作为“任务桟”,用来保存各个任务切换时的上下文环境。这里的“任务桟”并不是上述的“系统栈”,这段内存实际上可能位于静态区(静态分配的内存)或者堆中(动态分配的内存)。

FreeRTOS共支持6种内存管理方法(内存分配与释放方法),在STM32CubeMX软件生成的Keil工程中默认使用heap_4c.c文件定义的方法,这个方法实际上就是定义了一个大的数组(静态全局变量,存储在静态区),任务桟的内存都是从这个大数组中分出去的。另一种方法heap_3c.c文件定义的方法是使用malloc函数从堆中分配出内存(动态分配)。此处所说的堆即为图一、图二中的heap_size。需要注意的是,动态分配的内存大小一定不能超过了图一中设置的堆大小,否则申请失败。

使用特权

评论回复
沙发
alvpeg|  楼主 | 2024-10-3 08:08 | 只看该作者
堆栈通过一个称为栈指针(SP)的寄存器来管理。栈指针指向当前栈顶的位置。当数据被压入(push)堆栈时,栈指针减小;当数据从堆栈弹出(pop)时,栈指针增大。

使用特权

评论回复
板凳
jimmhu| | 2024-10-3 09:11 | 只看该作者
单片机中的堆栈是一种后进先出(LIFO)的数据结构,主要用于函数调用时保存返回地址、局部变量及寄存器内容。堆栈的使用确保了函数调用的嵌套执行和正确返回。

使用特权

评论回复
地板
bartonalfred| | 2024-10-3 09:33 | 只看该作者
在单片机开发中,堆栈(Stack)和全局变量、局部变量的存储位置是理解程序内存布局的重要部分。

使用特权

评论回复
5
hearstnorman323| | 2024-10-3 09:52 | 只看该作者
在实际应用中,程序员通常不需要直接管理堆栈,因为编译器会自动处理函数调用时的堆栈操作。

使用特权

评论回复
6
saservice| | 2024-10-3 10:54 | 只看该作者
局部变量通常存储在堆栈中。
当函数被调用时,系统会在堆栈上为该函数分配一块内存区域,用于存储其局部变量。
函数执行完毕后,这块内存区域会被自动释放回堆栈。

使用特权

评论回复
7
sdCAD| | 2024-10-3 13:53 | 只看该作者
局部变量的作用域仅限于定义它们的函数内部,这使得它们的使用更加安全和可控。局部变量在函数调用结束后自动释放内存,不会像全局变量那样一直占用内存空间。

使用特权

评论回复
8
dspmana| | 2024-10-3 14:34 | 只看该作者
全局变量通常存储在静态存储区,也就是ROM(只读存储器)中的数据区(但需注意,有的观点认为全局变量存储在RAM的静态区,而非ROM,这取决于具体的单片机架构和编程环境)。在单片机中,ROM通常用于存储程序代码和一些常量数据,而全局变量作为程序的一部分,在程序运行时需要被访问和修改,因此存储在RAM中更为合理。不过,由于ROM也可以包含一部分用于保存数据的区域(如EEPROM),且这部分数据在程序运行期间不会被擦除,所以全局变量也有可能被存储在ROM的这部分区域中。

使用特权

评论回复
9
beacherblack| | 2024-10-3 14:54 | 只看该作者
全局变量:静态存储区或数据段。
局部变量:堆栈。
动态分配的内存:堆。

使用特权

评论回复
10
ccook11| | 2024-10-3 15:17 | 只看该作者
堆栈是一种特殊的内存区域,用于存储临时数据,如函数调用时的返回地址、局部变量和寄存器内容。
它遵循后进先出(LIFO)的原则。

使用特权

评论回复
11
geraldbetty| | 2024-10-3 19:34 | 只看该作者
局部变量只能在定义它们的函数内部访问。
局部变量的生命周期仅限于函数的执行期间。

使用特权

评论回复
12
averyleigh| | 2024-10-3 20:39 | 只看该作者
堆栈的大小通常是固定的,或者在程序启动时进行配置。
函数调用时会将返回地址和参数压入堆栈,函数执行完毕后,会从堆栈中弹出返回地址以返回到调用点。
局部变量在函数调用期间被分配到堆栈上,当函数返回时,这些变量占用的空间将被释放。

使用特权

评论回复
13
xiaoyaodz| | 2024-10-3 21:00 | 只看该作者
在单片机的执行过程中,堆栈主要用于保存函数调用时的局部变量、函数参数、返回地址以及中断服务程序的上下文信息。

使用特权

评论回复
14
daichaodai| | 2024-10-4 10:10 | 只看该作者
了解堆栈的机制,对程序底层运行机理才更容易理解。

使用特权

评论回复
15
jkl21| | 2024-10-4 16:04 | 只看该作者
在一些 8 位单片机中,堆栈可能位于内部 RAM 的高地址区域;而在一些 32 位单片机中,可以通过配置寄存器来指定堆栈的起始地址和大小。

使用特权

评论回复
16
sesefadou| | 2024-10-4 18:48 | 只看该作者
堆是动态分配内存的区域,通常用于malloc、calloc、realloc等函数分配的内存。
堆的管理比较复杂,需要手动分配和释放内存,否则可能导致内存泄漏。

使用特权

评论回复
17
earlmax| | 2024-10-4 19:57 | 只看该作者
具体来说,在一些单片机中,全局变量可能存储在内部 Flash 存储器(如果支持在 Flash 中存储变量)、内部 RAM 的特定区域或者外部扩展存储器中。

使用特权

评论回复
18
ingramward| | 2024-10-4 20:42 | 只看该作者
堆栈的大小是有限的,通常在单片机启动时进行初始化设置。如果在程序运行过程中,堆栈的使用超过了其预设的大小,就会发生堆栈溢出,这可能导致程序崩溃或出现不可预测的行为。

使用特权

评论回复
19
loutin| | 2024-10-4 21:02 | 只看该作者
堆栈通常位于单片机的RAM中。
对于具有固定堆栈指针的单片机,堆栈通常从RAM的顶部开始向下增长(递减堆栈)。
对于具有可变堆栈指针的单片机,堆栈可以配置在RAM中的任何位置。

使用特权

评论回复
20
sanfuzi| | 2024-10-4 21:23 | 只看该作者
局部变量存储在堆栈中。
当函数被调用时,编译器会在堆栈上为该函数分配一块内存,用于存储该函数的局部变量、参数和返回地址等信息。
当函数返回时,这块内存会被自动释放,堆栈指针恢复到原始位置。

使用特权

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

本版积分规则

31

主题

1469

帖子

0

粉丝