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
相关推荐
23124_808 分钟前
【无标题】
单片机·嵌入式硬件
ytttr87324 分钟前
STM32 读写 SD 卡源码(SPI 模式 + FATFS 文件系统)
stm32·单片机·嵌入式硬件
Quinn2730 分钟前
正点原子 STM32MP257 修复异核 FreeRTOS+OpenAMP 例程里 SysTick 延时异常的问题
stm32·嵌入式硬件·正点原子·arm linux
Deitymoon33 分钟前
STM32——OLED显示图片
stm32·单片机·嵌入式硬件
深圳英康仕1 小时前
龙芯2K3000嵌入式工控机的技术拆解:算力、接口与国产系统适配
嵌入式硬件·工控机·工业计算机·国产工控机·龙芯2k3000
山木嵌入式1 小时前
STM32 UART串口通信协议与3种底层驱动实现(寄存器/标准库/HAL库)
stm32·单片机·串口·uart
Heartache boy1 小时前
野火STM32_HAL库版课程笔记-I2C介绍
笔记·stm32·单片机
Deitymoon1 小时前
STM32——OLED显示汉字
stm32·单片机·嵌入式硬件
狮驼岭的小钻风1 小时前
单片机启动流程与 .s 文件详解
单片机·嵌入式硬件
金色光环1 小时前
【DSP学习笔记】 F28335中断系统理解-基于普中DSP28335开发攻略
笔记·单片机·学习·dsp开发