返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 嵌入式软件开发之: 基于ARM…
 编程硬核技术:高性能低延迟…
 英伟达确定1月4日举办GeForc…
 【硬件资讯】Nvidia又两款移…
 NVIDIA下一代显卡采用3nm工艺…
 据报道英伟达今日正式发售RT…
 英伟达显卡下架后换皮官宣!…
 自用过才有说服力为您推荐这…
 鑫谷(Segotep)额定500W GP…
 慧能泰“一线双芯”简单有效…
 德州仪器TPS5430实例应用-便…
 奥远HRF系列射频直流电源-奥…
 联想旗舰店购买新电脑到手却…
 最高人民法院发布第35批指导…
 【手慢无】别买SATA30了!一…
 给电脑重装系统分区的方法
 【手慢无】金士顿正品1TB固态…
 特瑞凯S3迷你电脑评测:以赛…
 湖北省沙洋汉津监狱打印机、…
 上海第二工业大学电脑打印机…
 惠普Victus 15笔记本电脑测评…
 成都市双流区中医医院电脑、…
 组装电脑配置清单2022(组装…
 组装电脑配件批发价格-最新组…
 组装机提示无法升级win11怎么…
 北京笔记本电脑回收价格一览…
 装电脑配件价格-最新装电脑配…
 超薄无边框结合AH-IPS屏 飞利…
 玛雅air 32QB 32寸2K显示器 …
 搭载B&O音响 华硕时尚超薄显…
 显示器超薄壁挂
 2022广州车展:捷途大圣i-DM…
 国产信创笔记本电脑生产厂家…
 华硕称 Ryzen 7000 笔记本处…
 十分钟教会你选购笔记本电脑…
 2022 年CPU天梯图显卡天梯图…
 世界上最快的CPU!英特尔发布…
 13代酷睿的灵巧座驾:华硕RO…
 梅捷B760主板发布:8+1+1相供…
 为您找到如何查看电脑主板是…
 新竞化 华硕B760、Z790系列主…
 堆料扎实的平民主板微星MAG …
 “SIMM”是“Single In-line…
 电脑开机蓝屏出现英文怎么解…
 开机后提示“内存错误英文字…
 u盘64位系统需要64位CPU的支…
 【内存卡英文】_内存卡英文价…
 电脑显卡是什么样子的图片
 Steam Deck配置相当于什么显…
 RTX 4070显卡上市时间是什么…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
嵌入式软件开发之: 基于ARM处理器的嵌入式系统设计
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/1/4 14:06:36 | 【字体:

  电玩恶魔ARM编译程序通常将全局变量对齐到自然尺寸边界上,以便通过使用 LDR和STR指令有效地存取这些变量。

  这种内存访问方式与多数CISC(Complex Instruction Set Computing)体系结构不同,在CISC体系结构下,指令直接存取未对齐的数据。因而,当需要将代码从CISC体系结构向 ARM处理器移植时,内存访问的地址对齐问题必须予以注意。在RISC体系结构下,存取未对齐数据无论在代码尺寸或是程序执行效率上,都将付出非常大的代价。

  注意在ARM11处理器上,新增加了支持非内存对齐数据访问的硬件,此结构在本章中不作讨论。

  C和C++编程标准规定,指向某一数据类型的指针,必须和该类型的数据地址对齐方式一致,所以ARM编译器期望程序中的C指针指向存储器中字对齐地址,因为这可使编译器生成更高效的代码。

  比如,如果定义一个指向int数据类型的指针,用该指针读取一个字,ARM 编译器将使用LDR指令来完成此操作。如果读取的地址为4的倍数(即在一个字的边界)即能正确读取。但是,如果该地址不是4的倍数,那么,一条LDR指令返回一个循环移位结果,而不是执行真正的未对齐字载入。循环移位结果取决于该地址相对于字的边界的偏移量和系统所使用的端序(Endianness)。例如,如果代码要求从指针指向的地址0x8006载入数据,即要载入0x8006、0x8007、0x8008和0x8009 4个字节的内容。但是,在ARM处理器上,这个存取操作载入了0x8004、0x8005、0x8006和0x8007字节的内容。这就是在未对齐的地址上使用指针存取所得到的循环移位结果。

  因而,如果想将指针定义到一个指定地址(该地址为非自然边界对齐),那么在定义该指针时,必须使用__packed限定符来定义指针:

  使用了__packed限定符限定之后,ARM编译器将产生字节存取命令(LDRB或STRB指令)来存取内存,这样就不必考虑指针对齐问题。所生成的代码是字节存取的一个序列,或者取决于编译选项、跟变量对齐相关的移位和屏蔽。但这会导致系统性能和代码密度的损失。

  值得注意的是,不能使用__packed限定的指针来存取存储器映射的外围寄存器,因为ARM编译程序可使用多个存储器存取来获取数据。因而,可以对实际存取地址附近的位置进行存取,而这些附近的位置可能对应于其他外部寄存器。当使用了位字段(Bitfield)时,ARM程序将访问整个结构体,而非指定字段。

  与全局变量位于其自然尺寸边界相同,结构体(Structure)中的域字段(Filed)也如此。也就是说编译程序经常要在字段间插入填充字节(Padding)来确保域字段对齐。当编译程序插入填充字节时,编译器将产生以下警告信息。

  可以使用-remark编译选项使编译器产生备份信息,或使用-diag_warning选项选择编译器产生的备份信息。

  如果不希望编译器产生填充字节,可以使用__packed限定符来创建字段之间没有填充字节的结构,且这些结构需要非对齐存取。

  如果ARM编译器能够确定所访问结构体的对齐方式,那么它就可以自动识别所存取结构体中的字段的对齐方式。在这些情况下,编译程序尽可能地采用更有效的对齐字或半字存取方式。否则,编译器将使用多个对齐存储器存取(LDR、STR、LDM和STM)与固定移位和屏蔽相结合来存取存储器中的字节。

  对非对齐元素的存取是通过内联还是通过调用一个函数来完成,由编译程序-Ospace(默认,调用一个函数)和-Otime(执行非对齐存取内联)选项来控制。

  从上例可以看出,所有对结构体域成员的访问都是通过字节访问实现的,所以这种不对齐内存访问无论从代码占用的存储器空间,还是代码的执行时间上都要付出一定的代价。

  然而,开发者可以给编译器提供更多的信息,使其知道结构体内哪个字段是对齐的,哪个字段不是。为此,必须将未对齐字段声明为__packed,并从struct本身除去__packed属性。通过这种方法可以保证对struct中自然对齐成员的快速访问。而且,哪个字段是未对齐的也更清楚,但这样就增加了访问struct结构的难度,当用户从结构中增加或删除字段时需要特别小心。

  从编译后的汇编代码不难看出,对结构体内符号自然边界对齐的域,编译器直接使用相应的Load/Store指令进行访问,而只有那些非自然边界对齐的域,编译器才进行附加处理。这样,从时间和空间两方面减小了程序的开销。

  同一原理也适应于联合体结构(unions)。使用在存储器中未对齐的联合组件的__packed属性。

  一些特殊情况下,ARM编译程序可以生成非对齐LDR指令。特别是编译程序从存储器中载入半字时将使用该方法。这是因为,通过使用相应地址,所需的半字可以载入到寄存器的高半段(bits[31:16]),然后通过移位,将有效数据移到寄存器的低半段(bits[15:0])。这样做的目的是通过减少内存访问次数来减少程序的执行时间。通过上面的方法,程序只需要一次存储器的访问,而使用LDRB指令做同样的操作需要两次存储器的存取,而且还要为将这两个字节合并在一起添加特殊的代码。在ARM体系结构v3和其早期版本中,通常使用该方法进行所有的半字载入。但在ARMv4及其以后版本中,出现了专门的半字载入指令,这种方法逐渐被取代。但是,非对齐LDR指令仍可能会出现,比如在一个充填结构中存取一个非对齐short域类型。

  在非RISC体系结构的处理器上执行的代码中,可能会存在使用指针访问非自然边界对齐的数据类型。这种操作,在ARM体系结构中是不允许的。这就给代码的移植带来很大困难。用户必须识别并更改此类内存访问代码才能使其在RISC体系结构的处理器上正确执行。

  识别非对齐存取可能会很困难,因为使用非对齐地址进行的载入或存储操作会产生不正确的动作。追踪到底是哪部分的C源程序造成了这个问题是很困难的。

  具有完整存储器管理单元(MMUs)的ARM处理器,例如ARM920TTM,支持内存对齐检测功能,用户可以通过设置MMU使处理器检测每一次的内存访问以确保其被正确地对齐。如果出现非对齐内存访问,MMU将产生数据中断。这样就给追踪出错代码带来了很大的方便。

  如果在设计系统时,将系统设计成为当出现非对齐的内存访问时产生异常,则必须安装数据中断异常处理程序(Data Abort Handler)。出现非对齐存取时,程序进入数据中断处理程序,并由此识别位于返回地址(在LR中保存的地址)减8(r14-8)的出错数据存取指令。

  一旦出现数据中断异常,必须通过改变C源程序来修复非对齐的数据访问。使用下列指令可有条件地完成修复:

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 嵌入式软件开发之: 基于ARM处理器的嵌入式系… (01-04)
    普通电脑内存 编程硬核技术:高性能低延迟内存池实现技术 (01-04)
    普通电脑内存 “SIMM”是“Single In-line Memory Module”… (01-04)
    普通电脑内存 电脑开机蓝屏出现英文怎么解决 (01-04)
    普通电脑内存 开机后提示“内存错误英文字母不能为read” 这… (01-04)
    普通电脑内存 u盘64位系统需要64位CPU的支持 (01-04)
    普通电脑内存 【内存卡英文】_内存卡英文价格图片品牌_批发… (01-04)
    普通电脑内存 最新版区块链术语表(中英文对照) (01-03)
    普通电脑内存 电源三大烂是哪些 (电源的好坏) (01-03)
    普通电脑内存 强攻设计师电脑 技嘉推出DESIGNARE DDR4内存 (01-03)
    普通电脑内存 【三月线年上海市三校生三月专科层次自主招生… (01-03)
    普通电脑内存 惠普EliteBook 865 G9笔记本评测:Ryzen 7 Pr… (01-03)
    普通电脑内存 电脑内存条有什么用 电脑内存条使用方法【详解… (01-01)
    普通电脑内存 怎么看电脑内存三种看内存的方法任你选 (01-01)
    普通电脑内存 电脑内存条参数各有什么含义? (01-01)
    普通电脑内存 4000988800联想笔记本电脑内存占用过高怎么办 (01-01)
    普通电脑内存 内存条是什么?电脑内存条有什么用? (01-01)
    普通电脑内存 华为手机用户请留意关闭掉手机里面这4个功能至… (12-31)
    普通电脑内存 重装系统之痛 (12-31)
    普通电脑内存 微软晒Edge亮眼“战绩”:标签页睡眠模式降低… (12-31)