Part Number:AM623
请问0x9CC00000~0x9D8FFFFF这部分内存如果不在linker.cmd配置的话M核会使用到他吗?目前出现的问题是我按如下配置了这部分内存,如果M核不运行FreeRTOS,我可以使用指针直接访问这部分物理内存,可直接赋值,但是如果运行了FreeRTOS,使用指针访问该物理地址并赋值则没有效果,然后使用静态分配p1 = 0x9CC00000; p = (uint32_t*)realloc(p1,128);的方式无论有没有按照下图去配置程序都会跑死,所以想请问这部分内存是预留出来的还是系统加载会被加载进去的
Gary Lu:
1.你在linker.cmd配置了内存,这部分内存应该在编译链接过程中被分配
bu yuying 说:运行了FreeRTOS,使用指针访问该物理地址并赋值则没有效果,然后使用静态分配
2.在freertos时,直接用指针访问内存时,你应该遵循freertos提供的内存管理Api,而不是绕过它。
比如您可以使用‘pvPortMalloc’和‘vPortFree’这些函数进行内存的动态分配和释放
bu yuying 说:静态分配p1 = 0x9CC00000; p = (uint32_t*)realloc(p1,128
3.‘Realloc’通常是用于重新分配先前由‘malloc’、‘calloc’或‘realloc’分配的内存。直接对静态分配的内存用‘realloc’并不是推荐的做法,因为静态分配的内存通常是在编译时确定的,而不是在运行时动态分配的。
如果您需要动态分配内存,应该用‘malloc’和‘free’,而不是‘realloc
,
bu yuying:
Gary Lu 说:你在linker.cmd配置了内存,这部分内存应该在编译链接过程中被分配
如果没有在linker.cmd配置这部分内存,也没办法通过指针去访问,请问你这边有没有什么建议可以静态分配这部分内存的吗?目前需要用这部分内存与A核直接做交互
,
Gary Lu:
可以使用 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; }
,
bu yuying:
你好,malloc没办法去指定物理内存,所以之前才没有考虑这个方案,请问有什么办法可以不让FreeRTOS不去分配这部分内存吗
,
Gary Lu:
bu yuying 说:请问有什么办法可以不让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 1void vApplicationMallocFailedHook(void) { // Handle memory allocation failure // This function will be called if a call to pvPortMalloc() fails }
,
bu yuying:
好的,谢谢