STM32堆栈大小及位置

STM32堆栈配置

STM32的地址空间映射:


首先STM32的堆栈是存放在片上静态SRAM中的,地址分配可以见Keil的编译map文件:

HEAP  0x200106f8  Section  512  startup_stm32f2xx.o(HEAP) 
STACK  0x200108f8  Section  1024  startup_stm32f2xx.o(STACK)

__heap_base  0x200106f8  Data  0  startup_stm32f2xx.o(HEAP) 
__heap_limit  0x200108f8  Data  0  startup_stm32f2xx.o(HEAP) 
__initial_sp  0x20010cf8  Data  0  startup_stm32f2xx.o(STACK)


上面节选中, __heap_base 是堆的基地址,__initial_sp  是栈指针 。示意图如下:



堆和栈的大小在启动文件startup_stm32f2xx.s中设置:

Stack_Size  EQU  0x00000400


AREA  STACK, NOINIT, READWRITE, ALIGN=3 
Stack_Mem  SPACE  Stack_Size 
__initial_sp


; Heap Configuration 
;  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> 


Heap_Size  EQU  0x00000200


AREA  HEAP, NOINIT, READWRITE, ALIGN=3 
__heap_base


注意:

堆和栈,一般堆是由低地址往上增长,栈是由往下减少。都是连续的,C语言不提供内存保护机制类似的功能,如果一直堆一直增长,栈一直申请,然后就会导致栈溢出,程序崩溃。

### 如何在 Keil 5 中配置栈空间 在嵌入式开发环境中,尤其是使用 ARM Cortex-M 系列微控制器时,堆栈空间的合理分配对于程序运行至关重要。以下是关于如何在 Keil 5 中配置栈空间的相关说明。 #### 配置方法 在 Keil MDK (Microcontroller Development Kit) 工具链中,可以通过调整 scatter 文件(链接脚本)或者项目设置中的内存布局选项来定义栈空间大小。具体操作如下: 1. **通过 Scatter File 定义** 散布描述符文件(Scatter File 或 .sct 文件)用于指定目标设备上的存储器映射以及初始化数据的位置。可以在该文件中明确定义 Stack 和 Heap 的起始地址及其长度[^1]。 下面是一个典型的 Scatter 文件片段示例: ```plaintext LR_IROM1 0x08000000 0x00080000 { ; load region size_region ER_IROM1 0x08000000 0x00080000 { ; executable region *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00010000 { .ANY (+RW +ZI) } } /* 堆栈区域 */ Stack_Mem 0x2000FFFF 0x00000400 UNINIT ; 定义Stack位置大小 Heap_Mem 0x2000FF00 0x00000200 UNINIT ; 定义Heap位置大小 ``` 2. **通过 Project Options 设置** 如果不希望手动编辑 Scatter 文件,则可以直接利用 Keil 提供的图形化界面完成配置。进入 `Project -> Options for Target` 菜单,在 C/C++ 类别的 Configuration 字段下拉框选择合适的 Memory Layout 模板[^2]。之后可以进一步细化各部分的具体参数设定。 3. **基于硬件资源优化** 对于 STM32F103 这样的 CM3 内核 MCU 板级支持包通常已经预设了一些默认值,但开发者仍需依据实际应用场景灵活调整这些数值以满足需求[^4]。例如当应用程序涉及较多递归调用或是多线程环境下的任务调度时可能就需要增大相应的缓冲区容量以免溢出风险。 #### 示例代码展示 下面给出一段简单的 FreeRTOS 应用场景下的任务创建函数示范,并附带必要的注释以便理解其中涉及到的栈尺寸概念[^3]: ```c // 创建一个优先级为 tskIDLE_PRIORITY+2 的新任务 if( xTaskCreate( vTaskCode, // Task function. "TASK_NAME", // String with name of task. configMINIMAL_STACK_SIZE * 2, // Stack size in words, here doubled minimal requirement. NULL, // Parameter passed into task. tskIDLE_PRIORITY + 2,// Priority at which the task is created. &xHandle ) != pdPASS ) { // Failed to create task... } ``` #### 总结 综上所述,无论是借助散列表还是直接修改工程属性都可以实现对 Keil 平台下项目的堆栈管理控制目的;与此同时也要注意结合所使用的处理器架构特性做出适当考量从而达到最佳性能表现效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qlexcel

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

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

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

打赏作者

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

抵扣说明:

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

余额充值