This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM623: 关于0x9CC00000~0x9D8FFFFF内存使用问题

Part Number: AM623

请问0x9CC00000~0x9D8FFFFF这部分内存如果不在linker.cmd配置的话M核会使用到他吗?目前出现的问题是我按如下配置了这部分内存,如果M核不运行FreeRTOS,我可以使用指针直接访问这部分物理内存,可直接赋值,但是如果运行了FreeRTOS,使用指针访问该物理地址并赋值则没有效果,然后使用静态分配p1 = 0x9CC00000;  p = (uint32_t*)realloc(p1,128);的方式无论有没有按照下图去配置程序都会跑死,所以想请问这部分内存是预留出来的还是系统加载会被加载进去的

  • 1.你在linker.cmd配置了内存,这部分内存应该在编译链接过程中被分配

    运行了FreeRTOS,使用指针访问该物理地址并赋值则没有效果,然后使用静态分配

    2.在freertos时,直接用指针访问内存时,你应该遵循freertos提供的内存管理Api,而不是绕过它。

    比如您可以使用‘pvPortMalloc’和‘vPortFree’这些函数进行内存的动态分配和释放

    静态分配p1 = 0x9CC00000;  p = (uint32_t*)realloc(p1,128

    3.‘Realloc’通常是用于重新分配先前由‘malloc’、‘calloc’或‘realloc’分配的内存。直接对静态分配的内存用‘realloc’并不是推荐的做法,因为静态分配的内存通常是在编译时确定的,而不是在运行时动态分配的。

    如果您需要动态分配内存,应该用‘malloc’和‘free’,而不是‘realloc

  • 你在linker.cmd配置了内存,这部分内存应该在编译链接过程中被分配

    如果没有在linker.cmd配置这部分内存,也没办法通过指针去访问,请问你这边有没有什么建议可以静态分配这部分内存的吗?目前需要用这部分内存与A核直接做交互

  • 可以使用 malloc:

    uint32_t* your_memory_region;
    
    int main(void)
    {
    // 在运行时分配内存
    your_memory_region = (uint32_t*)malloc(SIZE * sizeof(uint32_t));
    
    if (your_memory_region == NULL)
    {
    // 处理内存分配失败情况
    return -1;
    }
    
    // 使用 your_memory_region 进行操作
    // ...
    
    // 在不需要内存时释放它
    free(your_memory_region);
    
    return 0;
    }

  • 你好,malloc没办法去指定物理内存,所以之前才没有考虑这个方案,请问有什么办法可以不让FreeRTOS不去分配这部分内存吗

  • 请问有什么办法可以不让FreeRTOS不去分配这部分内存吗

    个人为您总结了两点方法

    1. 配置`configTOTAL_HEAP_SIZE`:尝试找到`configTOTAL_HEAP_SIZE`宏定义,这定义了FreeRTOS的堆大小。并且尝试将`configTOTAL_HEAP_SIZE`设置得足够小,以便FreeRTOS不会占用到你保留给其他用途的内存范围。

    #define configTOTAL_HEAP_SIZE ((size_t)(your_desired_heap_size))

    2. 使用内存池:可以通过配置`configUSE_MALLOC_FAILED_HOOK`和`vApplicationMallocFailedHook`来捕获内存分配失败的情况,以便在运行时进行调试。
    还考虑使用FreeRTOS的动态分配函数(如`pvPortMalloc`和`vPortFree`)来自定义内存分配器

    #define configUSE_MALLOC_FAILED_HOOK 1

    void vApplicationMallocFailedHook(void)
    {
    // Handle memory allocation failure
    // This function will be called if a call to pvPortMalloc() fails
    }

  • 不客气~我将关闭此贴,新的问题烦请重新起贴