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

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.

发布了83 篇原创文章 · 获赞 4 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/hope_worker/article/details/12611483