gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:12:23 25 4
gpt4 key购买 nike

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

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

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 将具有非零值,而其他指针将为空,如下表所示。

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我在网上找到的。

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

感谢您的帮助。

最佳答案

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

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

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

关于c - 无法在嵌入式设备上分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55125301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com