USB HOST驱动中的内存分配

文章描述了一个USBHUB上的设备接入问题,特别是当多个设备同时连接时出现的内存分配失败情况。通过调整CPhysMem构造函数中的内存设置解决了这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面遇到过一个问题, USB HUB上只能接入有限的设备, 情况描述为:

HUB上接入两个U盘,后插入的会失败于建立第二个端偶的PIPE, Debug Message显示为

-CphysMem AllocateMemory: No memory available
-TDQueue: TDQueue - no memory for TD List
-CBulkPipe::OpenPipe - no memory for TD

问题位于 driver\ohcd2\Transfer.cpp   line 298  TDQueue::QueueInit().  再进一步, hcd\common\cphysmem.cpp的函数FindFreeBlock在while循环中失败

详细记录表面现象为:
BOT + CBIT   OK
BOT + BOT   OK
BOT + BOT + MOUSE  OK
BOT + BOT + MOUSE + KBD   KBD失败
BOT + CBIT + MOUSE  MOUSE失败
CBIT + CBIT   后面一个CBIT失败

很明显是内存分配出问题了, 我在新闻组上征求意见, Bruce Eitman (eMVP) 答复如下:
CPhysMem manages a pool of memory for use within the USB Host driver, Allocations from that pool can fail if there simply isn't enough memory to allocate or if it is fragmented. You can set the amount of memory available by changing the amout requested in calls to it's constructor

里面提到了constructor, 我查到usb host 初次调用CPhysMem时, 几种内存情况为:
Total Alloc Region size = 64K
Special Alloc REgion size = 4K
HighPri Alloc Region size = 16K
Normal Alloc Region size = 44K
调用路线:
SOhcdPdd::InitializeOHCI (bul_ohci.cpp)  ->  HcdMdd_CreateMemoryObject (Hcddriv.cpp)

所以修改点在bul_ohci.cpp开头的两个全局变量上
gc_TotalAvailablePhysicalMemory
gcHighPriorityPhysicalMemory

修改后问题果然解决. 使用时故意看了一下各种USB设备占用的内存量:
Logitech MOU :  4928 byte
CBIT U盘  :  20736 byte
BOT U盘:  14944 byte
Delux USB KBD:  7776 byte


本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2006/02/05/325606.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值