【发布时间】:2016-08-25 13:24:16
【问题描述】:
我正在处理来自北欧的特定 embedded device。数据表显示 32 位 Cortex M0 上有 256kB 的闪存和 16kB 的 RAM。话虽如此,我的主要问题是考虑到物理 RAM 限制的堆栈/堆大小。我找到了关于 RAM/ROM 管理及其相关用法的文档here,但是仍然不清楚堆栈大小是如何计算的。例如, 我找到了一个程序集配置(arm_startup.s),它将最大堆栈/堆大小设置为 2048 字节。
IF :DEF: __STACK_SIZE
Stack_Size EQU __STACK_SIZE
ELSE
Stack_Size EQU 2048
ENDIF
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
IF :DEF: __HEAP_SIZE
Heap_Size EQU __HEAP_SIZE
ELSE
Heap_Size EQU 2048
ENDIF
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
作为 main 中的测试,我特意设置了 void *x = malloc(2064) 导致堆栈溢出,以证明 2048 字节得到兑现。我的问题是,如果你只能有 16kB 的 RAM,你怎么能将 2048 字节分配给堆栈和堆。经过一番搜索,我最终找到了 Cortex M0 文档。我找不到任何这样的限制,但我可能再次从错误的角度看待这个问题。鉴于上面的程序集 sn-p,它似乎在某个地方,无论是在硬件还是软件中,总虚拟 RAM 大小为 4096,分为堆栈和堆两部分。
【问题讨论】: