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

C 无法在嵌入式设备上分配内存,c,pointers,memory,stm32,keil,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 = ma

我知道不鼓励在嵌入式环境中使用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  
这些是调试执行开始时指针值的监视窗口

执行后,返回位于上述代码段结束后的断点

在使用调试器时,在
malloc
行之后,我可以看到第一行将为
缓冲区
指针分配地址。它将只对
缓冲区执行此操作,而不会对
buffer1
buffer2
执行此操作

如以下代码所示,更改内存分配顺序时,这是正确的:

    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只是因为我在网上找到了这个

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


感谢您的帮助。

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

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

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

一些嵌入式系统没有任何可工作的
malloc
。允许
malloc
失败,然后返回
NULL
malloc在出现错误时返回NULL指针。你确定你有足够的内存吗?如何为您的设备指定malloc?我怀疑您的环境中是否有适当的
malloc
实现和/或为堆分配了空间。@Govind Parmar这听起来像是使用SWD做的事情,我认为我无法使用MCU所在的板访问它。您确保在调试时禁用了所有优化?