内存地址对齐后读取地址内数据

配置寄存器地址, 使地址1M对齐

//初始分配地址为: 0x00582300
//将地址 1M 对齐, 对地址进行 & 操作, &ffff0000 
//进行 & 操作后地址为:0x00580000
//初始分配地址大于操作后地址, 造成数据丢失
//在操作后地址 +0x10000
//最终写入寄存器地址为:0x00590000

WDC_WriteAddr32(hDev, 0, 0x50, ((ppDma->Page[0].pPhysicalAddr) & 0xffff0000) + 0x10000);

写入寄存器地址与实际数据地址产生偏移

最终写入寄存器地址 - 初始分配地址 = 偏移量

在读取内存时需要    读取地址 + 偏移量 = 数据起始地址

WD_DMA* ppDma = (WD_DMA*)hDma;
//计算实际地址的偏移量
DWORD uAdd = (DWORD)(((ppDma->Page[0].pPhysicalAddr) & 0xfff00000) + 0x100000 - ppDma->Page[0].pPhysicalAddr);
//取出地址进行偏移
UINT64 addr = (UINT64)ppDma->pUserAddr;

//将 ppDma->pUserAddr 地址的数据拷贝到dest;
char dest[128];
//读取数据时在初始地址添加偏移量
//+ 0x100000 为数据起始在内存0x100000处开始
memcpy(dest, (PVOID)(addr + uAdd + 0x100000), 128);
arrayBin = QByteArray(dest, 128);//因为buf[]中有`\0`,要写数据长度;否则,数据会直接截断,丢失数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值