【问题现象】
初始化BOOT任务过程中发生FAULT故障。
初始化BOOT任务过程中发生FAULT故障。
【定位过程】
任务创建结束进入CORE_SetError设置错误码判断 Current Task 指针不为空:
STATIC E_STATUS SetTaskError(E_STATUS emCode)
{
LPTASK_CONTEXT lpCurrentContext = GetCurrentTaskContext();
if (NULL != lpCurrentContext)
{
SetContextTaskError(lpCurrentContext, emCode);
return STATE_SUCCESS;
}
SetSystemGlobalError(emCode);
return STATE_INVALID_TASK;
}
单步调试得到g_CurrentContext全局变量内存地址为0x20000248(R2+0x8 为 g_CurrentContext 指针,R2=0x20000240):
查看内存,发现0x20000248此时值为 0x00000100,即R1的值
复位并重新单步跟踪发现初始化对象管理器后,g_CurrentContext 值发生变化。
【问题原因】
初始化CONTAINER时循环下标使用CONFIG_CORE_POOL_MAX 和 CONFIG_POOL_BLOCK_MAX导致踩内存:
【解决方案】
函数 CORE_CreatePoolContainer 提供了参数Pools(容器支持的POOL数量)和BlockPrePool(每个POOL的块数量),用于处理不同的容器配置,应当针对不同的配置进行初始化:
SetFreeBitmapMask2Container(lpManager, GetBitsMaskValue(Pools));
for (; Pid < Pools; Pid ++)
{
LPCORE_POOL lpCorePool = GetPoolForID(lpManager, Pid);
SetPoolMagic(lpCorePool, POOL_INITIALIZE_MAGIC);
SetPoolTotalBlocks(lpCorePool, BlockPrePool);
SetPoolRemainBlocks(lpCorePool, BlockPrePool);
SetPoolBlockLength(lpCorePool, BytePreBlock);
SetFreeBitmapMask2Pool(lpCorePool, GetBitsMaskValue(BlockPrePool));