1.问题描述
有如下函数
int my_read_reg(euint16 slot, euint16 chip, euint16 reg, euint16 *pvalue)
{
int rtv = 0;
euint32 dwValue = 0;
//my_lowlevel_read的作用是读取寄存器里的值
extern eint32 my_lowlevel_read(euint32 slot, euint32 chip, euint16 reg, euint16 *pdata);
rtv = my_lowlevel_read(slot, chip, reg, &dwValue);
*pwValue = dwValue & 0x7ff;
return rtv;
}
在vxwork shell 上敲入如下命令
->buf=malloc(2)
->my_read_reg 0,0,0x44, &buf
buf 的值是0
-> my_lowlevel_read 0,0,0x44, &buf
buf的值是0x23.
2.问题原因
在该系统中,采用的是大端序。
dwValue是32位的,而my_lowlevel_read最后一个参数是 16bit寄存器的指针。
my_lowlevel_read 函数执行之后,dwValue的值在内存中是如下存储的。
内存地址 ==0==1==2==3==
dwValue值 00 23 00 00
这样 dwValue & 0x7ff = 0
3.原理解释
在执行my_lowlevel_read函数时,32bit寄存器的指针被强制转换成 16bit寄存器的指针。
转换后,指针指向了 ==0==1==这块内存,在该函数执行完成之后,寄存器中的值自然就存储在了 ==0==1==这块内存里面。
当函数出来以后,dwValue实际上变成了0x230000.