Memory 在给定物理RAM约束的情况下,如何计算虚拟堆栈/堆大小

Memory 在给定物理RAM约束的情况下,如何计算虚拟堆栈/堆大小,memory,embedded,keil,Memory,Embedded,Keil,我正在研究一个来自北欧的特殊项目。数据表显示,32位Cortex M0上有256kB的闪存和16kB的RAM。话虽如此,我的主要问题是给定物理RAM约束的堆栈/堆大小。我找到了有关RAM/ROM管理及其相关用法的文档,但是仍然不清楚堆栈大小是如何计算的。例如 我找到了一个程序集配置(arm_startup.s),它将最大堆栈/堆大小设置为2048字节 IF :DEF: __STACK_SIZE Stack_Size EQU __STACK_SIZ

我正在研究一个来自北欧的特殊项目。数据表显示,32位Cortex M0上有256kB的闪存和16kB的RAM。话虽如此,我的主要问题是给定物理RAM约束的堆栈/堆大小。我找到了有关RAM/ROM管理及其相关用法的文档,但是仍然不清楚堆栈大小是如何计算的。例如 我找到了一个程序集配置(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文档。我找不到任何这样的限制,但我可能从错误的角度来看这一点。考虑到上面的汇编代码片段,无论是在硬件还是软件中,总的虚拟RAM大小都是4096,分为堆栈和堆两部分。

是否有一些编程类正在进行,为什么我们会突然遇到相同或相关的问题

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

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

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


cortex-m与此无关,也与硬件无关。2K+2K<16K。只是小学数学

> C语言和C++语言的隐藏链接在哪里?“2048 KB”将是2097152……你确定2048不意味着2048字节吗?一般来说,你似乎对微控制器的各种存储区域感到困惑。请这解释了为什么堆在大多数嵌入式系统中都没有意义。