栈和堆,以STM32为例说明

本文介绍了变量的存储类型(静态和动态)、栈和堆的区别,重点讲解了栈如何存放局部变量和函数参数,以及堆用于动态内存分配的机制。同时提到了STM32开发中涉及的相关资源文件和库。

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

请添加图片描述


1. 前言

我们先温习一下变量的基础知识,啥是全局变量,啥是局部变量,这里就不赘述了。
变量的存储方式有:静态存储和动态存储。
静态存储方式:指在程序运行期间由系统分配固定的存储空间方式。
动态存储方式:在程序运行期间根据需要进行动态的分配存储空间方式。
全局变量存储在静态存储区中;动态存储区可以存放函数形式参数、局部变量、函数调用时的现场保护和返回地址等。


2. 栈

栈主要用于存放局部变量,函数形参等,属于编译器自动分配和释放的内存,栈的大小不能超过内部 SRAM 的大小。

3. 堆


堆主要用于动态内存的分配,像 malloc()、calloc()和 realloc()等函数申请的内存就在堆上面。堆中的内存一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。


参考

【1】正点原子,STM32 启动文件浅析.pdf
【2】正点原子,MAP 文件浅析.pdf
【3】[野火]STM32 HAL库开发实战指南

<think>好的,用户想了解STM32大小的设置方法默认值。首先我需要回忆一下STM32的启动流程相关文件。记得在STM32的项目中,启动文件(startup_stm32f10x_xx.s)负责初始化指针,的大小通常是在这个汇编文件里定义的。根据引用[2],startup_stm32f10x_hd.s文件会设置指针,说明配置是在启动代码中进行的。 接下来,的大小默认值是多少呢?不同的系列可能有所不同,比如F1系列可能默认是0x200,是0x400,而H7系列可能更大。用户可能使用的是某个特定型号,但如果没有具体型号,应该给出常见的默认值作为子。 然后,设置的方法主要有两种:修改启动文件中的定义或者通过IDE(如Keil、IAR)的配置界面调整。需要详细说明这两种方法的步骤,比如在启动文件中找到Stack_SizeHeap_Size,并修改EQU的值。同时,要提醒用户注意溢出,可能需要调整大小,特别是在使用大量局部变量或递归时。 还要考虑用户可能的误区,比如混淆的概念。用于动态内存分配,用于局部变量函数调用。如果用户设置的太小,程序可能会崩溃,这时候需要根据应用需求调整。如,引用[3]提到SRAM的不同区域,但通常是在启动时分配在特定的RAM区域,可能SRAM1有关,不过具体地址可能由链接脚本决定。 另外,需要提到调试方法,比如通过查看map文件确认的实际分配情况,或者使用调试工具监测的使用量。这样用户在实际项目中可以更好地优化设置。 最后,生成相关问题时要围绕设置、溢出处理、不同型号的差异、动态内存分配等方面,帮助用户扩展知识。</think>### STM32大小设置与默认值分析 #### 1. 的默认设置位置 在STM32项目中,大小通过**启动文件**(如`startup_stm32f10x_hd.s`)定义。该文件包含以下关键定义: ```assembly Stack_Size EQU 0x400 ; 默认大小:1KB Heap_Size EQU 0x200 ; 默认大小:512B ``` 不同型号芯片的启动文件可能略有差异,如: - **F1系列**:默认1KB,默认512B - **H7系列**:默认1KB,默认512B(需根据应用调整)[^2] #### 2. 修改大小方法 **方法1:直接修改启动文件** 1. 打开对应型号的`.s`文件(如`startup_stm32f10x_hd.s`) 2. 定位`Stack_Size``Heap_Size`定义段 3. 修改`EQU`后的数值(16进制): ```assembly Stack_Size EQU 0x800 ; 修改为2KB Heap_Size EQU 0x400 ; 修改为1KB ``` **方法2:通过IDE配置(以Keil为)** 1. 右键点击启动文件选择`Options for File` 2. 在`Memory Assignment`标签页修改: ``` IRAM1: 0x20000000 0x00010000 ; 根据芯片型号调整 ``` #### 3. 溢出风险判断 - **典型症状**:程序随机崩溃、HardFault异常 - **调试方法**: 1. 查看`.map`文件中的`__initial_sp``__heap_base` 2. 使用`__get_MSP()``__get_PSP()`函数实时监测 3. 填充魔数(如`0xDEADBEEF`)检测溢出 #### 4. 实际应用建议 | 应用场景 | 推荐大小 | 推荐大小 | |----------------|------------|------------| | 简单控制程序 | 1-2KB | 512B-1KB | | 带RTOS系统 | ≥4KB | ≥2KB | | 图形界面应用 | ≥8KB | ≥4KB | #### 5. 关键寄存器关联 指针初始化涉及以下寄存器操作(以Cortex-M3为): ```assembly LDR R0, =__initial_sp ; 加载顶地址到主指针(MSP) MSR MSP, R0 LDR R0, =__heap_base ; 初始化管理器 BL __rt_heap_initialize ``` 该过程在`startup_stm32f10x_hd.s`的`Reset_Handler`中实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值