datasheet

ARM内存边界对齐以及sizeof问题

2019-08-15来源: eefocus关键字:ARM  内存边界  sizeof

默认情况下,在32位cpu里,gcc对于结构体的对齐方式是按照四个字节来对齐的。看以下结构体


  typedef struct pack{


  char a;


  int b;


  short c;


  }pack;


  对于Pack结构体,默认情况下在arm/386平台下(别的平台没试过)sizeof(pack)=12,求解过程如下:


  sizeof(char)=1;


  下一个int b,由于是四个字节,要求b的开始地址从32的整数倍开始,故需要在a后面填充3个没用的字节,记为dump(3),sizeof(b)=4,此时相当于结构体扩充为


  char a;


  char dump(3);


  int b;


  看short c,现在c的前面有8个字节,c是两个字节,c的开始地址是从16的整数开始,在b前面不需再加东西.此时对于结构体来说,sizeof(pack)=10,但是这不是最终结果, http://tiyubisai.com/video_news/news_135587.html 最后总的字节数也要能被4个字节整除,所以还需在short c后面再加


  dump(2);


  故总的字节数为12.


  当然以上说的只是简单的情况,下面谈谈arm,x86在gcc里关于内存边界字节对齐的区别.对于同样的结构体,在386下


  #prama pack(1)


  后,sizeof(pack)=1 4 2=7


  而在arm下同样的操作sizeof(pack)=1 4 2 1=8,即虽然b根a之间不要填充但总的长度必须要是4的整数倍.


  在arm 下要使结构体按指定字节对齐,可行的方法


  1.在makefile里加-fpack-struct 选项,这样的话对所有的结构按一字节对齐.


  不得不说,确实有那么些质量较差的程序可能需要你部分自然对齐,部分一字 节对齐,此时


  2. typedef struct pack{


  }__attribute__((packed))


  可利用__attribute__属性


  当然最后的方式,还是自己去看arm体系结构与gcc编译选项了。

关键字:ARM  内存边界  sizeof

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic471178.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:S5PC100外设之脉冲宽度调制定时器
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

ARM开发(4)基于STM32的矩阵键盘按键控制TM1629A LED显示

一 矩阵键盘按键控制TM1629ALED显示原理:    1.1 本实验实现矩阵键盘按键控制TM1629ALED显示    1.2 实验思路:共阴极数码管,掌握数码管段选位选原理  熟悉TM1629A芯片手册    1.3 开发环境 : MDK5 库函数版本开发 JLINK仿真 二 实验步骤: 2.1 keyled.h代码:    #ifndef __KEYLED_H    #define __KEYLED_H    #include "sys.h"  &
发表于 2019-08-16

小熊arm学习总结:iar7.3建立工程报错

方法一.STM32工程 从IAR6.0 转到 IAR6.3用IAR6.3打开IAR6.0 的工程,编译的时候出现提示错误:extern uint32_t __get_PSP(void); 已经在C:Program FilesIAR SystemsEmbedded Workbench 6.0arminccintrinsics.h文件中定义extern uint32_t __get_MSP(void);已经在C:Program FilesIAR SystemsEmbedded Workbench 6.0arminccintrinsics.h文件中定义 。。。。。。这是由于IAR6.3已经加入了CM3的内核定义,就不需要ST库中
发表于 2019-08-15

格罗方德:已研发12nm FinFET封装的3D Arm芯片

8月10日消息 根据外媒Tom's Hardware的报道, GlobalFoundries (格罗方德)本周宣布,已经使用其12nm FinFET工艺成功制成了高性能的3D Arm芯片。格罗方德表示:“这些高密度的3D芯片将为计算应用,如AI/ML(人工智能和机器学习)以及高端消费级移动和无线解决方案,带来新的性能和能源效率。”据报道,格罗方德和Arm这两家公司已经验证了3D设计测试(DFT)方法,使用的是格罗方德的混合晶圆对晶圆键合。这项技术每平方毫米可支持多达100万个3D连接,使其具有高度可扩展性,并有望为12nm 3D芯片提供更长的使用寿命。对于3D封装技术,英特尔去年宣布了其对3D芯片堆叠的研究,AMD也谈到
发表于 2019-08-13

ARM DesignStart让你感到前所未有的灵活

翻译自——Semiwiki, Bernard Murphy  概要 RISC-V的开源性对未来的设计产生了深远的影响,但作为处理器IP龙头企业Arm来说,他们要为客户的需求着想,建立一个更加灵活多功能的模式。DesignStart能够让用户感受到如同RISC-V一样的灵活性,根据你自己的要求使用他们的软件和IP,但这是有偿的。 毫无疑问,RISC-V产生了很大的影响,确信有很多新设计频频出现,特别是在成本极具竞争力或处理器要求额外的差异化领域。恐怕这不会对Arm的业务产生实质性的影响,而只会对媒体产生影响。要取代一个如此规模的生态系统,以及市场对Arm产品的信心,需要很长
发表于 2019-08-13
ARM DesignStart让你感到前所未有的灵活

STM32-(01):认识ARM

ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量的高性能、廉价、低耗能的RISC(Reduced Instruction Set Computer,中文是精简指令集计算机)处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。市场份额手机处理器90%以上的市场份额上网本处理器30%的市场份额平板电脑处理器70%的市场份额基于ARM技术的微处理器应用约占据了32位嵌入式微处理器80%以上的市场份额。风靡全球的几大原因:1、功耗低2、功能强3、32位指令集4、合作伙伴众多5、产品线丰富拿ARM7与单片机进行
发表于 2019-08-12
STM32-(01):认识ARM

【stm32f103学习笔记】字、半字、字节和sizeof()

定义-字、半字是根据处理器的特性决定的;字节则都是8bit。-sizeof()返回一个数据类型的占用地址长度,增强程序在不同处理器间的兼容性;CPU按照其处理信息的字长可以分为:八位微处理器、十六位微处理器、三十二位微处理器以及六十四位微处理器等。CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以字节为单位 ,如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是为什么32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。几个处理器比较1)stm32是32bit处理器,所以它的字是32bit的(一次处理4字节长度的数据)。半字自然就是16bit(2字节);字节是8bitstm32和传统
发表于 2018-05-01

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved