STM32 局部数组使用过大溢出到全局影响代码运行

一、问题

       在函数内定义局部数组大小为400,发现其影响了串口接收中断。

二、原因

        通过动态调试得知,其分配的局部数组地址与全局的串口结构体的空间部分重合造成了寄存器异常中断开启失败。出现此原因在于分配的栈不够造成局部数组溢出占用全局空间。如果需要则到startup_xxxxxxxx.s文件修改Stack_Size大小。默认分配为0x400即(1KBytes)。

三、SRAM介绍

      stm32l071cbtx的SRAM资源为20K,主要用来存放全局变量包括静态变量和堆栈资源。关系图如下:

    startup_xxxxxxxx.s文件默认定义的堆、栈大小为0x200、0x400,当超出定义大小时会溢出到全局、静态变量空间。

四、堆

   堆的使用主要是在于动态分配内存即 malloc申请的空间。

五、栈

    局部变量数组的使用分配的空间。

### STM32中最数组小限制 在嵌入式开发环境中,STM32系列微控制器的最数组小主要取决于以下几个因素: #### 1. **Flash 和 SRAM 的容量** STM32 微控制器的 Flash 存储器用于存放程序代码和常量数据,而 SRAM 则用于运行时变量、堆栈以及动态内存分配。因此,数组的实际小受限于可用的 SRAM 容量[^1]。 对于不同的 STM32 型号,SRAM 小可能有所不同。例如: - STM32F103C8T6 提供 20 KB 的 SRAM。 - STM32F407VGT6 提供高达 192 KB 的 SRAM。 如果尝试定义超过 SRAM 可用空间的全局或静态数组,则可能导致链接错误或运行时崩溃。 #### 2. **编译器与链接器设置** GCC 或 Keil MDK 等工具链通过链接脚本(Linker Script)来管理存储区域布局。默认情况下,未初始化的数据段 `.bss` 和已初始化的数据段 `.data` 都会占用 SRAM 资源。开发者可以通过调整 Linker Script 来优化这些分区的分布[^2]。 #### 3. **堆栈冲突风险** 当局部变量声明为自动类型并放置到函数调用帧上时,它们会被存放在当前线程的栈区内。过的本地数组可能会引发栈溢出问题,特别是多任务环境下各任务拥有独立的小型堆栈区的情况下更需注意这一点[^3]。 #### 动态内存分配方法 除了固定尺寸的静态数组外,在某些应用场景下也可以考虑采用动态方式创建变长缓冲区。这通常涉及 `malloc()` 函数族的应用;不过需要注意的是,频繁申请释放碎片化操作容易造成长期稳定性隐患,尤其是在资源紧张的小型设备里应谨慎对待此类做法[^4]。 ```c // 示例:动态分配整数类型的数组 int* dynamicArray; dynamicArray = (int*) malloc(ARRAY_SIZE * sizeof(int)); if (!dynamicArray) { // 错误处理逻辑... } free(dynamicArray); ``` ### 结论 综上所述,具体能支持的最数组长度不仅要看所选型号自带了多少物理内存单元可供利用,还需综合考量实际项目需求下的其他消耗情况才能得出确切数值范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值