您的位置:首页 > 其它

故障处理_vxwork 大端序和变量指针

2013-10-11 10:18 323 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: