给定物理RAM约束如何计算虚拟堆栈/堆大小

时间:2016-08-25 13:24:17

标签: memory embedded keil

我正在为北欧的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文档。我找不到任何这样的约束,但是我可能会从错误的角度看待这个。鉴于上面的程序集片段,无论是硬件还是软件,它都会出现在某个地方,总虚拟RAM大小为4096,分为堆栈和堆栈两个。

1 个答案:

答案 0 :(得分:0)

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

如果您有16KB的ram,那么您的所有读/写信息都必须符合?如果你没有设置那些定义,那么该代码产生2K的堆栈和2K的堆,所以4K。 4K小于16K所以你有12K左右的.bss和.data。

Heap在微控制器上没有任何意义,通常可以确定你可以将一些作为mallocs的书面库移植而你只是伪造它(但你必须"分配"基本上定义使用多少然后实现一个简单的malloc)。但除了说借用为更高级别平台编写的代码之外,你不想使用malloc。

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

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