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
相关推荐
弄曲幽篁1 小时前
精密全波整流电路(四)
嵌入式硬件·硬件工程
nuannuan2311a2 小时前
4N90-ASEMI电机控制专用4N90
单片机
邹诗钰-电子信息工程2 小时前
bmp280的压力数据采集(i2c设备驱动+设备树编写)
stm32·单片机·嵌入式硬件
Ronin-Lotus6 小时前
嵌入式硬件篇---有线串口通信问题解决
单片机·嵌入式硬件·ttl·rs232·rs485·有线串口
Ronin-Lotus7 小时前
嵌入式硬件篇---zigbee无线串口通信问题
嵌入式硬件·zigbee·无线串口
GalaxySinCos8 小时前
08 51单片机之串口通信
单片机·嵌入式硬件·51单片机
悠哉悠哉愿意8 小时前
【电赛学习笔记】MaxiCAM 项目实践——与单片机的串口通信
笔记·python·单片机·嵌入式硬件·学习·视觉检测
李某学编程10 小时前
Cortex-M内核SysTick定时器介绍
stm32·单片机
李永奉10 小时前
STM32-定时器的基本定时/计数功能实现配置教程(寄存器版)
c语言·开发语言·stm32·单片机·嵌入式硬件
糖糖单片机设计11 小时前
硬件开发_基于STM32单片机的电脑底座系统
stm32·单片机·嵌入式硬件·物联网·51单片机