嵌入式技术论坛
直播中

h1654155272.9717

8年用户 1261经验值
擅长:电源/新能源
私信 关注
[问答]

请问rt_system_heap_init可以放到SystemInit中执行吗?

有些全局变量初始化过程中会申请堆内存,但此时还没有进行rt_system_heap_init,就导致卡死在这里,可以将堆内存初始化移到SystemInit中执行吗,可能会有什么问题
问题复现方式,使用arm compiler 6

在.cpp文件中

#include
std::vector g_datas;

会发现执行SystemInit后初始化全局变量过程中,会调用rt-thread\components\libc\compilers\armlibc\syscall_mem.c中的malloc,进而调用rt_malloc,size是16
PS:虽说vector使用中会用到heap,但是默认初始化应该是不申请heap的,且我使用其他不申请HEAP的容器方案(比如 etl::vector<int,10> g_datas;)也会申请16字节heap,就很奇怪,也没能查到原因

void SystemInit(void)
{
/* FPU settings ------------------------------------------------------------/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10
2)|(3UL << 112)); / set CP10 and CP11 Full Access /
#endif
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
SystemInit_ExtMemCtl();
#endif /
DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM /
/
Configure the Vector Table location -------------------------------------/
#if defined(USER_VECT_TAB_ADDRESS)
SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /
Vector Table Relocation in Internal SRAM /
#endif /
USER_VECT_TAB_ADDRESS */
// 原本在rt_hw_board_init中
#if defined(RT_USING_HEAP)
rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);
#endif
}

回帖(2)

zhongnian

2023-8-20 11:29:51
全权有效管理所有全局变量
举报

听我讲

2023-10-11 11:37:59
rt_system_heap_init应该放在SystemInit之前执行,因为SystemInit中可能会使用堆内存,如果此时堆内存还没有初始化,就可能会出现问题。

另外,全局变量初始化过程中申请堆内存是不推荐的,因为此时RTOS还没有完全初始化完成,可能会出现一些不可预知的问题。建议在RTOS完全初始化完成后再进行堆内存的申请和使用。

至于您遇到的问题,可能是由于某些库函数在初始化过程中使用了堆内存,导致申请失败而卡死。您可以尝试将堆内存初始化放在SystemInit之前执行,看看是否能够解决问题。如果还有问题,可以尝试逐步排查或联系库函数的开发者进行咨询。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分