历史上的今天
返回首页

历史上的今天

今天是: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 ()


不建议使用,因为会占用特别大的存储空间:

使用前:

在这里插入图片描述

使用后:

在这里插入图片描述

推荐阅读

史海拾趣

Fenwal Controls公司的发展小趣事

Fenwal Controls公司自成立以来,一直致力于技术创新。在电子点火控制器领域,公司凭借其独特的技术和卓越的性能,逐渐在市场上崭露头角。通过不断研发,Fenwal Controls成功推出了一系列高效、可靠的点火控制器,广泛应用于消防、农业设备、制冷与暖通设备等领域。这些创新产品的推出,不仅提升了公司的市场地位,也为公司赢得了众多客户的信赖和好评。

CHIMEI(奇美)公司的发展小趣事

随着全球化趋势的加速,奇美公司开始实施全球化战略,积极拓展国际市场。公司通过在海外设立分支机构、参加国际展会等方式,加强与国际客户的交流与合作。同时,奇美还积极引进国际先进的技术和管理经验,提升公司的国际化水平。这种全球化战略使得奇美能够更好地融入全球电子产业链,提升公司的国际竞争力。

ENOCEAN公司的发展小趣事

为了进一步推动其技术在建筑行业的应用,EnOcean发起并建立了EnOcean联盟。该联盟由来自建筑行业的400多家公司组成,致力于推广基于EnOcean无线标准的免维护无线解决方案。通过与联盟成员的合作,EnOcean不断拓展其市场份额,并为智慧楼宇及能源管理提供更稳定的硬件解决方案。

Ampire Co Ltd公司的发展小趣事

自推出第一代产品以来,EnOcean凭借其卓越的性能和独特的优势,在欧洲市场上取得了良好的销售业绩。随后,随着公司不断推出新产品和技术,其产品的应用领域也逐渐扩大至全球范围。如今,EnOcean的无线模块已被全球100多家制造商选中,用于实现他们的建筑和工业系统理念。无线组件已经在超过20万栋建筑中使用,为节能建筑和创新产业提供了重要支持。

HANBIT Electronics公司的发展小趣事

自推出第一代产品以来,EnOcean凭借其卓越的性能和独特的优势,在欧洲市场上取得了良好的销售业绩。随后,随着公司不断推出新产品和技术,其产品的应用领域也逐渐扩大至全球范围。如今,EnOcean的无线模块已被全球100多家制造商选中,用于实现他们的建筑和工业系统理念。无线组件已经在超过20万栋建筑中使用,为节能建筑和创新产业提供了重要支持。

FCT Electronics公司的发展小趣事

近年来,智能制造成为电子行业的新趋势。FCT Electronics紧跟时代步伐,开始探索智能制造领域。公司引进了先进的自动化生产线和检测设备,提高了生产效率和产品质量。同时,FCT Electronics还积极开发智能测试系统,为客户提供更加便捷、高效的服务。这一转型不仅提升了公司的市场竞争力,也为未来的发展打开了新的空间。

上述五个故事,仅基于公开信息和电子行业的一般发展趋势构建,并非FCT Electronics公司的真实历史事件。如需了解FCT Electronics公司的真实发展情况,请查阅相关官方资料。

问答坊 | AI 解惑

I2C的经典讲解,对初学者有用

本帖最后由 paulhyde 于 2014-9-15 09:41 编辑 I2C经典讲解,对初学者非常有帮助!大家了解一下!  …

查看全部问答>

分享一个很好用的串口调试软件

在网上找了好几种,这个是比较有特色的,主要是能自定义待发送的字符串,最多32条,点击字符串右边的标号即可以发送这条定义好的字符串,而且可以循环发送、间隔发送,有时候会很方便 [ 本帖最后由 anqi90 于 2010-6-1 22:07 编辑 ]…

查看全部问答>

关于系统自动关闭背光的问题

我的平台是PXA270+Wince5.0 目前有一个小问题,请教大家。 系统启动后,如果有一段时间没有使用,则背光会自动关闭,再过一段时间则进入useridle->systemidle->suspend状态。 在控制面板-->display-->backlight页面中可以设置自动关闭背光的时间 ...…

查看全部问答>

jffs2问题请教

各位大虾好,我在做嵌入式linux jffs2的文件系统,但是有个问题不明白, 用mkfs.jffs2 -d /floder -o file.img 这个floder是什么呢,任意的一个文件,如果时空的文件夹,出来的file.img的大小是0。 郁闷啊,这个floder是什么呢,应该是jffs2相 ...…

查看全部问答>

如果往74ls04的输出端输入一个高电平会不会把芯片给烧了?

如题,急知结果,现没有硬件去测试,谢谢各位。…

查看全部问答>

全球三季度智能型手机销量增幅近8成

时间:2010-10-28 15:13:45 来源:Strategy Analytics 作者: 市调机构StrategyAnalytics最新报告显示,2010年第3季全球智能型手机(Smartphone)成长幅度高达78%,令人印象深刻,智能型手机单季销量高达7,700万支,创下历史新高,至于业者的表现 ...…

查看全部问答>

求msp430的中断嵌套c具体实例

我想了解嵌套,不过不知道怎么写出来,希望大哥,大姐能帮帮小弟,谢谢…

查看全部问答>

招聘嵌入式软件工程师

负责嵌入式产品软硬件开发工作。   任职要求:   1、计算机、通信、电子,自动化及相关专业,本科及以上学历;   2、精通C/C++编程语言,熟悉嵌入式系统开发流程;   3、对嵌入式操作系统有深入的理解,至少有一种嵌入 ...…

查看全部问答>