在开发vxworks下的RTP应用时,发现使用spawnTask创建任务,前面几个能够成功,而到某个任务之后,再创建就不能成功了。经定位,发现是memEdr功能模块造成。
当启用memEDR功能之后,就会调用memEdrInit2函数,在这个函数里面,会增加用户态任务创建hook函数。对应到edr功能,就是memEdrTaskCreateHook。在这个函数里面
- LOCAL STATUS memEdrTaskCreateHook
-
(
-
int taskId /* task ID */
-
)
-
{
-
#ifdef _WRS_KERNEL
-
EDR_TCB_INFO * pTaskInfo = ((WIND_TCB *) taskId)->pEdrInfo;
-
-
/* if pEdrInfo is NULL, allot from stack */
-
-
if (pTaskInfo == NULL)
-
pTaskInfo = ((WIND_TCB *) taskId)->pEdrInfo =
-
taskStackAllot (taskId, sizeof (MEM_EDR_TASK));
-
-
/* if could not allot, we're in trouble */
-
-
if (pTaskInfo == NULL)
-
return (ERROR);
-
-
/* initialize memEdrLib fields only */
-
-
pTaskInfo->memEdrLocals = NULL;
-
pTaskInfo->memEdrCtrl = 0;
-
-
return (OK);
-
#else
-
MEM_EDR_TASK * pTaskInfo = NULL;
-
TASK_DESC td;
-
-
if (taskInfoGet (taskId, &td) == ERROR)
-
return (ERROR);
-
-
/* get an item from pool */
-
-
MEM_EDR_LOCK ();
-
-
pTaskInfo = (MEM_EDR_TASK *) memEdrItemGet (memEdrDb.memEdrPoolId);
-
-
MEM_EDR_UNLOCK();
-
-
if (pTaskInfo == NULL)
-
{
-
memEdrErrorLog (MEM_EDR_WARNING, NULL, 0, NULL, 0, 0, NULL, NULL,
-
memEdrPoolErrMsg);
-
-
return (ERROR);
-
}
-
-
/* initialize root of locals tree */
-
-
pTaskInfo->locals = NULL;
-
-
pTaskInfo->pStackBase = td.td_pStackBase;
-
pTaskInfo->pStackEnd = td.td_pStackEnd;
-
-
/* set task info as TLS */
-
-
return (tlsValueOfTaskSet (taskId, memEdrTlsKey, (void *) pTaskInfo));
-
#endif
-
}
从上面的带下划线的代码可以看出,需要使用内存池中的一块。而缺省的内存池的大小由宏MEDR_POOL_SIZE决定,这个值的缺省大小是0x100000,而每一块的大小由struct mem_edr_blk决定。所以当分完了之后,memEdrItemGet分不出内存的时候,创建任务也就失败了。
解决方法就是不使用这个组件,或者增加MEDR_POOL_SIZE的值。
阅读(3385) | 评论(0) | 转发(0) |