历史上的今天
今天是:2025年03月11日(星期二)
2020年03月11日 | MSP430之共用体中结构体字节对齐问题
2020-03-11 来源:eefocus
先上代码:
我所用的平台的字节对齐默认是2字节,下面////////之间的变量定义为7个字节,为了保证2字节对齐,Power变量就会自动扩展一个字节,但是变量类型又是一个字节,所以发生了字节偏移的情况。
typedef union _PARARW{
struct{
UINT8 Name[24];
///////////////////////////////
UINT8 Read;
UINT8 Start;
UINT8 Stop;
UINT8 Alarm;
UINT8 Unit;
// UINT8 Nothing;//字节对齐填充
UINT8 Display;
UINT8 Power;
////////////////////////////////
UINT16 Sample;
UINT32 Record;
UINT32 Delay;
SINT16 Limit1H;
SINT16 Limit1L;
SINT16 Limit2H;
SINT16 Limit2L;
SINT16 Shift1;
SINT16 Shift2;
UINT16 Verify;
UINT8 Blank[9];
}Item;
UINT8 Array[64];
}PARARW;
#pragma location = "INFOC"
const UINT8 ParaRWSec[64] = {
'A','B','C','C','D','E','F','G',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', // 24 User Name
' ',' ',' ',' ',
READ_HOLD, // 01 Read
START_IMME, // 01 Start
STOP_FIFO, // 01 Stop
BUZZER_OFF, // 01 Alarm
CENTIGRADE, // 01 Unit
// 0x00, //字节对齐填充
DISPLAY_NORMAL, // 01 Display
POWER_NORMAL, // 01 Power
0x0a,0x00, // 02 Sample Interval
0x3c,0x00,0x00,0x00, // 04 Record Interval
0x00,0x00,0x00,0x00, // 04 Start Delay
0xb0,0x04, // 02 Ch1 Limit (1200)
0x70,0xfe, // 02 Ch1 Limit (-400)
0xe8,0x03, // 02 Ch2 Limit (1000)
0x00,0x00, // 02 Ch2 Limit (0)
0x00,0x00, // 02 Ch1 Shift (0)
0x00,0x00, // 02 Ch2 Shift (0)
0x00,0x00, // 02 Check Sum
0,0,0,0,0,0,0,0,0}; // 9 Reserved
可以看到,共用体中Array地址在0x24E和0x24F分别为0x00和ox0a(假设对应一个u16变量temp16),MSP430为小端模式,高位字节存在高地址,Power后面扩展出的一个字节就是存储在 0x24F(高地址)上对应的0x0a,也就是temp16的高位。
而Power类型是UINT8,强制转换后,Power变量就是temp16的低位0x00;
同理,后面的变量依次偏移,所以造成了数据混乱;


解决办法很简单,就是增加一个变量完成对齐,不要让编译器去自动对齐。
另外,和共用体一起使用并初始化赋值才会出现这种问题,就是说你定义的变量和自定义的数据区域没有对应起来,单独使用结构体的自动对齐只会有结构体大小的差异,不会造成混乱。
至于强制对齐,
#pragma pack (1) //成对使用
#pragma pack ()
不建议使用,因为会占用特别大的存储空间:
使用前:

使用后:
上一篇:MSP430之枚举变量大小
下一篇:msp430 程序升级
史海拾趣
|
在网上找了好几种,这个是比较有特色的,主要是能自定义待发送的字符串,最多32条,点击字符串右边的标号即可以发送这条定义好的字符串,而且可以循环发送、间隔发送,有时候会很方便 [ 本帖最后由 anqi90 于 2010-6-1 22:07 编辑 ]… 查看全部问答> |
|
我的平台是PXA270+Wince5.0 目前有一个小问题,请教大家。 系统启动后,如果有一段时间没有使用,则背光会自动关闭,再过一段时间则进入useridle->systemidle->suspend状态。 在控制面板-->display-->backlight页面中可以设置自动关闭背光的时间 ...… 查看全部问答> |
|
时间:2010-10-28 15:13:45 来源:Strategy Analytics 作者: 市调机构StrategyAnalytics最新报告显示,2010年第3季全球智能型手机(Smartphone)成长幅度高达78%,令人印象深刻,智能型手机单季销量高达7,700万支,创下历史新高,至于业者的表现 ...… 查看全部问答> |
|
负责嵌入式产品软硬件开发工作。 任职要求: 1、计算机、通信、电子,自动化及相关专业,本科及以上学历; 2、精通C/C++编程语言,熟悉嵌入式系统开发流程; 3、对嵌入式操作系统有深入的理解,至少有一种嵌入 ...… 查看全部问答> |




