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
相关推荐
憧憬一下23 分钟前
搭建stm32工程
stm32·单片机·嵌入式
模拟IC攻城狮1 小时前
(最新)华为 2026 届校招实习-硬件技术工程师-硬件通用/单板开发—机试题—(共14套)(每套四十题)
单片机·嵌入式硬件·华为·硬件架构·电源·模拟芯片
如愿小李1 小时前
基于STM32的室内环境监测系统
stm32·单片机·嵌入式硬件
爱学习的颖颖2 小时前
stm32| 中断标志位和中断挂起位 | TIM_ClearFlag 函数和TIM_ClearITPendingBit 函数
stm32
睡觉然后上课2 小时前
FPGA(现场可编程门阵列)笔记
笔记·嵌入式硬件·fpga开发
森旺电子3 小时前
STM32的BootLoader 从SD卡更新固件
stm32·bootloader
XINVRY-FPGA3 小时前
赛灵思 XC7K325T-2FFG900I FPGA Xilinx Kintex‑7
人工智能·嵌入式硬件·ai·fpga开发·fpga·pcb工艺·zynq
双叶8364 小时前
(51单片机)LCD显示温度(DS18B20教程)(LCD1602教程)(延时函数教程)(单总线教程)
c语言·开发语言·单片机·嵌入式硬件·mongodb·51单片机·nosql
czhaii4 小时前
STC定时器频率占空比程序
单片机·嵌入式硬件
XWXnb64 小时前
GPIO(通用输入输出端口)详细介绍
stm32·单片机·嵌入式硬件