标签存档: 内存对齐

指针和内存对齐在通信中的问题

相关概念:

大端模式:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中,这种存储模式就类似把数据当做字符串顺序处理,例如:数据中两个字节按顺序为:FE 10 ,它表示的一个数就是0xFE10。
换句话说:内存的低地址存放着数据高位;

小端模式:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储方式就是将地址的高低和数据的位结合起来,前面的例子按照小端模式表示,应该为:0x10FE。
换句话说:内存的低地址存放着数据低位。  继续阅读 »

MSP430内存对齐问题,对数据进行内存调整

从传感器采集到的数据Dx,Dy,Dz,整型数据,高字节在前,由于地层函数已经写好,直接把传感器输出的六个字节存放到一个连续的内存空间中。
现在把一个整型数组地址传递给采集函数,但由于430内部的内存对齐问题,使得数据的高字节和低字节颠倒了。故需要进行内存调整。

1
2
3
4
5
6
7
8
9
  IRcvStr(0X3C,0X03,(u8*)XYZ_RoughVal,6);                      //读取X,Y,Z轴上的值  
  //解决内存对齐问题,进行内存调整。由于传感器输出的数据高字节先输出,而430内部低字节存放的是int数据的低字节
  for (i=0;i<3;i++)
  {
    j = i*2;
    MemTemp = (u8)*((u8*)XYZ_RoughVal+j);
    *((u8*)XYZ_RoughVal+j) = (u8)*((u8*)XYZ_RoughVal+j+1);
    *((u8*)XYZ_RoughVal+j+1) = MemTemp;
  }

MSP430内存对齐问题

今天终于遇到了内存对齐的问题。
定义了一个数组 u16 xyz[3],
定义了一个指针 u8 *p_xyz = (u8*)xyz
定义了如下宏

1
2
3
4
5
6
#define   XHi   *(p_xyz)
#define   XLo   *(p_xyz + 1)
#define   YHi   *(p_xyz + 2)
#define   YLo   *(p_xyz + 3)
#define   ZHi   *(p_xyz + 4)
#define   ZLo   *(p_xyz + 5)

通信函数通过以上六个宏访问 xyz 进行数据发送,发送时要求大端对齐,即MSB在前(数据包中的低字节)。
但实际的结果和预想的不同,数据的高位和地位恰好颠倒了。 继续阅读 »