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

时间:2019-03-12 15:32:42

标签: c pointers memory stm32 keil

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

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

谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

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

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