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

Unable to allocate memory on an embedded device

我知道不鼓励在嵌入式环境中使用 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  

这些是指针值的手表windows,在调试执行开始时。

执行到位于上述代码段末尾后的断点后。

使用调试器单步执行时,在 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 将具有非零值,而其他指针将为空值,如下表所示。

像下面这样的测试代码,将导致它为指针赋值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

虽然我对 pointers/memory 相关的东西并不陌生,但它确实经常让我大吃一惊。我猜我从根本上误解了内存是如何分配(或不分配)的,或者调试器和手表如何 windows 更新指针值。

感谢您的帮助。

如果使用 Keil ARM-MDK 中提供的项目模板,分配的堆大小通常相当小。您需要为您的应用程序适当地设置它的大小。

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

下面的示例(与您的部分不同,因此参数可能不同但至少会存在堆栈和堆):