数据总线宽度:对齐的含义和怎样去对齐以及带来的效率差

发布者:Meiren520最新更新时间:2020-09-09 来源: elecfans关键字:数据总线  宽度  对齐  效率差异 手机看文章 扫描二维码
随时随地手机看文章

最近和同事谈到了ARM平台下数据总线宽度及对齐方式对程序效率的影响问题,在定义结构数据类型时,为了提高系统效率,要注意字长对齐原则。正好有点感触和大家一起谈谈。


这里主要给大家解释下所谓的对齐到底是什么?怎么对齐?为什么会对齐或者说对齐带来什么样的效率差异?

对齐的含义和怎样去对齐以及带来的效率差异

1.先看下面的例子:

#include

#pragma pack(4)

struct A

{

char a;

int b;

};

#pragma pack()

#pragma pack(1)

struct B

{

char a;

int b;

};

#pragma pack()

int main()

{

A a;

cout<

B b;

cout<

}


默认的vc++我记得是4字节对齐ADS下是一字节对齐,因为是c/c++社区大家对PC比较熟悉 我就谈PC下的对齐。


PC下设计放的太长时间的有错误就别客气直接说,大家可以看到在ms的vc下按4字节对齐和1字节对齐的结果是截然不同的分别为8和5为什么会有这样的结果呢?这就是x86上字节对齐的作用。


为了加快程序执行的速度,一些体系结构以对齐的方式设计,通常以字长作为对齐边界。对于一些结构体变量,整个结构要对齐在内部成员变量最大的对齐边界,如A,整个结构以4为对齐边界,所以sizeof(a)为8,而不是5。


如果是原始我们概念下的的A中的成员将会一个挨一个存储,应该只有char+int只有5个字节。这个差异就是由于对齐导致的。,然我们可以看到A的对齐要比B浪费3个字节的存储空间。


那为什么还要采取对齐呢?

那是因为体系结构的对齐和不对齐,是在时间和空间上的一个权衡。

字节对齐节省了时间。应该是设计者考虑用空间换取时间。

为什么说对齐会提高效率呢节省时间?我想大家要理解的重点之重点就在这里了。

在我们常用的PC下总线宽度是32位


1.如果是总线宽度对齐的话

那么所有读写操作都是获取一个<=32位数据可以一次保证在数据总线传输完毕

没有任何的额外消耗

|1|2|3|4|5|6|7|8|

从1开始这里是a的起始位置,5起始为b的位置 访问的时候

如果访问a一次在总线传输8位其他24位无效的

访问b时则一次在总线上传输32完成

读写均是一次完整

插叙一下 读操作先要将读地址放到地址总线上然后下个时钟周期再从外部

存储器接口上读回数据通过数据总线返回需要两个周期

而写操作一次将地址及数据写入相应总线就完成了

读操作要比写操作慢一半


2.我们看访问数据时如果不对齐地址的情况

|1|2|3|4|5|6|7|8|

此时a的地址没变还在1而因为是不对齐则b的位置就在2处

这时访问就带来效率上问题 访问a时没问题还是读会一个字节

但是2处地址因为不是总线宽度对齐一般的CPU在此地址操作将产生error

如sparc,MIPS。它们在硬件的设计上就强制性的要求对齐。在不对齐的地址上肯定发生错误

但是x86是支持非对齐访问的

它通过多次访问来拼接得到的结果,具体做法就是从1地址处先读回后三字节234 暂存起来

然后再由5地址处读回一个字节5 与234进行拼接组成一个完整的int也就是b返回

大家看看如此的操作带来的消耗多了不止三倍很明显在字长对齐时效率要高许多

淡然这种效率仅仅是访问多字节带来的 如果还是进行的byte操作那效率差不了多少

目前的开发普遍比较重视性能,所以对齐的问题,有2种不同的处理方法:

1) 有一种使用空间换时间做法是显式的插入reserved成员:

struct A{

char a;

char reserved1[3]; //使用空间换时间

int b;

}a;

2) 随便怎么写,一切交给编译器自动对齐。

还有一种将逻辑相关的数据放在一起定义

代码中关于对齐的隐患,很多是隐式的。比如在强制类型转换的时候。下面举个例子:

unsigned int i = 0x12345678;

unsigned char *p=NULL;

unsigned short *p1=NULL;

p=&i;

*p=0x00;

p1=(unsigned short *)(p+1);

*p1=0x0000;

最后两句代码,从奇数边界去访问unsignedshort型变量,显然不符合对齐的规定。

在x86上,类似的操作只会影响效率,但是在MIPS或者sparc上,可能就是一个error

关键字:数据总线  宽度  对齐  效率差异 引用地址:数据总线宽度:对齐的含义和怎样去对齐以及带来的效率差

上一篇:基于ARM处理器的高效异常处理解决方案
下一篇:解析J-Link、J-Trace、Open JTAG原理以及其区别

推荐阅读最新更新时间:2024-11-08 18:01

几何形状和公差对电机磁钢宽度的影响
为什么现在这么多的人选择去使用永磁电机,正是因为它的节能,可以达到20%左右,今天就为大家介绍关于永磁电机自学习之磁钢的几何形状和公差对电机磁钢宽度的影响,希望对你有所帮助哦。 一、磁钢厚度的影响: 在内或外磁路圈固定的情况下,当厚度增加时气隙减小,有效磁通增加,明显的表现是同样的剩磁下空载转速降低,空载电流减小,永磁电机的最大效率提高。但是,也有不利的方面,如永磁电机的换向振动增加,永磁电机的效率曲线相对变陡。因此,永磁电机磁钢的厚度应当尽可能的一致,减小振动; 二、磁钢宽度的影响: 对于密排分布的无刷电机磁钢,总的累计间隙不能超过0.5毫米,过小会无法安装,过大会导致永磁电机振动和效率降低,这是因为测量磁钢位置的霍尔元
[嵌入式]
单片机按数据总线分类
单片机 的种类繁多,一般按单片机数据总线的位数进行分类,主要分为4位、8位、16位和32位单片机。 4位单片机 4位单片机结构简单,价格便宜,非常适合用于控制单一的小型电子类产品,如PC机用的输入装置(鼠标、游戏杆)、电池充电器、遥控器、电子玩具、小家电等。 8位单片机 8位单片机 是目前品种最为丰富、应用最为广泛的单片机,目前,8位单片机主要分为51系列及和非51系列单片机。 51系列单片机以其典型的结构,众多的逻辑位操作功能,以及丰富的指令系统,堪称一代“名机”,目前,主要生产厂商有Atmel(爱特梅尔)、Philips(飞利浦)、Winbond(华邦)等。 非51系列单片机在中国应用较广的有Microchip(微芯)的PI
[单片机]
基于CMOS双D触发器CD4013的脉冲宽度检测电路设计
D触发器的常规使用一般是用作二分频器、计数器或移位寄存器。然而,只要对D触发器的外围电路加以改进,根据其基本逻辑功能。就可充分发挥其独特的作用。数字装置中常用的脉冲宽度检测电路,对脉冲信号的宽度进行识别,例如,当输入脉冲的宽度为一个特定值时。便产生一个响应,否则就不予响应。以下就用CMOS双D触发器CD4013组成的几种脉冲宽度检测电路作一介绍。   检测线路之一如图l所示。ICl、IC2为一片CD4013,其中ICl构成一单稳态触发器,单稳态输出端Q1作为D触发器IC2的时钟脉冲,Q2端作vo输出端。由于ICl、IC2的置位S端接地,故稳态时ICl的Ql端恒为零,Ql端为高电平,VO输出为低电平。当Vi输入信号为高电平时,
[模拟电子]
基于CMOS双D触发器CD4013的脉冲<font color='red'>宽度</font>检测电路设计
ARM中的对齐问题
在ARM中,当吧一个内存区域初始化为某个结构体时,必须注意字节对齐情况。 1. 简介 在ARM中,有ARM和Thumb两种指令。 ARM指令 :每执行一条指令,PC的值加4个字节(32bits).一次访问4字节内容,该字节的起始地址必须是4字节对齐的位置上, 即地址的低两位为bits ,也就是说地址必须是4的倍数。 Thumb指令:每执行一条指令,PC的值加2个字节(16bits).).一次访问2字节内容,该字节的起始地址必须是2字节对齐的位置上, 即地址的低两位为bits=0,也就是说地址必须是2的倍数。 遵循以上方式叫对齐(aligned)方式,不遵守这样方式称为非对齐(unal
[单片机]
模糊控制在基于CAN总线数据采集与控制系统中的应用
    摘要: 介绍了如何的把把模糊算法与CAN部线结合起来应用于控制系统;并设计了一种智能型模糊控制算法,给出了系统的整体结构和现场模糊控制单元的硬件实现电路及其软件设计思路。系统的仿真结果表明,该系统实时性好、控制精度较高。     关键词: 模糊控制 现场总线 数据采集 控制系统 CAN总线 L.A.扎德教授于1965年创立的模糊集合理论(Fuzzy Sets)及模糊数字(Fuzzy Mathematics)为模糊逻辑控制的形成提供了理论基础。近年来,随着各企业生产规模的不断扩大,生产过程控制系统也变得越来越复杂。由于整个系统的非线性增强、时滞增大,而且不是系统中的每个环节都需要建立精确的数学
[应用]
单线串行总线可传递相互隔离的电源和数据
  医疗和工业应用经常为了病人和设备操作员的人身安全要求隔离电压达到2500Vac或更高。该隔离屏障不仅要把电源传输到传感器件上,而且还要传送往来于该器件上的数据。   每一个穿越隔离屏障的数据信号都要求隔离。因此,在这些应用中,设计者可以通过选用串行总线而不是并行总线来节约成本。串行总线包括SPI、I 2 C和Dallas单线串行总线。   Dallas单线总线只需要一根数据线(外加地线)来进行双向通讯。由于光隔离器是单向器件,典型的单线传输需要两个光耦,数据流的每个方向上各用一个(而SPI和I 2 C总线则至少需要三个光耦)。   该单线串行总线不仅允许传输双向数据流,而且还可以寄生电源模式传递电源。用一个隔离的变换器来
[医疗电子]
单线串行<font color='red'>总线</font>可传递相互隔离的电源和<font color='red'>数据</font>
DS18B20单总线数据传输
  纯单片机干不了大事,必须得配上各种外设,那么了解单片机与传感器之间的数据通信就显得必不可少了。常见的单片机数据通信方式有SPI,IIC,RS232,单总线等等。每种通信方式都有相应的时序图,分析时序图并完成代码的编写是单片机学习者的必修课。本文以DS18B20为例分析一下单总线数据传输。   DS18B20是单总线数据传输,因此对于时序的要求就非常的高,学会分析其时序图是非常有必要的。   1.初始化时序图分析:   首先是由总线控制器拉低总线,维持480us。在480us后释放总线,由上拉电阻讲总线拉高。等待5-60us后,DS18B20开始响应,会将数据总线拉低60-240us.之后便释放总线,由上拉电阻拉高总线
[单片机]
DS18B20单<font color='red'>总线</font><font color='red'>数据</font>传输
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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