微软公司宣布不再支持你正在使用的 IE浏览器,这会严重影响浏览网页,请使用微软最新的Edge浏览器
您好, 登录| 注册|

单片机中内存对齐与寻址效率: ALIGN(n)存在的意义

  • 08-30 11:51
  • 1339

    浏览

  • 0

    回复

  • 1

    获赞

  •       在RTOS的应用中,我们经常看到有个ALIGN(n)宏的存在,问了下度娘,得到的答案是:内存对齐,提高效率,秉着打破砂锅问到底的精神,翻了很多资料,终于搞明白了,这句答案的含义~!

          首先一般在线程/任务栈的定义时一般会用到内存对齐(注意:并不是在所有的变量定义时都需要):

    这个工程文件的主控为stm32f407vet6,内核CPU为cortex-M4,标准的32位CPU。关于内存对齐重点就是CPU的位长,CPU是通过地址总线来访问内存的数据,一次可以处理多个字节,例如32位CPU,一次可以访问4个字节,因为4*8=32。其实际的寻址步长为4,那么它会对0、4、8、1000等地址寻址,而不会1、3、7、1001这些地址寻址:

          假如我的数组的起始地址为3的一个4字节数组,那么CPU需要从0先读入4字节,然后通过地址偏移来获取3的位置的数据,然后从4开始读取到6的位置的数据,然后拼接为一个完整的数据,最起码要进行两次读操作以及可能包含的计算(平白花费了很多的功夫)。这就是为什么要设置4字节对齐的原因。

          ALIGN的实现是由编译相关的宏进行解析的:这句话可以这么理解,这些宏是完成编译器相关的工作,也就是说从变量到真正的内存存储位置定义,是由编译器完成的(这一句话的信息量很大。。。)

          那为什么需要在线程栈的定义时需要字节对齐,而在其它变量定义时不需要呢?

           首先线程栈的作用是在线程切换时用于保存现场,也就是线程切换时用到,而衡量一个os的一个最主要的指标就是线程的切换速度,那么更快的读取写入线程栈,就是为了这一性能指标而存在的,到这里筒子们可能就车顶明白了ALIGN的存在意义。

    同是电子工程师,请一定不要吝啬你的赞!

    1人已赞

    编辑 举报

    LV.1

    4282695

    2689359

    50

    741076

    说说你的看法

  • LV.

    @

    编辑

    删除

    举报

    #该内容仅管理员可见#

    #回复内容已被删除#

    #该内容正在审核#

    回复:

    取消
    发送
  • 现在还没有回复呢,说说你的想法

    现在还没有回复呢,说说你的想法

    全部回复(0)

    现在还没有回复呢,说说你的想法

  • 回复

  • 收藏

  • 点赞

  • 举报有害信息

  • 已超出发布时间24小时,无法编辑与删除
    关于我们 联系方法 广告服务 会议服务 电子星球APP 网站地图 不良信息举报 热线:400-003-2006
    ? 2002-2021 Netbroad(网博互动)公司版权所有 津ICP备:11006234号 联网备案号:12010402000747 增值电信业务经营许可证:津B2-20120058

  • <tr id='zu6gu'><strong id='mou1g'></strong><small id='4tohu'></small><button id='65rcu'></button><li id='2rkpp'><noscript id='zrq54'><big id='37cvp'></big><dt id='ek2x4'></dt></noscript></li></tr><ol id='3ee0x'><option id='dfz50'><table id='dhbn4'><blockquote id='44ees'><tbody id='783bu'></tbody></blockquote></table></option></ol><u id='ab20m'></u><kbd id='8piw0'><kbd id='2h4az'></kbd></kbd>

    <code id='la94u'><strong id='k2z8e'></strong></code>

    <fieldset id='amxvy'></fieldset>
          <span id='m83w7'></span>

              <ins id='tvp0r'></ins>
              <acronym id='iql1a'><em id='oxl0a'></em><td id='e2b2d'><div id='dyzn8'></div></td></acronym><address id='5ai7j'><big id='8y0my'><big id='6lytu'></big><legend id='37wkm'></legend></big></address>

              <i id='85877'><div id='4034i'><ins id='p81au'></ins></div></i>
              <i id='w92ik'></i>
            1. <dl id='ue8ln'></dl>
              1. <blockquote id='04ekk'><q id='s3vb7'><noscript id='jxez5'></noscript><dt id='9rr6t'></dt></q></blockquote><noframes id='klt1c'><i id='bk6ga'></i>

                新宝7