iamhuhuhu
驱动牛犊
驱动牛犊
  • 注册日期2003-04-17
  • 最后登录2003-12-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1105回复:4

pci设计问题“oxffffffff”请教

楼主#
更多 发布于:2003-11-28 21:34
请教高手:在基于PCI的接口设计中,对某些内存地址的读为什么在一些机上读出的数据完全正确,
而在有的机上读出老是0xffffffff?(当把驱动程序卸载重装后的第一次读,结果往往
是对的!!),怎么回事,高手能不能帮着分析一下大概是什么问题?更有可能是硬件
还是软件?一般在什么情况下会读出0xffffffff,有什么特别的意义吗?谢谢
sheifoor2
驱动牛犊
驱动牛犊
  • 注册日期2003-10-15
  • 最后登录2003-12-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-11-28 23:47
可以考虑中断的管理,oxffffffff是默认值,一般是没有发生数据交换,我曾经在在ISR里面的中断关闭中断inta,然后在DPC处理数据并使能inta,则结果就正确了。
   我在广州,你在哪里呢?







人家说男人三十一朵花,让我们用收获的成就感来灌溉,让其盛开……

20年后又是一条好汉
iamhuhuhu
驱动牛犊
驱动牛犊
  • 注册日期2003-04-17
  • 最后登录2003-12-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-29 00:52
这里没有中断,只是对内存地址的读。“oxffffffff是默认值,一般是没有发生数据交换”?但为什么“当把驱动程序卸载重装后的第一次读,结果往往是对的”而且在有几台机子上一直都能读对?

我在西安,谢谢你,sheifoor2
sheifoor2
驱动牛犊
驱动牛犊
  • 注册日期2003-10-15
  • 最后登录2003-12-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-11-29 00:59
这种情况我想应该是你进行了合理的非法操作

   你是怎么访问内存的?使用什么样的内存?是你自己开辟的内存缓冲区吗?
20年后又是一条好汉
iamhuhuhu
驱动牛犊
驱动牛犊
  • 注册日期2003-04-17
  • 最后登录2003-12-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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]
游客

返回顶部