stm32c语言全局变量清0,STM32堆栈溢出问题

在STM32F103C8T6与MDK5环境下,遇到函数调用后程序跑飞的问题,经分析发现是由于栈溢出导致全局变量被清零。通过.map文件和Startup.s了解堆栈分配,发现堆栈空间用于局部变量、函数调用和动态内存分配。堆栈溢出可能导致堆和全局变量的破坏。解决方案包括减少大型局部变量和动态内存分配,以及在SRAM允许的情况下增加堆栈大小。在MDK5中,可通过修改Startup.s文件的Stack_Size和Heap_Size设置堆栈大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过map文件了解堆栈分配(STM32、MDK5)--避免堆栈溢出

环境:STM32F103C8T6,MDK5

在最近的一个项目的开发中,每当调用到一个函数,程序就直接跑飞。debug跟进去看不出什么逻辑错误,但发现函数内局部变量声明之后,全局变量的值被清零,后来查看局部变量地址已经超出栈的范围,于是确定是栈溢出。如果不稍微了解一下堆栈,在开发过程中可能碰到各种奇怪的错误。

.map和startup.s文件

MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。

在MDK5中,在项目中双击Target就能自动打开.map文件。

9411d7a4f36aa504985f3f6fdb578dd4.png

Startup.s文件是系统的启动文件,主要包括堆和栈的初始化配置、中断向量表的配置以及将程序引导到main( )函数等。

Startup.s主要完成三个工作:栈和堆的初始化、定位中断向量表、调用Reset Handler。

堆栈作用

栈(stack)空间,用亍局部变量,函数调时现场保护和返回地址,函数的形参等。

堆(heap)空间,主要用亍劢态内存分配,也就是说用 malloc,calloc, realloc 等函数分配的变量空间是在堆上。

堆栈在内存分布

在map文件中搜索STACK或者HEAP,在接近文件底部的位置可以看到SRAM的分配,如下图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值