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

mega_creamery

我知道不建议在嵌入式环境中使用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之后,我可以看到第一行将为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,如下表所示。

在此处输入图片说明

像下面的代码那样测试代码,将导致它为指针分配一个值,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编辑器可以识别的标记注释,因此当您打开文件时,编辑器窗口的底部将有两个选项卡-一个用于源代码,一个用于配置。您可以通过任一方式修改堆栈和堆的大小。

下面的示例(与您的部分不同,因此参数可能有所不同,但至少会出现堆栈和堆): 在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

嵌入式系统中的内存分配

嵌入式C中的动态内存分配

无法在Android设备上查看PDF(具有嵌入式SWF文件)

HTML5嵌入式视频无法在移动设备上加载

无法在使用Ubuntu 16.04的嵌入式设备上设置静态IP

在嵌入式设备上安装SSH服务器

嵌入式设备上的SSH无效密钥长度

如何在嵌入式Linux设备中对内存进行基准测试?

从嵌入式设备访问 bigquery API

替换嵌入式设备中的busybox

分配嵌入式Struct类型值

嵌入式iframe上的umap tilelayer未显示在移动设备上

如何在u-boot和内核映像损坏的嵌入式设备上恢复固件?

在嵌入式Linux设备(Beaglebone Black)上启动时启动QT应用程序

是否可以在嵌入式Linux设备(例如DSL路由器)上执行脚本?

在嵌入式设备上运行Linux内核所需的最低RAM数量是多少?

在嵌入式设备上运行脚本时未绑定的变量?

没有浏览器的嵌入式设备上的 MS Graph API 身份验证

将Bootstrap布局从嵌入式表单更改为移动设备上的网格

Java嵌入式应用程序-设备上需要什么

嵌入式设备上的 C++ 多级继承有问题吗?

如何通过嵌入式Linux设备上的重新引导使/ var / log持久化

嵌入式静态ram设备上使用什么文件系统?

如何在嵌入式设备上设置 FTP 客户端连接?

为什么嵌入式linux(yocto)无法使用rootfs分区的全部内存?

如何将数组指向嵌入式系统上的某些特定内存地址

带有嵌入式Mongo的Spring Boot:无法分配请求的地址:JVM_Bind

为什么无法将嵌入式ArrayList <Integer>分配给本地声明的ArrayList <Integer>?

无法使嵌入式BroadcastReceiver正常工作