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

配置寄存器地址, 使地址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`,要写数据长度;否则,数据会直接截断,丢失数据

你可能感兴趣的:(开发语言,linux,c++)