无法在嵌入式设备上分配内存

问题描述 投票:1回答:1

我知道在嵌入式环境中使用malloc是不鼓励的,但我发现了与我需要使用它的相关的例子,它对我来说很好。

这是代码,我发现它的执行有点令人困惑:

    uint8_t * buffer;  // pointer to buffer                           
    uint8_t * buffer1; // pointer to buffer1 
    uint8_t * buffer2; // pointer to buffer2 

    buffer  = malloc(400 * sizeof(uint8_t));    // size of buffer
    buffer1 = malloc(400 * sizeof(uint8_t));    // size of buffer1
    buffer2 = malloc(400 * sizeof(uint8_t));    // size of buffer2  

这些是在调试执行开始时指针值的监视窗口。

enter image description here

执行到上面代码片段结束后的断点后。

enter image description here

当逐步使用调试器时,在malloc行之后,我可以看到第一行将为buffer指针分配地址。它只会对buffer这样做,而不是buffer1buffer2

在更改内存分配顺序时也是如此,如下面的代码所示:

    uint8_t * buffer;  // pointer to buffer                           
    uint8_t * buffer1; // pointer to buffer1 
    uint8_t * buffer2; // pointer to buffer2 

    buffer1 = malloc(400 * sizeof(uint8_t));    // size of buffer
    buffer  = malloc(400 * sizeof(uint8_t));    // size of buffer1
    buffer2 = malloc(400 * sizeof(uint8_t));    // size of buffer2  

在这种情况下,指针buffer1将具有非零值,而其他指针将为null,如下面的手表中所示。

enter image description here

测试代码如下所示,将导致它为指针buffer1分配一个值,当再次为它分配内存时,它会再次将其设置为零。

    uint8_t * buffer;  // pointer to buffer
    uint8_t * buffer1; // pointer to buffer1 
    uint8_t * buffer2; // pointer to buffer2 

    buffer1 = malloc(400 * sizeof(uint8_t));    // size of buffer1
    buffer  = malloc(400 * sizeof(uint8_t));    // size of buffer
    buffer1 = malloc(400 * sizeof(uint8_t));    // size of buffer1  

当初始化具有其中一个缓冲区的结构时,当对空指针值执行assert()时,代码将在线下崩溃。

我使用malloc开始只是因为我在网上发现的这个code for implementing circular buffer

虽然我对指针/内存相关的东西并不陌生,但它确实让我感到惊讶。我猜测我基本上误解了内存是如何分配的,或者是调试器和监视窗口如何更新指针值。

谢谢您的帮助。

c pointers memory stm32 keil
1个回答
1
投票

如果在Keil ARM-MDK中使用提供的项目模板,则分配的堆大小通常很小。您需要根据应用程序适当设置其大小。

您的项目将包含名为startup_stm32xxxxx.s的启动汇编程序代码(其中xxxxx是特定于部分的)。此文件包含uVision编辑器可识别的标记注释,因此当您打开文件时,编辑器窗口底部会有两个选项卡 - 一个用于源,另一个用于配置。您可以通过其中任何一个修改堆栈和堆大小。

下面的示例(对于与您不同的部分,因此参数可能不同,但至少会出现堆栈和堆):enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.