【问题标题】:How is virtual stack/heap size calculated given physical RAM constraints在给定物理 RAM 限制的情况下,如何计算虚拟堆栈/堆大小
【发布时间】: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,分为堆栈和堆两部分。

【问题讨论】:

  • 编程语言 C 和 C++ 的隐藏链接在哪里?
  • 呃,“2048kB”将是 2097152...
  • 你确定2048不代表2048字节吗?
  • 一般来说,您似乎对微控制器的各种存储区域有点困惑。请read this.
  • Here 解释了为什么堆在大多数嵌入式系统中甚至没有意义。

标签: memory embedded keil


【解决方案1】:

是否正在上一些编程课,为什么我们突然遇到相同或相关的问题?

如果您有 16KB 的内存,那么您的所有读/写信息都必须适合是吗?如果您不设置这些定义,那么该代码将产生 2K 的堆栈和 2K 的堆,因此 4K。 4K 小于 16K,因此您还有 12K 用于 .bss 和 .data。

堆在微控制器上毫无意义,通常确保您可以将一些作为书面库移植到 malloc 中,而您只是伪造它(但您确实必须“分配”基本上定义要使用多少,然后实现一个简单的 malloc)。但除了借用为更高级别平台编写的代码之外,您不想使用 malloc。

“分配”堆栈也没有多大意义,因为您如何管理您告诉编译器在每次推送之前检查某个数字?如果是这样,那么它取决于编译器,您必须为编译器提供所需的内容,并处理产生和消耗有限资源以及消耗有限带宽的时间的多余代码。改为进行系统工程,而不必在运行时进行。

cortex-m 与此无关,也与任何硬件无关。 2K + 2K

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多