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
相关推荐
lingzhilab1 小时前
零知IDE——STM32F407VET6与ADS1115模数转换器实现多通道数据采集显示系统
stm32·单片机·开源
xxy.c4 小时前
基于IMX6ULL的时钟,定时器(EPIT,GPT)
单片机·嵌入式硬件·fpga开发
happygrilclh5 小时前
stm32L496 flash 分配
stm32·单片机·嵌入式硬件
古译汉书6 小时前
嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
数据结构·笔记·stm32·单片机·嵌入式硬件·个人开发
自由的好好干活7 小时前
从0开始使用LabVIEW操作数据采集卡-概述和新建新建项目
嵌入式硬件·labview
一枚码农~9 小时前
STM32红外与LED控制实战
单片机·嵌入式硬件
Heavy sea9 小时前
STM32定时器(寄存器与HAL库实现)
stm32·单片机
路过羊圈的狼11 小时前
STM32的HAL库驱动ADS124S08进行PT100温度采集
stm32·嵌入式硬件·mongodb
李永奉12 小时前
51单片机-实现红外遥控模块教程
单片机·嵌入式硬件·51单片机
辛集电子13 小时前
【STM32】位带操作
stm32·单片机·嵌入式硬件