在各种体系的计算机中,通常采用的字节存储机制有两种:Big-Endian和Little-Endian,即大端模式和小端模式。Big-Endian:MSB(最高有效位)存放在最低端的地址上。Little-Endian:MSB存放在最高端的地址上。
VU的运行环境,一般为小端模式,即测试代码按小端模式编译。如果产品代码的目标环境为大端模式,则在short、int、long、unsigned
short、unsigned int、unsigned long等数字类型与char*,
BYTE*互相转换时,存在大小端差异,影响测试结果,例如:
unsigned int str_to_unit(char* str) {
return
*(unsigned int*)str; }
在小端模式下,返回值为0x04030201,在大端模式下,返回值为0x01020304。
解决办法一(推荐)
在编写产品代码时考虑大小端的可移植性,这种方法的好处是,为项目移植到小端系统提供了便利:
1、定义大小端转换宏: #ifdef LITTLE_ENDIAN #define SWAP16(x) ((((x)&
0xFF00)>>8) | (((x) & 0x00FF)<<8)) #define SWAP32(x) ((((x) &
0xFF000000)>>24) | (((x) & 0x00FF0000)>>8) |\
(((x) & 0x0000FF00)<<8 ) | (((x) & 0x000000FF)<<24) ) #else #define SWAP16(x) (x) #define SWAP32(x) (x) #endif
2、在数字与字符串转换时,使用大小端转换宏,如:
unsigned
int str_to_unit(char*
str) {
return
SWAP32(*(unsigned int*)str); }
3、测试时定义编译条件LITTLE_ENDIAN:VU工程属性->高级->预处理选项,在预处理定义输入框中,加入LITTLE_ENDIAN,并在测试工程的Setting中加入同样的编译条件。
解决办法二 使用VU提供的字节序反转功能。如上例,在VU主界面左边,函数代码窗口选中“*(unsigned
int*)str”(不包括行末的分号),右键菜单选择“字节序反转(32位)”,代码自动修改为:
unsigned
int str_to_unit(char*
str) {
return
_SWAP32_(*(unsigned int*)str); }
重新执行测试,结果即可与目标环境一致。这种方式不会修改产品代码。如需取消反转,双击_SWAP32_。
|