sdqdydj
驱动牛犊
驱动牛犊
  • 注册日期2005-03-12
  • 最后登录2005-12-07
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1609回复:7

请教pc104上的ram读写问题

楼主#
更多 发布于:2005-03-12 18:16
大家好,pc104上的ram(厂家提供地址:d800:0~fff)读写,分别使用了Transbusaddrtovirtual,virtualalloc&Virtualcopy ,但是总读不出正确的数据,大家请帮帮忙!
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-14 09:01
这块内存物理地址范围d8000-d8fff,使用Transbusaddrtovirtual或virtualalloc&Virtualcopy 应该可以啊
Come on, let us drive the world.
sdqdydj
驱动牛犊
驱动牛犊
  • 注册日期2005-03-12
  • 最后登录2005-12-07
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-14 13:33
简单的例子如下,但是读数据从没有成功

//失败!!!读出的数据错误(已经通过Dos方式验证)
void CTranslateBusDlg::OnButton1()
{
// TODO: Add your control notification handler code here
//int i ;  
BYTE data[0xfff];

    ULONG               HWAddress=0xd8000;
    ULONG               Size=0xfff;                ; //双口RAM大小
    ULONG               inIoSpace = 0;            //memory type 1=IO 0=Memory
    PHYSICAL_ADDRESS    PhysicalAddress = {HWAddress, 0 };
    PVOID               pVirtual;                    
if(TransBusAddrToVirtual(Isa,0,PhysicalAddress,256L,&inIoSpace,&pVirtual ))//&MemType,
{

//memcpy(data, pVirtual, 0xfff );//最初是以memcpy来读,但是硬件出错!

m_data=READ_PORT_ULONG((PULONG)pVirtual);
MessageBox(_T(\"读出成功\"));


}
UpdateData(FALSE);

    
}
//失败,读取的数据错误
void CVIRTUALCOPYDlg::OnButton1()
{
#define phyAddress 0xd8000000//写在程序头的,转到这边方便您查看
  
        PBYTE pByte;
//char Buffer[1024], *OutStr;
PVOID pMem;
int i=0;
LPVOID pMyVm; DWORD cbSize=0xFFF;
if(!(pMyVm=VirtualAlloc(0,cbSize,MEM_RESERVE,PAGE_READWRITE)))
{
AfxMessageBox(TEXT(\"错误!\"));
}
else
{
VirtualCopy((LPVOID)pMyVm, (LPVOID)phyAddress, cbSize,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
       pByte = (PBYTE)pMem;

{
m_edit2=*pByte;
}
UpdateData(FALSE);
VirtualFree((PVOID)pMyVm, 0, MEM_RELEASE);
pMyVm = NULL;
//MessageBox(_T(\"正确!\"));
}
}
sdqdydj
驱动牛犊
驱动牛犊
  • 注册日期2005-03-12
  • 最后登录2005-12-07
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-15 09:29
痛苦啊!快来帮帮我吧!
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-16 10:05

(1)
if(TransBusAddrToVirtual(Isa,0,PhysicalAddress,256L,&inIoSpace,&pVirtual ))//&MemType,

这里,256L的位置应该是0xfff吧?

(2)

#define phyAddress 0xd8000000
VirtualCopy((LPVOID)pMyVm, (LPVOID)phyAddress, cbSize,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);

这里应该是VirtualCopy((LPVOID)pMyVm, (LPVOID)phyAddress>>8, cbSize,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL);
Come on, let us drive the world.
sdqdydj
驱动牛犊
驱动牛犊
  • 注册日期2005-03-12
  • 最后登录2005-12-07
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-03-16 15:51
但是第二种方式为什么不行呢?第二种startaddress改为d8000,物理地址也除256试了,就是不行
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-03-17 15:33
不要着急。我觉得目前首先你要确定内存的物理地址是否正确?然后再进行下一步。
Come on, let us drive the world.
sdqdydj
驱动牛犊
驱动牛犊
  • 注册日期2005-03-12
  • 最后登录2005-12-07
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-03-17 16:11
我已经在dos下测试过了,证明地址是正确的。通过专用软件写入后debug下读出的数据是完全吻合的。
游客

返回顶部