4903|14

86

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

USBDeviceAttach中LocalAlloc 异常 Device.exe [复制链接]

ce 5.0 USB驱动
USBDeviceAttach函数中使用LocalAlloc(LPTR,sizeof(struct pointer))
我现在的问题是:驱动在加载时,通常会在LocalAlloc处冒异常,不一定在哪个地方(不一定是哪一次调用),但基本上在连续两次调用LocalAlloc处(或前或后)。偶尔,会顺利的加载驱动。
我的理解是:在Device.exe的64K空间中分配内存给Drivers,可能由于我的板子上驱动比较多,分配在Device.exe堆空间中的内存也接近与64K(我用的NK是厂商给的,自己做的没法ActiveSync),所以我在分配时就出现异常:
信息如下:
ENDPOINT WILL be saved!
Pipe will be saved!
Data Abort: Thread=83d334a8 Proc=82126340 'device.exe'
AKY=00000005 PC=03fc3c18(coredll.dll+0x00053c18) RA=01b316f4(mbf_dll.dll+0x000016f4) BVA=06000004 FSR=00000007
Exception walking device interfaces

说明:前两句,对应的是LocalAlloc的提示保存两种结构体。之后就异常了(PC=03fc3c18(coredll.dll+0x00053c18)
请问:我的理解有没有可能,这样就只能从NK中去掉一些驱动了,还是有别的原因,请各位帮忙看一下

最新回复

这个问题在我重新做了一遍内核,删除了Device.exe下一些不必要的驱动和组件(winsock.ipv6....)之后,问题就没再出现。 谢谢,OneOnce,你帮我纠正了LocalAlloc(LPTR,sizeof(struct)),我原先用的是sizeof(struct pointer),当时没理解对。这个帖结了,新帖有关于IssueVendorTransfer控制传输的问题,望您继续关注  详情 回复 发表于 2009-12-12 00:11
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
LocalAlloc(LPTR,sizeof(struct pointer))????

pUSBD = (struct指针类型)LocalAlloc(LPTR, sizeof(struct));
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
mbf_dll.dll?? 這是哪一個驅動??

Paul, Chao @ Techware
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 paul_chao 的回复:
mbf_dll.dll?? 這是哪一個驅動??

Paul, Chao @ Techware


我的Device是MBF200,MBF_DLL.DLL是要加载的驱动
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 1 楼 oneonce 的回复:
LocalAlloc(LPTR,sizeof(struct pointer))????

pUSBD = (struct指针类型)LocalAlloc(LPTR, sizeof(struct));

试过了,
pPDD->lpEndPoint = (PUSB_ENDPOINT_DESCRIPTOR)LocalAlloc(LPTR,
sizeof(USB_ENDPOINT_DESCRIPTOR));
还是一样
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

6
 
还真没遇到过这种情况。如果LocalAlloc分配不到足够的内存应该是会返回NULL的,也许你在使用前需要判断一下LocalAlloc的返值,再一个你的pPDD有没有可能也是NULL,再对它的成员变量进行赋值就会有0xc0000005错误了
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 visualthinking 的回复:
试过了,
pPDD->lpEndPoint = (PUSB_ENDPOINT_DESCRIPTOR)LocalAlloc(LPTR,
sizeof(USB_ENDPOINT_DESCRIPTOR));
还是一样


完全是错误操作,你是要对pPDD进行申请内存的,你对pPDD结构没有弄清楚,再研究一下吧。我一开始也卡在这个结构体上。
pPDD = (pPDD类型的指针)LocalAlloc(LPTR, sizeof(pPDD类型));
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

8
 
pPDD开始都没有申请内存就开始使用了,不异常都奇怪了,
而且你最好在usbFuncs->lpGetDeviceInfo之后才申请内存,要不然读什么描述否都是空谈。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 oneonce 的回复:
pPDD开始都没有申请内存就开始使用了,不异常都奇怪了,
而且你最好在usbFuncs->lpGetDeviceInfo之后才申请内存,要不然读什么描述否都是空谈。

//创建设备上下文       
        PDEVICECONTEXT pPDD = (PDEVICECONTEXT)LocalAlloc(LPTR,sizeof(DEVICECONTEXT));
                if(pPDD==0)
                {
                        RETAILMSG(1, (TEXT("Not enough memory!\r\n")));
                        SetLastError (ERROR_NOT_ENOUGH_MEMORY);
                        return FALSE;
                }
这是我第一次调用LocalAlloc的地方,在异常位置的前面.
这次LocalAlloc之后,又给pPDD的成员付了值,才开始给Pipe和EndPoint分配内存.
但是这次LocalAlloc没有错,到后面LocalAlloc时才出错
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 7 楼 oneonce 的回复:
pPDD开始都没有申请内存就开始使用了,不异常都奇怪了,
而且你最好在usbFuncs->lpGetDeviceInfo之后才申请内存,要不然读什么描述否都是空谈。

lpGetDeviceInfo(hDevice)那是在USBDeviceAttach开始的地方就调用了,要不然我怎么可能找到EndPoint
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 8 楼 visualthinking 的回复:
引用 7 楼 oneonce 的回复:
pPDD开始都没有申请内存就开始使用了,不异常都奇怪了,
而且你最好在usbFuncs->lpGetDeviceInfo之后才申请内存,要不然读什么描述否都是空谈。

//创建设备上下文
PDEVICECONTEXT pPDD = (PDEVICECONTEXT)LocalAlloc(LPTR,sizeof(DEVICECONTEXT));
if(pPDD==0)
{
RETAILMSG(1, (TEXT("Not enough memory!\r\n")));
SetLastError (ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
这是我第一次调用LocalAlloc的地方,在异常位置的前面.
这次LocalAlloc之后,又给pPDD的成员付了值,才开始给Pipe和EndPoint分配内存.
但是这次LocalAlloc没有错,到后面LocalAlloc时才出错



EndPoint是pPDD里面的成员,不用再申请内存了。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
嘿嘿,我说怎么这么奇怪呢。就是说lpEndPoint成员变量是结构而非结构指针?只是这命名容易让人误解
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

13
 
关注,看看高手们是怎么解决的,学习
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 13 楼 oneonce 的回复:
下面是我的USB驱动:

接口描述如(一个USB可能有多个接口,所以会有pUSBD->bCurrentInterfaceIdx)
pInterface = &(pUSBD->lpDeviceInfo->lpActiveConfig->lpInterfaces[pUSBD->bCurrentInterfaceIdx]);

端点描述符(一个接口下面可能有多个端点,所以会有j表示那个接口,k表示那个端点)
pEndpoint = pUSBD->lpDeviceInfo->lpActiveConfig->lpInterfaces+j)->lpEndpoints+k

主要是看你是不是对USB描述符和这个结构体理解的问题。

我的设备没那么复杂,就是两个EndPoint,
epDesc = pUSBD->lpDeviceInfo->lpActiveConfig->lpInterfaces->lpEndPoint[0];
epDesc = pUSBD->lpDeviceInfo->lpActiveConfig->lpInterfaces->lpEndPoint[1];
而且我用不到第二个端点,只有第一个来Bulk传输。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

15
 
这个问题在我重新做了一遍内核,删除了Device.exe下一些不必要的驱动和组件(winsock.ipv6....)之后,问题就没再出现。
谢谢,OneOnce,你帮我纠正了LocalAlloc(LPTR,sizeof(struct)),我原先用的是sizeof(struct pointer),当时没理解对。这个帖结了,新帖有关于IssueVendorTransfer控制传输的问题,望您继续关注
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表