阅读:1609回复:7
请教pc104上的ram读写问题
大家好,pc104上的ram(厂家提供地址:d800:0~fff)读写,分别使用了Transbusaddrtovirtual,virtualalloc&Virtualcopy ,但是总读不出正确的数据,大家请帮帮忙!
|
|
沙发#
发布于:2005-03-14 09:01
这块内存物理地址范围d8000-d8fff,使用Transbusaddrtovirtual或virtualalloc&Virtualcopy 应该可以啊
|
|
|
板凳#
发布于: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(\"正确!\")); } } |
|
地板#
发布于:2005-03-15 09:29
痛苦啊!快来帮帮我吧!
|
|
地下室#
发布于:2005-03-16 10:05
这里,256L的位置应该是0xfff吧? (2)
这里应该是VirtualCopy((LPVOID)pMyVm, (LPVOID)phyAddress>>8, cbSize,PAGE_READWRITE|PAGE_NOCACHE|PAGE_PHYSICAL); |
|
|
5楼#
发布于:2005-03-16 15:51
但是第二种方式为什么不行呢?第二种startaddress改为d8000,物理地址也除256试了,就是不行
|
|
6楼#
发布于:2005-03-17 15:33
不要着急。我觉得目前首先你要确定内存的物理地址是否正确?然后再进行下一步。
|
|
|
7楼#
发布于:2005-03-17 16:11
我已经在dos下测试过了,证明地址是正确的。通过专用软件写入后debug下读出的数据是完全吻合的。
|
|