无法在嵌入式设备上分配内存
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
执行此操作,而不会对 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 只是因为我在网上找到的 code for implementing circular buffer。
虽然我对 pointers/memory 相关的东西并不陌生,但它确实经常让我大吃一惊。我猜我从根本上误解了内存是如何分配(或不分配)的,或者调试器和手表如何 windows 更新指针值。
感谢您的帮助。
如果使用 Keil ARM-MDK 中提供的项目模板,分配的堆大小通常相当小。您需要为您的应用程序适当地设置它的大小。
您的项目将包含名为 startup_stm32xxxxx.s 的启动汇编程序代码(其中 xxxxx 是特定部件)。此文件包含 uVision 编辑器可识别的标记注释,因此当您打开文件时,编辑器 windows 将在底部有两个选项卡 - 一个用于源代码,一个用于配置。您可以通过其中任何一个来修改堆栈和堆的大小。
下面的示例(与您的部分不同,因此参数可能不同但至少会存在堆栈和堆):
我知道不鼓励在嵌入式环境中使用 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
执行此操作,而不会对 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 只是因为我在网上找到的 code for implementing circular buffer。
虽然我对 pointers/memory 相关的东西并不陌生,但它确实经常让我大吃一惊。我猜我从根本上误解了内存是如何分配(或不分配)的,或者调试器和手表如何 windows 更新指针值。
感谢您的帮助。
如果使用 Keil ARM-MDK 中提供的项目模板,分配的堆大小通常相当小。您需要为您的应用程序适当地设置它的大小。
您的项目将包含名为 startup_stm32xxxxx.s 的启动汇编程序代码(其中 xxxxx 是特定部件)。此文件包含 uVision 编辑器可识别的标记注释,因此当您打开文件时,编辑器 windows 将在底部有两个选项卡 - 一个用于源代码,一个用于配置。您可以通过其中任何一个来修改堆栈和堆的大小。
下面的示例(与您的部分不同,因此参数可能不同但至少会存在堆栈和堆):