Chinaunix首页 | 论坛 | 博客
  • 博客访问: 508195
  • 博文数量: 118
  • 博客积分: 2575
  • 博客等级: 大尉
  • 技术积分: 1263
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-27 09:37
文章分类

全部博文(118)

文章存档

2017年(11)

2016年(8)

2015年(1)

2014年(9)

2013年(7)

2012年(38)

2011年(14)

2010年(18)

2009年(12)

分类: 嵌入式

2011-12-02 11:02:28

在开发vxworks下的RTP应用时,发现使用spawnTask创建任务,前面几个能够成功,而到某个任务之后,再创建就不能成功了。经定位,发现是memEdr功能模块造成。

当启用memEDR功能之后,就会调用memEdrInit2函数,在这个函数里面,会增加用户态任务创建hook函数。对应到edr功能,就是memEdrTaskCreateHook。在这个函数里面
  1. LOCAL STATUS memEdrTaskCreateHook
  2.     (
  3.     int taskId                /* task ID */
  4.     )
  5.     {
  6. #ifdef _WRS_KERNEL
  7.     EDR_TCB_INFO * pTaskInfo = ((WIND_TCB *) taskId)->pEdrInfo;

  8.     /* if pEdrInfo is NULL, allot from stack */

  9.     if (pTaskInfo == NULL)
  10.     pTaskInfo = ((WIND_TCB *) taskId)->pEdrInfo =
  11.          taskStackAllot (taskId, sizeof (MEM_EDR_TASK));

  12.     /* if could not allot, we're in trouble */

  13.     if (pTaskInfo == NULL)
  14.     return (ERROR);

  15.     /* initialize memEdrLib fields only */

  16.     pTaskInfo->memEdrLocals = NULL;
  17.     pTaskInfo->memEdrCtrl = 0;

  18.     return (OK);
  19. #else
  20.     MEM_EDR_TASK * pTaskInfo = NULL;
  21.     TASK_DESC td;

  22.     if (taskInfoGet (taskId, &td) == ERROR)
  23.     return (ERROR);

  24.     /* get an item from pool */

  25.     MEM_EDR_LOCK ();

  26.     pTaskInfo = (MEM_EDR_TASK *) memEdrItemGet (memEdrDb.memEdrPoolId);

  27.     MEM_EDR_UNLOCK();

  28.     if (pTaskInfo == NULL)
  29.     {
  30.     memEdrErrorLog (MEM_EDR_WARNING, NULL, 0, NULL, 0, 0, NULL, NULL,
  31.             memEdrPoolErrMsg);

  32.     return (ERROR);
  33.     }

  34.     /* initialize root of locals tree */

  35.     pTaskInfo->locals = NULL;

  36.     pTaskInfo->pStackBase = td.td_pStackBase;
  37.     pTaskInfo->pStackEnd = td.td_pStackEnd;

  38.     /* set task info as TLS */

  39.     return (tlsValueOfTaskSet (taskId, memEdrTlsKey, (void *) pTaskInfo));
  40. #endif
  41.     }
从上面的带下划线的代码可以看出,需要使用内存池中的一块。而缺省的内存池的大小由宏MEDR_POOL_SIZE决定,这个值的缺省大小是0x100000,而每一块的大小由struct mem_edr_blk决定。所以当分完了之后,memEdrItemGet分不出内存的时候,创建任务也就失败了。

解决方法就是不使用这个组件,或者增加MEDR_POOL_SIZE的值。

阅读(3297) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~