故障处理_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.
有如下函数
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.
相关文章推荐
- SEPWin7上安装老是提示要重启系统
- OpenACC与CUDA Fortran交互(1)
- 多线程程序退出内存句柄泄漏的问题以及解决方法
- 习题册第十六章进程管理习题
- Sql Server2008 格式化 Sql的 工具
- awk 处理2个文件一例
- mongodb 入门
- 关于distinct 和group by的去重逻辑浅析
- Mysql 存储过程查询结果赋值到变量的方法
- [HtmlUnit]Fetch Dynamic Html/Content Created By Javascript/Ajax
- C# DateTime
- 性能优化第一篇 (草稿)
- windows下常用的几个dos命令
- 安装rJava包失败处理方法
- strut-控制器ActionServlet类详解
- android adb启动失败问题 adb server is out of date. killing... ADB server didn't ACK * failed to start daem
- java 读properties中文乱码问题
- OpenACC与cublas交互-fortran版本
- MFC 单文档程序的运行过程
- 对于WEB项目兼容IE浏览器的办法