阅读:1105回复:4
pci设计问题“oxffffffff”请教
请教高手:在基于PCI的接口设计中,对某些内存地址的读为什么在一些机上读出的数据完全正确,
而在有的机上读出老是0xffffffff?(当把驱动程序卸载重装后的第一次读,结果往往 是对的!!),怎么回事,高手能不能帮着分析一下大概是什么问题?更有可能是硬件 还是软件?一般在什么情况下会读出0xffffffff,有什么特别的意义吗?谢谢 |
|
沙发#
发布于:2003-11-28 23:47
可以考虑中断的管理,oxffffffff是默认值,一般是没有发生数据交换,我曾经在在ISR里面的中断关闭中断inta,然后在DPC处理数据并使能inta,则结果就正确了。
我在广州,你在哪里呢? 人家说男人三十一朵花,让我们用收获的成就感来灌溉,让其盛开…… |
|
|
板凳#
发布于:2003-11-29 00:52
这里没有中断,只是对内存地址的读。“oxffffffff是默认值,一般是没有发生数据交换”?但为什么“当把驱动程序卸载重装后的第一次读,结果往往是对的”而且在有几台机子上一直都能读对?
我在西安,谢谢你,sheifoor2 |
|
地板#
发布于:2003-11-29 00:59
这种情况我想应该是你进行了合理的非法操作
你是怎么访问内存的?使用什么样的内存?是你自己开辟的内存缓冲区吗? |
|
|
地下室#
发布于:2003-11-29 22:07
访问过程大概如下,bufOutput输出最后0xffffffff。
注IOCTL_hu_test是METHOD_BUFFERED方式.谢谢,交个朋友 好吗?我的qq:26902425 NTSTATUS Pci5030_109Device::DeviceControl(KIrp I) { switch (I.IoctlCode()) { ... case IOCTL_hu_test: status = IOCTL_hu_test_Handler(I); break; ... } } NTSTATUS Pci5030_109Device::IOCTL_hu_test_Handler(KIrp I) { NTSTATUS status = STATUS_SUCCESS; ULONG hu_test; //addr_test_ctrl_reg为偏移地址 hu_test=m_MemoryRange0.ind(addr_test_ctrl_reg); if(I.IoctlOutputBufferSize()>=sizeof(ULONG)) { *(ULONG*)I.IoctlBuffer()=hu_test; I.Information()=sizeof(ULONG); return STATUS_SUCCESS; } else { I.Information() = 0; return STATUS_BUFFER_TOO_SMALL; } I.Information() = 0; return status; } void Test_IOCTL_hu_test(void) { ULONG bufOutput; // Output from device ULONG nOutput;// Count written to bufOutput if (!DeviceIoControl(hDevice, IOCTL_hu_test, NULL, 0, &bufOutput, sizeof(ULONG), &nOutput, NULL) ) { printf(\"ERROR: DeviceIoControl returns %0x.\", GetLastError()); Exit(1); } printf(\"hutest is %lx:\\n \",bufOutput); } [编辑 - 11/29/03 by iamhuhuhu] |
|