阅读:1287回复:4
急地要命 地址绑定问题
现在做一个驱动,用I2C传输数据,但是I2C的物理地址却不能映射到虚拟空间,哪位大侠帮我看看
pI2CReg=NULL; bainit( I2C_REGS *pI2CReg ) { if(!(pI2CReg=(volatile I2C_REGS *)VirtualAllol(0,0x1000, MEM_RESERVE,PAGE_NOACCESS))) { RETAILMSG(1, (TEXT("VirtualAlloc() failed!\r\n")) ); } else { if(!VirtualCopy((PVOID)pI2CReg,(PVOID) I2C_BASE_U_VIRTUAL,0x1000,PAGE_READWRITE|PAGE_NOCACHE)) { VirtualFree((PVOID)pI2CReg, 0, MEM_RELEASE); pI2CReg = NULL; RETAILMSG(1, (TEXT("VirtualCopy() failed!\r\n")) ); } else { RETAILMSG(1, (TEXT("VirtualCopy() succeed!\r\n"))); } ......... } 文提出在什么地方??? |
|
沙发#
发布于:2004-09-14 18:40
你用的什么平台,如果是arm,使用virtualalloccopy函数试试看,而且你也没说出有什么问题啊
|
|
论坛版主
|
板凳#
发布于:2004-09-14 22:44
你是想在函数内映射然后返回后用I2C_REGS *pI2CReg来访问?如果是的话传进去的参数应该是I2C_REGS* *pI2CReg
赋值的时候用*pI2CReg = .....然后返回。 |
|
地板#
发布于:2004-09-15 11:14
问题解决了,用virtualallocCopy实现了
我用的是arm41,这有什么关系吗? wxl_50685330 说用到指针的指针 有这么复杂吗 我记得你在另外一个贴字上发的那个函数示例中也没有说用到指针的指针呀 发表于: 2004/9/10 - 05:52 PVOID MyVirtualMap(PVOID PhyMem, UINT32 size) { PVOID pVirtualAddr; pVirtualAddr = VirtualAlloc( 0, size, MEM_RESERVE, PAGE_NOACCESS ); if(pVirtualAddr == NULL) { RETAILMSG(1,(TEXT("MyVirtualMap : pVirtualAddr is not allocatednr"))); return NULL; } if( !VirtualCopy(pVirtualAddr, PhyMem, size, PAGE_READWRITE | PAGE_NOCACHE ) ) { RETAILMSG(1, (TEXT("MyVirtualMap : pVirtualAddr is not mappednr"))); VirtualFree((PVOID)pVirtualAddr, 0, MEM_RELEASE); return NULL; } return pVirtualAddr; } 用这个函数,把物理地址映射到徐虚拟地址,你给出你要映射的物理地址首址,和大小,返回一个可用的虚拟地址给你的驱动。 |
|
论坛版主
|
地下室#
发布于:2004-09-15 13:16
:)我是把指针作为返回值了
|
|