硬汉嵌入式论坛

 找回密码
 立即注册
查看: 403|回复: 2
收起左侧

[功能实战] MDK启动文件堆栈空间手动指定地址方法和验证(2025-10-11)

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 2025-10-11 12:14:22 | 显示全部楼层 |阅读模式
【应用场景】

比如STM32H743/H750系列,他有多个RAM空间,这里我们将需要快速执行的堆栈空间分配到DTCM, 0x2000 0000,128KB容量末尾。程序主RAM分配到AXI SRAM, 0x2400 0000,512KB容量

234.png

【设置验证】

默认设置的情况下,堆栈空间是这样的,从地址0x240011C0开始,前1KB是heap,后面1KB是stack

为了方便看问题,我将堆栈都初始化为0x5A了。

234.png

1234.png

为了方便展示问题,我们这里设置STACK大小和HEAP大小都配置为1KB,并设置STACK到DTCM末尾的1KB,即如下配置:

[Asm] 纯文本查看 复制代码
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Stack_Size      EQU     0x00000400

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


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x0000400

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit


这个时候,可以看到,stack已经没有再占用AXI SRAM空间了

12345.png




回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2025-10-29 11:19:15 | 显示全部楼层
硬汉哥,我修改了栈到DTCM,然后工程正常运行到SEGGER的打印函数,发现打印浮点数的时候会打印错误
把然后我把栈从0x20001FFF改成0x20001FFF8就ok了
是不是和8字节对齐有关系
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
 楼主| 发表于 2025-10-29 12:05:41 | 显示全部楼层
chaos_ 发表于 2025-10-29 11:19
硬汉哥,我修改了栈到DTCM,然后工程正常运行到SEGGER的打印函数,发现打印浮点数的时候会打印错误
把然后 ...

设置为0x20001FFF8是不合理的。根本原因应该不是这个。

CM内核栈空间是向下生长的满栈,SP要设置到末尾,设置为0x20001FFF,那么申请一个栈空间就是占用的
0x2001FFFC 0x2001FFFD 0x2001FFFE 0x2001FFFF ,首地址是4字节对齐的,同样申请8字节也可以保证8字节对齐。

而设置为0x20001FFF8,那么申请4字节占用的就是0x20001FFF5 0x20001FFF6 0x20001FFF7 0x20001FFF8 这样是无法4字节对齐的。同样8字节也无法对齐。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-11-21 20:52 , Processed in 0.045298 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表