Windriver10调用WriteBlock和ReadBolck,结果不正确

fengwanzk 2017-05-03 10:20:35
开发环境:WinXP,sp3。
开发工具 :VS2010,字节对齐方式采用的是默认。
程序的目的:通过WinDrv的接口向DPRAM写一个数据结构,还需要把它再读取出来。
问题:(1)写操作最后3个字节,没有被写入DPRAM;WinDriver不自动对齐吗?还是数据结构设计不合理?
(2)使用修改后的数据结构,读操作的最后四个字节的高低序被改变了,比如写入使用的是0x01 02 03 04,读出来的结果是0x04 03 01 02。
数据结构如下 :

typedef struct
{
vIuint8 A[6];

vIuint8 B1[4];
vIuint8 B2[4];
vIuint8 B3[4];

vIuint8 C1[16];
vIuint8 C2[16];

vIuint8 D;
}STRUCT1;


写操作如下:

STRUCT1 xStruct;
for(int i=0; i<6; i++)
{
xStruct.A[i] = i;
}

for(int i=0; i<4; i++)
{
xStruct.B1[i] = i;
xStruct.B2[i] = i+4;
xStruct.B3[i] = i+8;
}

for(int i=0; i<16; i++)
{
xStruct.C1[i] = i;
xStruct.C2[i] = i+16;
}
// xStruct.C1 = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
// 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
// xStruct.C2 = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
// 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};

xStruct.D = 0x12;

PLX_WriteAddrLocalBlock(hDevice, PLX_ADDR_SPACE0, ADDR_DATA_BASE,
sizeof(STRUCT1), &xStruct, WDC_MODE_32, WDC_ADDR_RW_DEFAULT);


读操作如下:

STRUCT1 yStruct;
memset(&yStruct, 0, sizeof(STRUCT1));

PLX_ReadAddrLocalBlock(hDevice, PLX_ADDR_SPACE0, ADDR_DATA_BASE,
sizeof(STRUCT1), &yStruct, WDC_MODE_32, WDC_ADDR_RW_DEFAULT);


写操作结束后,硬件操作发现使用的数据不正确,于是检查写操作是否正确。
使用了WinDriver提供的PCI9054_dialog.exe程序,读取ADDR_DATA_BASE后面的数据。
每次读取4个字节的数据,发现前面的48个字节数据都正确,最后3个字节全部为0。
由于sizeof(STRUCT1)等于51,因此,怀疑是字节对齐的问题,将数据结构改为:

typedef struct
{
vIuint8 A[6];

vIuint8 B1[4];
vIuint8 B2[4];
vIuint8 B3[4];

vIuint8 C1[16];
vIuint8 C2[16];

vIuint8 D;
vIuint8 padding;
}STRUCT1;

使用上面的数据结构,重新执行写操作,硬件操作显示上面的写操作的数据被正确接收了。
此时,使用PCI9054_dialog.exe程序观察数据,发现确实写对了。
...全文
384 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21,597

社区成员

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

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