TI中文支持网
TI专业的中文技术问题搜集分享网站

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

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 1

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

,

bu yuying:

好的,谢谢

赞(0)
未经允许不得转载:TI中文支持网 » AM623: 关于0x9CC00000~0x9D8FFFFF内存使用问题
分享到: 更多 (0)