stm32启动文件流程

在看启动文件里的汇编代码时候有一些疑惑,这里记录一下。

Heap_Size     EQU     0x00000200          ; 定义堆大小为512字节

AREA    HEAP, NOINIT, READWRITE, ALIGN=3   ; 定义堆区域
__heap_base                                ; 堆的起始地址(符号)
Heap_Mem      SPACE   Heap_Size            ; 分配512字节的内存给堆
__heap_limit                               ; 堆的终止地址(符号)
  • Heap_Mem:这行代码通过 SPACE 指令分配了 512 字节的内存,这段内存的起始地址就是 Heap_Mem 的地址,表示堆的实际内存空间。

  • __heap_base:这个符号是在 Heap_Mem 之前定义的,它的值就是 Heap_Mem 的地址(即堆的起始地址)。

  • __heap_limit:这是在堆分配的空间之后定义的符号,指向堆的末尾,即 Heap_Mem + Heap_Size,用来表示堆的终止地址。

关键点:

  • __heap_baseHeap_Mem 都指向同一个内存地址,表示堆的起始地址。__heap_base 是一个符号名称,用来清晰地表示堆的起始位置,而 Heap_Mem 则是内存实际分配的位置。

  • __heap_limit 是堆的末尾,用于表示堆空间的最大边界。

_heap_baseHeap_Mem的具体区别:

1. __heap_base(符号)

  • 符号 是汇编中的标签,它用于表示某个内存地址,但不分配任何内存。
  • 在这个例子中,__heap_base 只是一个名称,用来表示堆的起始地址。
  • 当程序需要引用堆的起始地址时,它可以通过 __heap_base 这个符号来访问,而不用关心内存分配的具体细节。
  • 符号本身不占用内存,它只是一个方便的引用工具。

2. Heap_Mem(内存空间)

  • Heap_Mem 实际上是通过 SPACE 伪指令分配的一段内存空间。
  • 在汇编中,SPACE 伪指令会分配一段连续的内存区域,大小由 Heap_Size 指定。在上面代码中,Heap_Mem 分配了 0x200(512 字节)的内存。
  • Heap_Mem 代表的是堆的起始地址,它指向的是这段分配的内存区域。

为什么使用 __heap_base 而不是直接使用 Heap_Mem

  • __heap_base 是为了清晰和方便。程序中的不同模块或代码段可以通过引用 __heap_base 符号来获取堆的起始地址,而不必直接操作 Heap_Mem。这样做更具可读性,而且便于在不同的代码段中使用堆区域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值