STM32 栈地址起始位置不正确

STM32 栈地址起始位置不正确

背景

使用STM32F103C8T6开发,运行经常异常,一些变量内存被意外修改,也就是踩内存了,分析发现是栈溢出导致。

问题分析

stm32 ram内数据分布正常应该如下

c 复制代码
RAM布局(地址从低到高):
+-------------------+ 0x20000000
| .data             | → 已初始化变量(从Flash复制)
+-------------------+
| .bss              | → 未初始化变量(启动时清零)
+-------------------+
| Heap (动态内存)    | → 向上增长
|                   |
+-------------------+
| ... (空闲区域)     |
+-------------------+
| Stack             | → 向下增长
+-------------------+ 0x20005000(假设RAM结束地址)

startup_stm32f10x_md.s配置的栈地址配置:

c 复制代码
Stack_Size      EQU     0x00000800

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

STM32F103C8T6的RAM空间是20KB,正常栈位置应该是:
0x20004800~0x20005000

可是编译得到的.map文件显示:
0x20000e18 - 0x00000800 Zero RW 5601 STACK startup_stm32f10x_md.o

栈的位置居然是0x20000e18,足足浪费了后面14K空间~

修改

指定栈区域

c 复制代码
Stack_Size      EQU     0x00000800
ADDR_STACK_TOP  EQU     0x20005000
; 0x20004800 = ADDR_STACK_TOP - Stack_Size
                AREA |.ARM.__AT_0x20004800|, DATA, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

编译后得到.map

复制代码
0x20004800        -       0x00000800   Zero   RW         5601    .ARM.__AT_0x20004800  startup_stm32f10x_md.o
相关推荐
芯岭技术2 小时前
Wi-Fi+BLE双模无线芯片 BK7238,低功耗、高性能,集成MCU和Flash
单片机·嵌入式硬件
云空2 小时前
《ARM Cortex‑M 系列完整梳理》
stm32·单片机·嵌入式硬件·mcu
Dr.kangder3 小时前
嵌入式处理器仿真技术——Hypervisor 原理与实践
服务器·嵌入式硬件·架构·嵌入式
Hello_Damon_Nikola5 小时前
TM1637芯片从入门到精通
单片机·嵌入式硬件
智购科技自动售卖机厂家9 小时前
从STM32到RK3588——自动售货机嵌入式主控方案的架构演进~YH
stm32·嵌入式硬件·物联网·架构·lua·零售·symfony
振南的单片机世界10 小时前
2MHz/50MHz玄机:GPIO速度档选错,信号直接“烂尾”
arm开发·stm32·单片机·嵌入式硬件
Run_Teenage10 小时前
嵌入式:理解STM32文档和社区生态,工具链的选择与安装
stm32·单片机·嵌入式硬件
ACP广源盛1392462567310 小时前
DeepSeek‑V4‑Flash 公测@ACP#昇腾 950 国产算力组合落地,国产 PCIe 交换芯片 IX9104 有哪些硬件机会
大数据·数据库·人工智能·分布式·单片机·嵌入式硬件·microsoft
铅笔小新z10 小时前
【stm32】RCC 与时钟树
stm32·单片机·嵌入式硬件
时空自由民.11 小时前
STM32 IIC HAL库,LL库
stm32·单片机·嵌入式硬件