wince6.0内存管理-地址问题

wxswx1987 2010-07-18 02:22:15
PRIVATE volatile S3C2440A_MCX_REG * v_MCXPregs[color=#000000];//已定义了32字节的结构体[/color]
//地址匹配
v_MCXPregs = (volatile S3C2440A_MCX_REG *)VirtualAlloc(0, sizeof(S3C2440A_MCX_REG), MEM_RESERVE, PAGE_NOACCESS);
if (v_MCXPregs == NULL)
{
ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!\r\n")));
RetValue = FALSE;
}
else
{
if (!VirtualCopy((PVOID)v_MCXPregs, (PVOID)(0X18000000 >> 8), sizeof(S3C2440A_MCX_REG),

PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy failed!\r\n")));
RetValue = FALSE;
}
}

问题出现了:
RETAILMSG(1, (TEXT("Outpw::: SetWR2dizhi..set..%x\r\n"),v_MCXPregs)); //打印地址d3620000
RETAILMSG(1, (TEXT("Outpw::: SetWR2dizhis2440MCX+1..set..%x\r\n"),(DWORD*)(v_MCXPregs+1)));//打印地址d3620020
RETAILMSG(1, (TEXT("Outpw::: SetWR2dizhis2440MCX+2..set..%x\r\n"),(DWORD*)(v_MCXPregs+2)));//打印地址d3620040
RETAILMSG(1, (TEXT("Outpw::: SetWR2dizhis2440MCX+3..set..%x\r\n"),(DWORD*)(v_MCXPregs+3)));//打印地址d3620080
RETAILMSG(1, (TEXT("Outpw::: SetWR2dizhis2440MCX+3..set..%x\r\n"),&v_MCXPregs->rMCXWR2));//打印地址d3620004

rMCXWR2地址是d3620004,和定义的偏移量一样,(DWORD*)(v_MCXPregs+1)怎么是d3620020,而不是我想要的d3d20001??
如果我想访问d3620004,应该怎么偏移(不用v_MCXPregs->rMCXWR2)??
...全文
76 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxswx1987 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 paul_chao 的回复:]
d3d20001 -> ((DWORD)v_MCXPregs + 1)
d3d20004 -> ((DWORD)v_MCXPregs + 4)

這應是 C Programming Language 的範疇, 與是不是 WinCE 無關.


Paul, Chao @ Techware
[/Quote]


volatile DWORD * pAddr;
pAddr=(DWORD*)((DWORD)v_pIOPregs+4);
* pAddr=25;
RETAILMSG(1,(TEXT("MCXTEST:v_IOPregs->GPADA:::%d\r\n"),v_pIOPregs->GPADAT));
RETAILMSG(1,(TEXT("MCXTEST:s* pAddr:::%d\r\n"),* pAddr));//v_pIOPregs->GPADAT和* pAddr地址一样

volatile DWORD * pAddr1;
pAddr1=(DWORD*)((DWORD)v_MCXPregs+4);
* pAddr1=25;
RETAILMSG(1,(TEXT("MCXTEST:v_IOPregs->GPADA:::%d\r\n"),v_MCXPregs->rMCXWR2));
RETAILMSG(1,(TEXT("MCXTEST:s* pAddr:::%d\r\n"),* pAddr1));//v_MCXPregs->rMCXWR2和* pAddr1地址一样


调试IO地址操作,都打印25(正确值),而MCX得操作确是随机值。。 这是什么原因
wxswx1987 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 paul_chao 的回复:]
d3d20001 -> ((DWORD)v_MCXPregs + 1)
d3d20004 -> ((DWORD)v_MCXPregs + 4)

這應是 C Programming Language 的範疇, 與是不是 WinCE 無關.


Paul, Chao @ Techware
[/Quote]

搞定了,非常感谢
paul_chao 2010-07-18
  • 打赏
  • 举报
回复
d3d20001 -> ((DWORD)v_MCXPregs + 1)
d3d20004 -> ((DWORD)v_MCXPregs + 4)

這應是 C Programming Language 的範疇, 與是不是 WinCE 無關.


Paul, Chao @ Techware

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧