c - Microchip XC32 编译器,malloc 调用返回 0,写入指针抛出未实现的 RAM

标签 c embedded malloc microcontroller pic

我在 MPLAB 上编码,使用 XC32 编译器,并试图掌握使用动态内存的窍门,所以我创建了一个基本示例程序:

#include <stdlib.h>
#include <plib.h>

char x;
char y;



char main(void)
{
    Nop();
    char *pLocation = (char *)malloc(16);
    if(pLocation == 0x00)
    {
        return 0;
    }

    for(x = 0;x<=7;x++)
    {
        *pLocation = x;
        pLocation++;

    }
    while(1)
    {

        Nop();
    }
}

问题:

  • 当指针到达 malloc 调用行时,pLocation 的值被强制设置为 0x00,这意味着它无法从堆中向我传递指针信息.
  • 当指针将 x 的值分配给指针 pLocation 的位置时,我得到一个Bus Exception未实现的 RAM 内存访问。我怀疑这是因为我试图写入 0x00。

我在代码中做错了什么吗?

附加信息:

  • 我已经分配了一个 16 字节的堆。
  • 对于大小为 2 的内存请求,我得到同样的错误。
  • 我正在使用 MPLAB SIM 调试器。
  • MPLAB 版本 8.87.00.00。
  • 使用 XC32 编译器构建。

最佳答案

I have already assigned a heap of 16

堆空间不足以支持 16 字节的分配。堆管理需要一定量的空间,并且每次分配都将保证通常为 8 字节的对齐,以确保 64 位数据类型的对齐。

你应该分配比必要更多的堆,当然超过 16 字节 - 为此你也可以使用堆栈或静态分配。

通常你会想要将所有未用于其他目的(堆栈空间、静态、DMA 池等)的可用内存分配给堆,因为否则它将不会被使用(你可能允许一点空间,以便在维护小对静态分配的更改不需要您更改堆大小);但是您可以简单地通过将堆分配增加到 1024 字节来检验我的假设。如果您没有那么多可用资源,那么您的系统可能根本不适合支持堆。

关于c - Microchip XC32 编译器,malloc 调用返回 0,写入指针抛出未实现的 RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14257256/

相关文章:

objective-c - 如何检查一个 NSInteger 是否大于另一个 NSInteger?

c - Linux 的 kbhit()[和 getch()] 问题

c++ - 嵌入式系统的工厂方法模式

c - 在 C 中使用 free()

c - 释放 malloc 内存失败

c - 使用动态数组时增加内存

c - 注意: expected ‘struct filler’ but argument is of type ‘struct Info’

c - 将 Unix time_t 转换为任意时区/从任意时区转换的最佳方法?

C++实时策略模式处理不同数据

c++ - 更有效地在微 Controller 上对 C++ 进行基准测试