返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 ARM处理器的内存对齐处理
 值得入手高性价比笔记本-传舟…
 如何预约联想笔记本维修售后…
 广州联想专卖店维修售后|联…
 电脑自动重启怎么解决?
 炎炎夏日给电脑降温!CPU酷暑…
 手掌大小!小米桌面迷你电脑…
 鹅鹅鸭或鹅鸭杀或鹅人杀闪退…
 小米桌面迷你电脑配置曝光
 Win10系统不会查看自己的电脑…
 Win10电脑怎么查看配置 Win1…
 消息称英伟达 RTX 4080 显卡…
 下一代显卡到底如何供电?英…
 显卡天梯图
 显卡行情_泡泡网
 矿难、缺货、涨价显卡市场的…
 带队参加空间电源产业计量测…
 智能电网建设这类仪器仪表成…
 充电桩计量性能究竟怎样 能否…
 电能计量芯片
 沈阳超高压局完成各变电站站…
 新闻_上网本报价_导购_行情_…
 盘点六大原厂闪存品牌的高品…
 3大件:推土机大降为求一战 …
 深圳联想专业笔记本维修售后…
 七彩虹(Colorful) SL500系…
 华硕官方授权笔记本维修中心…
 58同城、360等家电维修平台存…
 【产业互联网周报】博通610亿…
 北京近两日新增53例本土感染…
 深城交最新公告:联想北京减…
 瓜子二手车软件下载-瓜子二手…
 乔布斯编号电脑预计成交价26…
 赛力斯:关于公司提供担保的…
 一汽富维:关于控股子公司为…
 好二手房怎么找?12月第1周大…
 给显示器加墨水屏?这些厂商…
 笔记本电脑屏幕
 显示器图片设计
 3DMax显示屏贴图
 电脑显示器液晶显示器平板剪…
 电脑内存基础必备知识
 电脑总是蓝屏英文怎么回事
 微软承认 11 月更新导致 Win…
 手机内存跟电脑内存有什么区…
 ASCII编码将英文存储到计算机
 电脑CPU风扇声音大怎么解决
 cpu风扇声音大_老司机教你电…
 CPU风扇声音大怎么办
 CPU风扇声音大怎么办 CPU风扇…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
ARM处理器的内存对齐处理
作者:佚名 文章来源:本站原创 点击数: 更新时间:2022/12/6 22:50:37 | 【字体:

  飓风野游对齐问题主要有3点:变量对齐、结构对齐和数据对齐。前两点是编译器决定的变量映射和结构布局。最后一点与CPU的架构(CISC/RISC)有关。在大多数情况下,对齐是编译器和CPU的事情,和程序员没什么关系。但在某些情况下,程序员又必须考虑对齐问题,否则会有一些麻烦。如果把字节看作小房子,内存就是顺序排列的小房子。每个小房子都有一个顺序编号的门牌号码,例如:0,1,2,...,0xffffffff。我们 把这个门牌号码称作地址。本文将2的整数倍的地址记作2n边界,将4的整数倍的地址记作4n边界,依此类推。显然每个地址都是1n边界,每个4n边界都是 2n边界,每个8n边界都是4n边界。所谓“对齐”就是把变量放在什么样的地址边界上,例如:1n边界,2n边界,还是4n边界。分类源自角度。有多少角度,就有多少分类。最近经常被迫收听“One World, One dream”,其实在我看来,每个生命都有独一无二的梦想,何况国家。如果狗熊有宗教信仰,它心目中的上帝应该是一只相貌儒雅的狗熊吧。从构成看,变量可以分为基本类型的变量和复合类型的变量。基本类型就是语言内部支持的简单类型,例如char, short, int, double等。复合类型由基本类型组成,例如结构。本文将基本类型的变量记作基本变量,将复合类型的变量记作复合变量或结构变量。基本变量的长度目前有1、2、4、8字节。以后可能会有更大的基本变量。嵌入式环境通常不支持浮点,常见的长度是1、2、4字节。从地址看,变量可以分成有确定地址的变量和没有确定地址的变量。所谓“有确定地址”就是指在程序运行前就有确定的地址。而“没有确定地址”的变量,它们的地址是在运行时确定的。全局变量和静态变量都有确定地址。局部变量和动态分配的变量没有确定地址。本文将有确定地址的变量记作有址变量。局部变量是从堆栈分配的,编译器通常会保证每个局部变量的地址都在4n边界上。动态分配的变量是从堆上分配。堆的实现与标准库和操作系统有关。在一些简单的嵌入式系统中,我们需要自己实现动态内存分配,这时我们要保证每次分配的内存块地址都在4n边界上,以避免后面谈到的数据对齐问题。有址变量的地址是在链接时确定的。编译器通常有设置变量对齐方式的编译选项,我们通常使用该选项的默认值。在默认情况下,编译器会按照默认方式对齐放置有址变量。所谓按“按默认方式对齐”,就是将长度为1的基本变量放在1n边界上。将长度为2的基本变量放在2n边界上。将长度为4的基本变量放在4n边界上,依此类推。每个结构变量总是由一个个基本变量构成。结构变量按照该结构中最长的基本变量对齐。如果某个结构基本变量的最大长度是1,编译器就可以把这个结构放在1n边界上。如果某个结构基本变量的最大长度是4,编译器就应该把这个结构放在4n边界上。我在变量对齐问题上吃过一次亏,可以作为本节的一个例子。不过要理解这个例子,读者必须知道ARM CPU的一个特点:就是长度为m的基本变量必须放在mn边界上,否则读写时会发生数据访问错误,其中m=2或4。这就是第3节要介绍的数据对齐。事情是这样,我定义了几个缓冲区(大数组),然后动态分配这些内存。我的错误在于将这些数组定义为字节数组。我的分配算法是按块分配,每个数据块的大小都是4的整数倍。读者能猜到错误产生的原因了吗?由于我把缓冲区定义为字节数组,编译器就可以把它们放在1n边界。如果缓冲区的起始地址是奇数地址,从缓冲区分配的内存块的起始地址都是奇数地址。 如果这些内存块被用于需要按2或4字节对齐的变量,读写时就会发生数据访问错误。如果编译器恰好把这些缓冲区放在4n边界上,问题就不会暴露出来。所以前 一次编译可能是好的,但是下一次编译就会发生莫名其妙的错误。调试程序与侦破案件差不多,离犯罪现场越远的凶手就越难发现。在我透过各种表象找到根源之前,吃点苦头是难免的。解决问题的方法很简单,将缓冲区定义为unsigned int(下文记作uint32)的数组,编译器自然会把它们放到4n边界。在嵌入式系统中,我们经常要为任务定义堆栈。这些堆栈通常都是uint32类型的数组。你知道为什么要把它们定义成uint32数组,而不能定义成字节数组了吗?为了描述方便,我们定义一个基本长度的概念。一个基本变量的基本长度就是它的长度,一个结构变量的基本长度就是结构成员中基本变量的最大长度。前面说过:在默认情况下,结构变量就是按照其基本长度对齐的。在默认情况下,可以认为结构的成员按照默认方式对齐,即长度为m的基本变量放在mn边界上,其中m=1,2,4或8。因为要把成员对齐,结构的各成员间就可能出现填充字节,结构的大小可能大于各成员大小之和。这个结构的基本长度是4,所以这个结构的变量要放在4n边界。成员num1的基本长度为4,所以也要放在4n边界。成员ch1从4n边界开始,只占1个字节,所以在ch1和num1之间有3个填充字节。在对齐时,编译器会将结构长度取整到基本长度的整数倍。这样以该结构为基本类型的数组既可以连续排列,每个元素又可以对齐放置。所以,sizeof(St1)的值是16,在St1的最后一个成员ch2后面还有3个填充字节。各编译器都支持结构的紧缩,即连续排列结构的各成员变量,各成员变量之间没有任何填充字节。这时,结构的大小等于各成员变量大小的和。紧缩结构的变量可以放在1n边界,即任意地址边界。#define GNUC_PACKED__attribute__((packed))其中:__GNUC__是gcc的预定义宏,__arm__是ARM编译器的预定义宏(__arm和__arm__都可以),可以用它们识别当前的编译器。在VC中,有的程序员习惯设置整个工程的struct member alignment,这对应于命令行选项“/Zpi”,其中i=1,2,4,8,16。如果将这个值设为1,工程中所有结构都是紧缩排列。紧缩排列会增大代码量,降低结构访问效率。我们应该仅在必要的时候使用紧缩结构。“/Zp1”是紧缩排列,那么“/Zp2”,“/Zp4”等选项是怎样排列的呢?设选项“/Zpi”中设定的长度是i,设某个结构成员的基本长度是m,则该结构成员按照m和i中较小的值对齐。例如:如果我们设置了“/Zp2”,则基本长度不大于2的成员按照基本长度对齐,基本长度大于2的成员按照2对齐。其实,我们不应该使用“/Zp2”这么奇怪的选项,除非有非如此不可的理由。其实最常用的结构对齐选项就是:默认对齐和紧缩。在两个程序,或者两个平台之间传递数据时,我们通常会将数据结构设置为紧缩的。这样不仅可以减小通信量,还可以避免对齐带来的麻烦。假设甲乙双方进行跨平台通信,甲方使用了“/Zp2”这么奇怪的对齐选项,而乙方的编译器不支持这种对齐方式,那么乙方就可以理解什么叫欲哭无泪了。当我们需要一个字节一个字节访问结构数据时,我们通常都会希望结构是紧缩的,这样就不必考虑哪个字节是填充字节了。我们把数据保存到非易失设备时,通常也会采用紧缩结构,既减小存储量,也方便其它程序读出。最后记录一个小细节。gcc编译器和VC编译器都支持在紧缩结构中包含非紧缩结构,例如前面例子中的St2可以包含非紧缩的St1。但对于ARM编译器而言,紧缩结构包含的其它结构必须是紧缩的。如果紧缩的St2包含了非紧缩的St1,编译时就会报错:error:#1031efinition of struct St1Tag in packed struct St1T2gmust be __packedCPU从指令集的特点上可以分为两类:CISC和RISC。CISC和RISC分别是复杂指令集计算机(Complex Instruction Set Computer)和精简指令集计算机(ReducedInstruction Set Computer)的缩写。CISC CPU支持很多寻址模式,因此取数据的时间是不确定的。RISC CPU的最大特点是简化了指令的寻址模式,除了Load/Store指令外,其它指令都采用寄存器寻址,即从寄存器读写数据。这种设计使取数据的时间相对稳定,可以简化指令流水线的设计。一般而言,RISC架构可以降低CPU的复杂性以及允许在同样的工艺水平下生产出功能更强大的CPU,但对于编译器的设计有更高的要求。RISC CPU的Load/Store指令要求数据是对齐的。长度为4的数据应放在4n边界上,长度为2的数据应放在2n边界上。以ARM CPU的Load为例:LDR、LDRSH、LDRB分别从存储器读取一个字、半字和字节,放到指定寄存器。例如“LDR R5,[R4]”就是从R4指向的存储单元中读一个字(长度为4),放到R5中。 LDR要求数据地址在4n边界上,否则就会发生错误。LDRSH要求数据地址在2n边界上,否则就会发生错误。发生什么错误呢?这与具体的CPU有关,在ARM7TDMI上,非对齐访问会导致程序跳到数据访问错误的处理向量,即地址0x00000010处。在ARM920T上,LDR指令可能返回错误的数据。CISC的CPU支持非对齐的数据读取。关键是这句:i = *pi; 和 *pi = 0x11223344;我们知道地址pi指向的4个字节依次是:0x02,0x03,0x04,0x05。在小尾的CPU上,我们期待的输出是0x05040302和0x01 0x44 0x33 0x22 0x11。让我们看看这段代码在不同平台的运行效果。值得注意的是gcc编译器将局部变量a放在了1n边界(0xbfa0c36b)上。我们希望pi是一个奇数地址,将测试代码修改为:int a[] = {0x04030201, 0x08070605};输出结果是:pi=0xbfe87fe9 0x05040302 0x22334401 0x08070611符合我们的预期。数据对齐是CPU的问题,和编译器、操作系统没有关系。输出结果是:&a[1]=0xbec49e55 0x01040302 0x44 0x33 0x22 0x11 0x05 考虑到小尾,CPU实际读到的4个字节依次是0x02,0x03,0x04,0x01。这个结果不是我们所预期的,CPU出错了。ARM指令:每执行一条指令,PC的值加4个字节(32bits).一次访问4字节内容,该字节的起始地址必须是4字节对齐的位置上,即地址的低两位为bits[0b00],也就是说地址必须是4的倍数。Thumb指令:每执行一条指令,PC的值加2个字节(16bits).).一次访问2字节内容,该字节的起始地址必须是2字节对齐的位置上,即地址的低两位为bits[0b0],也就是说地址必须是2的倍数。目前,经过测试发现写内存操作时,会按照地址对齐访问(如上面的*pi = 0x11223344;实际会向((uintptr_t)(pi))& ~(4-1)对齐访问);而读操作没有发现规律。但是有没有方法进行非对齐访问呢?为此,ARM编译器提供了__packed关键字,__packed是进行一字节对齐,输出结果是: &a[1]=0xbec49e55 0x01040302 0x01 0x44 0x33 0x22 0x11程序在执行:i = *pi; 时直接跳回Data Abort的处理向量,即地址0x00000010。在读取紧缩结构或结构的紧缩成员时,编译器会自动产生按字节读取的代码。我们只要在做强制指针转换时细心一些就可以了。我们不应该将指向窄数据的指针强制转换成指向宽数据的指针。在可能发生数据对齐问题的地方,按字节读取数据。

  ARM手册中都会有一些Programmers’ Model章节。那么什么是Programmers’ Model,Programmers’ Model是从编程者的角度来看,处理器提供了哪些可用的特性给编程人员。这里以ARM7TDMI-S 为基础来介绍一些基本的模型,对最新的内核也适用。想了解最新的可以参阅ARMv8-A的架构手册,里面可以看到有应用级和系统级的Programmers’ Model(分别有64位架构和32位架构的),有很多的特性。数据类型ARM7TDMI-S 可以支持下列的数据类型Byte(字节,8位)Halfword(半字,16位,以两字节为对齐边界)Word(字,32位,以四字节为对齐边界)处理器运行状态处理器在运行

  高通正寻求认真加强其 PC 处理器,昨晚宣布了下一代基于 Arm 的处理器计划,“旨在为 Windows PC 设定性能基准”,将能够与苹果的 M 系列处理器并驾齐驱。高通首席技术官 James Thompson 博士在公司 2021 年投资者大会上宣布了新处理器的计划,目标是在 2023 年推出,推出前九个月内向硬件客户提供样品。据 The Verge 报道,新处理器将由 Nuvia 团队设计,高通今年早些时候以 14 亿美元的巨额收购收购了该团队。值得注意的是,Nuvia 是由三位前苹果员工于 2019 年创立的,他们之前为苹果的 A 系列处理器工作过。高通也做出了重大承诺:除了与苹果一流的 M 系列处理器竞争之外,高通

  :由苹果前员工负责开发 /

  一、ARM处理器7种工作模式(特权模式 特权模式异常模式)用户模式(USR):正常程序执行模式,不能直接切换到其他模式系统模式(SYS):运行操作系统的特权任务,与用户模式类似,但具有可以直接切换到其他模式等特权快中断模式(FIQ):支持高速数据传输及通道处理,FIQ异常响应时进入此模式中断模式(IRQ):用于通用中断处理,IRQ异常响应时进入此模式管理模式(SVC):操作系统保护模式,系统复位和软件中断响应时进入此模式(由系统调用执行软中断SWI命令触发)中止模式(ABT):用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处未定义模式(UND):支持硬件协处理器的软件仿真,未定义指令异常响应时进入此模式除用户模式外,其

  7种工作模式 /

  两种工作状态1、ARM状态:处理器执行32位对齐的ARM指令;2、Thumb状态:处理器执行16位对齐的ARM指令。它们之间的区别在于:Thumb指令集不是完整的指令集,它是ARM指令集的子集。但是Thumb指令具有更高的代码密度,即占用存储空间小,仅为ARM代码规格的65%,但其性能却下降的很少。所以,Thumb指令集使ARM处理器能应用到有限的存储带宽,并且,代码密度要求很高的嵌入式系统中去。Thumb指令集没有协处理器指令、信号量指令以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二操作数受到限制;除了跳转指令B有条件执行功能外,其他指令均为无条件执行;大多数Thumb数据处理指令采用2地址格式。七

  工作状态和模式 /

  1、寄存器:总共有37个寄存器,最多可以有17个活动寄存器(16个数据寄存器,2个状态寄存器:CPSR和SPSR)R13:堆栈指针:指向当前处理器模式的堆栈栈顶R14:链接寄存器,保存子程序的返回地址。【当执行子程序调用指令(BL)时,R14可得到R15(程序计数器PC)的备份】R15:程序技术器,处理器下一条要取出的指令地址。【ARM状态下,指令4字节对齐,位[1:0]为0。位[31:2]保存PC】【注】快速中断的r8-r12是分组寄存器,r13-r14每种模式都有自己的分组寄存器。r15没有分组寄存器。用户模式和系统模式没有分组寄存器。2、当前程序状态寄存器CPSR:3、处理器模式:除了用户模式外,每一种模式可以改写cpsr中的

  基础 /

  ARM(Advanced RISC Machines)概述:有三种含义,它是一个公司的名称,是一类微处理器的通称,还是一种技术的名称。技术特征体积小、低功耗、低成本、高性能。支持Thumb(16位)/ARM(32位)双指令集,能很好地兼容8/16位器件。大量使用寄存器,指令执行速度更快。大多数数据操作都在寄存器中完成。寻址方式灵活简单,执行效率高。指令长度固定。嵌入式RISC微处理器概述:RISC(Reduced Instruction Set Computer)是精简指令集计算机,RISC把着眼点放在如何使计算机的结构更加简单和如何使计算机的处理速度更加快速上。RISC选取了使用频率最高的简单指令,抛弃复杂指令,固定指令长度,减少

  和体系结构介绍(Cortex-A9) /

  的比较.pdf

  对网络通信程序的影响

  【下载】通过 KEIL 制作 QSPI 接口的外部 Flash 下载算法

  【下载】STM32G4 应用程序与 Option Bytes 同时烧录问题

  【干货】STM32WB:双核架构、可支持BLE 5.2等多种2.4GHz频段射频协议的SoC射频芯片

  【干货】STM32WL单/双核架构、可支持LoRa等Sub-GHz频段射频协议的SoC射频芯片

  【干货】 STM32数字电源开发者一站式资源库 从产品选型,生态资源到应用案例

  【产品】STM32U5 系列, 新一代Cortex-M33内核微控制器,更安全,更可靠, 更低功耗,同时支持多种数学运算

  【生态】STM32CubeProgrammer 和 STM32CubeMonitor持续更新

  【应用】AI:技用STM32Cube.AI 部署ONNX 模型实操示例:风扇堵塞检测

  【演示】采用Matter拓扑的STM32WB:边界路由器和终端设备照明演示

  【生态】意法半导体第四届工业峰会:激发智能设计灵感,赋能可持续技术创新

  SABIC全新LNP™ KONDUIT™改性料具有出色的耐高温性和流动性

  直播已结束|Molex 和 TTI 更小型、高速、可靠的连接器推动物联网应用的新发展

  下载有礼喽!2017年泰克亚太专家大讲堂第三期: 超宽带复杂电磁信号产生与实时分析技术

  罗德与施瓦茨-车载以太网及其一致性测试方案 回馈您的需求 看视频赢好礼

  站点相关:综合资讯51单片机PIC单片机AVR单片机ARM单片机嵌入式系统汽车电子消费电子数据处理视频教程电子百科其他技术STM32MSP430单片机资源下载单片机习题与教程

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

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 ARM处理器的内存对齐处理 (12-06)
    普通电脑内存 电脑内存基础必备知识 (12-06)
    普通电脑内存 电脑总是蓝屏英文怎么回事 (12-06)
    普通电脑内存 微软承认 11 月更新导致 Windows Server 出现… (12-06)
    普通电脑内存 手机内存跟电脑内存有什么区别啊? (12-06)
    普通电脑内存 ASCII编码将英文存储到计算机 (12-06)
    普通电脑内存 内存条价格走势(内存条价格走势2021) (12-06)
    普通电脑内存 内存诊断工具变成英文的了 (12-06)
    普通电脑内存 代码优化:有效使用内存英文版(chm版)-硬件开… (12-06)
    普通电脑内存 电脑出现了蓝屏和英文 (12-06)
    普通电脑内存 Optane内存 (12-06)
    普通电脑内存 深入理解Linux虚拟内存管理英文版PDF_MelGorm… (12-05)
    普通电脑内存 手机虚拟内存 (12-05)
    普通电脑内存 虚构内存器英文怎么写 (12-05)
    普通电脑内存 电脑上什么是虚拟内存 (12-05)
    普通电脑内存 linux sd的英文4 lvmm-深入理解linux虚拟内存… (12-05)
    普通电脑内存 DDR5 8000!GSKILL发布超强超频内存 (12-05)
    普通电脑内存 内存或还要降半年 2023下半年可能涨价 (12-05)
    普通电脑内存 快看看你的内存条有没有这种情况 (12-05)
    普通电脑内存 Win 10新内存管理功能谷歌浏览器终于抛掉内存… (12-05)