文章目录
- 概述
- ARM基础
- ARM 不生产芯片
- ARM分类和命名
- ARM指令集和架构
- ARM架构和内核
- ARM内核和芯片
- 其他处理器架构
- 在手册中找寻字节序的踪迹
- ST 32 MCU 没有大端?
- Cortex-M 系列
- Cortex-A 系列
- Cortex-R 系列
- 小结
- 芯片外设支持大端字节序
- DMAC 支持大端字节序的情况
- CRC 支持大端字节序的情况
- DMAC
- 找到一个大端芯片哦
- 大端字节序在消亡?
- 相关文章
概述
我想找到一款支持内存大端字节序存储的MCU或MPU,并为此实践了好几个晚上,本文记录了该过程。除了梳理出些有用的论坛、官网地址外,结合个人理解,也梳理了关于ARM架构、ARM内核、ARM芯片产品等基础知识,了解了大端字节序兴亡史,粗略习得了部分芯片产品(MCU/MPU/SOC等)上局部外设支持大端字节序的情况。
@History
清楚地验证过 AT89C51+Keil 的组合,就是一个实打实的内存大端字节序环境。并在其基础上验证了大端字节序环境下的一些问题,参见 《语言基础/分析和实践 C&C++ 位域结构数据类型》和 《CAN总线/CAN应用层协议设计,理解并实践仲裁段位域定义》等,如,多字节数据在大端下的存储、结构内普通字段或位域字段定义顺序与bit位顺序的关系等。遗憾的是,该环境仅默认支持1字节对齐,不能识别 #pragma pack 宏来设置2或4字节对齐,因此我不能继探索一些问题,如,结构对象在大端环境下的对齐填充规则等。
为了满足心里那点好奇,找到一个可以自然多字节对齐的环境,成了一个目的。使用Qemu虚拟化一个PowerPC是一种方案,整理和实践相关步骤时,遇阻暂停;一般云服务器不支持二次虚拟,也办不了。有不少人提到基于ARM核的MCU或MPU是支持大小端字节序设置的,尤其是A9系列被多次提及,但我查阅了十几种处理器芯片的数据手册,并没有找到真正支持内存大端字节序的微控制器或微处理器。本文之前所查阅的ARM系列芯片中,虽有大小端字节序寄存器标识位,但都是只读,默认小端。
@History
再后来,直至结束这篇文章的编写,我也没有搞定一个符合自己上述理想的大端环境。但是我搞明白了,几乎所有的与大端有关的问题,都可以在 AT89C51+Keil 这个环境下测试,只要你手段和方法到位。实际上在上以段落中提到的两篇文章也是如此实践的。
转载请标明出处,
https://blog.csdn.net/quguanxin/category_10527523.html
ARM基础
ARM(Advanced RISC Machines) 是一家总部位于英国剑桥的半导体和软件设计公司,专注于开发基于精简指令集架构的处理器技术。2024年6月16日消息,根据最新市值计算,Arm股价约合人民币12001亿元。挑了一些我比较感兴趣的历史,
1990年,Acorn为了ARM更好地发展同时减少公司的财务压力,Acorn将子公司ARM独立出来,并接受了苹果和VLSI的投资,ARM正式成为一家独立的合资公司。同年,ARM决定改变他们的产品策略:他们不再生产芯片,转而以授权IP的方式,将芯片设计方案卖给其他公司,收取一次性技术授权费和版税提成。这是一种全新的商业模式,极大地降低了ARM自身的研发成本和研发风险。2016年,曾经投资阿里巴巴的孙正义和他的日本软银集团,以243亿英镑(约309亿美元)收购了ARM集团,ARM退市。软银集团表示,收购后将继续支持ARM的独立经营。2020年,NVIDIA宣布出价400亿美元从日本软银集团手中收购ARM,但此项收购遭到监管机构和大型企业(例:高通、微软、Google等)的一致反对,2022年,收购案正式宣告失败。
无风不起浪,既然不少人提到ARM是支持大小端字节序的,那么大概率,至少在ARM的某些层级上(如架构、内核、芯片)、或者是某些ARM芯片、或内存存储或其他外设传输,存在支持或部分支持的情况。本小节先来搞清楚ARM的 “版本” 或 “层级” 等概念。
ARM 不生产芯片
ARM不生产处理器芯片,而是通过许可授权处理器核心IP(Intellectual Property,知识产权),允许合作伙伴设计、制造和销售基于ARM架构的处理器。该模式使得ARM处理器在全球范围内被广泛应用,并且在移动计算、物联网、汽车、工业控制等领域发挥着重要作用。
ARM分类和命名
ARM设计的处理器以其低功耗、高性能和高度灵活性而闻名,被许多芯片制造商采用并集成到其产品中。为更好地适应不同市场的差异化需求,2004年以后,ARM公司放弃了之前ARM+数字的命名方式(如ARM7,ARM8、ARM11等),转而用cortex来命令处理器产品,并分为三大产品线,分别是Cortex-A、Cortex-R和Cortex-M。近年推出的cortex-X并不是单独的产品线,它可看做cortex-A的升级版。
ARM除了按照上述产品线分类,也可以按照v7、v8等架构版本进行分类。这使得帮助用户可根据应用场景、性能要求、功耗需求等因素,更快更好地理解和选择适合自己需求的ARM处理器,找到适合自己的解决方案。
按照A、R、M系列分类,主要是根据处理器的应用场景和功能特性来划分:
Cortex-A系列适用于应用处理器,具有强大的计算性能和多核处理能力,适合用于智能手机、平板电脑、服务器等高性能应用。Cortex-R系列适用于实时处理器,具有可靠的实时性能和较低的延迟,适合用于实时控制系统、通信基础设施等要求高可靠性的应用。Cortex-M系列适用于微控制器,具有低功耗、低成本、小尺寸等特点,适合用于嵌入式系统、物联网设备等低功耗应用。
按照v7、v8等架构版本分类,主要是根据ARM处理器的指令集架构版本来划分:
ARMv7架构是较早的版本,支持32位指令集,包括了较多的优化和扩展,被广泛应用于移动设备和嵌入式系统。ARMv8架构是较新的版本,支持64位指令集,提供了更高的性能和更大的内存寻址空间,适用于高性能计算、服务器等领域。
ARM指令集和架构
我们通常说的ARM架构,是指ARM指令集和架构。对于ARM的指令集和架构来说,两者是绑定在一起的,一般不分开说这两者,而统一说成ARM指令集架构。指令集是计算机架构设计的重要组成部分,它会影响到架构的性能、可编程性、复杂度等方面。指令集与架构的协同设计可以提高计算机系统的性能和可靠性,并且可以降低计算机系统的设计成本。此外,指令集和架构也可以相互影响,当计算机架构设计变化时,需要相应地更新指令集;而当新的指令集出现时,也会对计算机架构设计产生影响。
ARM直译为先进的精简指令集架构处理器,其中R代表的是 RISC,即 Reduced Instruction Set Computer 的缩写,意为精简指令集处理器架构,ARM是RISC最突出的代表,其它较有名的RISC指令集还有,MIPS、PowerPC、SPARC等。在实际应用中,RISC架构通常被用于高性能计算、嵌入式系统等领域,而CISC,Complex Instruction Set Computing,复杂指令集处理器架构则更多地用于个人电脑、服务器等通用计算场景,耳熟能详的X86指令集就是一种CISC指令集。RISC其设计理念是简化指令集,使得每条指令的执行时间相对较短,指令格式相对简单。CISC其设计理念是通过提供更复杂、功能更丰富的指令集来提高编程效率。此处不再进行深入讨论。
指令集(Instruction Set)是计算机硬件与软件之间的接口规范,是一种约定的机器语言,定义了计算机可以执行的操作,包括运算、存储、传输等,是计算机硬件设计和软件开发的基础。RISC架构倾向于由硬件来完成复杂的指令序列,鼓励编译器优化和减少对缓存和流水线的冲突,以提高整体性能。CISC架构通常具有变长的指令格式,指令集更为复杂,需要更多的硬件支持来解码和执行指令。架构(Architecture)是计算机系统的总体设计,包括计算机硬件的组成、互连方式、指令集、操作系统、编译器等。计算机架构决定了计算机系统的性能、可靠性、扩展性和兼容性等方面。
ARM架构和内核
我们先来整体的看一下ARM架构和内核的对应关系,
内核 ARM11 对应的是ARM架构 ARMv6,而内核 ARM6/ARM7 都对应 ARMv3 架构(图中省略了其绘制),我们较熟悉的Cotex-M3(如 STM32F103 的内核) 对应的是 ARMv7-M 架构,较熟悉的Cotex-M3(如 STM32F407 的内核) 对应的是 ARMv7E-M 架构,被传的像是一定会支持内存大小端字节序设置的Cotex-A9内核,是基于ARMv7-A架构的。不再赘述。
ARM内核和芯片
ARM芯片是指基于英国ARM(Advanced RISC Machines)架构设计的处理器芯片。内核是相对于完整的芯片来说的,ARM将核心处理器部分设计完成,然后授权给其它芯片设计厂商,其它厂家可根据授权方式进行更改或直接使用,然后发布自己的芯片,这些芯片就是基于ARM内核的。ARM内核有多种类型,比如,ARM6,ARM7,…,ARM11,cortex-M,cortex-R,cortex-A 等。ARM公司在授权合作伙伴IP时,既可授权通用的处理器架构,如,ARMv6-M、ARMv7-M、ARMv7-A,也可以直接授权具体的处理器内核设计,如ARM Cortex - M0、ARM Cortex - M3、ARM Cortex - A8、ARM Cortex - A9 等。这种灵活的授权模式使得合作伙伴可以选择适合自身产品需求的处理器设计方案,从而加快产品上市时间,提高性能和功耗效率。
简单来说,ARM内核是ARM架构的一个具体实现,内核是更具体、更实际的处理器设计。ARM架构是ARM处理器的整体设计和指令集架构,它定义了处理器的指令集、寄存器组织、内存管理单元等基本特性。ARM架构通常被分为不同的系列,如ARMv7、ARMv8等,每个系列都有不同的特性和功能。ARM架构提供了通用的设计框架,供不同的处理器内核实现。ARM内核则是基于ARM架构设计和实现的具体处理器核心。内核是处理器的核心部分,负责执行指令、处理数据、控制流程等任务。ARM内核根据不同的需求和应用场景,可以有不同的设计和配置,例如Cortex-A系列适用于应用处理器,Cortex-R系列适用于实时处理器,Cortex-M系列适用于微控制器等。
例如,
ARM Cortex-M3 处理器系采用 ARMv7-M 架构设定,Cortex-M0和Cortex-M0+则采用类似的ARMv6-M架构。以M型架构为例,在ARM官网上,它包括,
共计4种架构手册,Armv8.1-M Architecture Reference Manual、Armv8-M Architecture Reference Manual、Armv7-M Architecture Reference Manual、Armv6-M Architecture Reference Manual,每种大类架构都有自己的M类型。
其他处理器架构
除了ARM架构外,还有一些其他处理器架构在市场上也具有重要地位,例如:
x86架构:
x86架构是由英特尔(Intel)和AMD等公司推出的一种处理器架构,广泛应用于个人电脑、服务器和工作站等领域。x86架构以其强大的计算性能和广泛的软件支持而闻名,x86架构被归类为复杂指令集计算机(CISC)架构。尽管x86架构是CISC架构,但随着处理器技术的不断进步和优化,现代的x86处理器已经在硬件级别实现了许多优化,使得其在性能和能效方面与RISC架构逐渐拉近。
MIPS架构:
MIPS(Microprocessor without Interlocked Pipeline Stages,无互锁流水线微处理器)是一种精简指令集(RISC)架构,在1981年由斯坦福大学的研究小组开发,其设计初衷是为了克服传统复杂指令集计算机(CISC)架构中的性能瓶颈,提供一种更加高效、简洁的处理器架构。MIPS指令系统以其精简的指令集、通用的多个寄存器、高效的流水线架构等优势,成为了一种高效、可靠的处理器架构,被广泛应用于个人电脑、嵌入式系统、游戏控制台、网络设备和超级计算机等多个领域。
MIPS处理器是八十年代中期RISC CPU设计的一大热点。MIPS是卖的最好的RISC CPU,可以从任何地方,如Sony, Nintendo的游戏机,Cisco的路由器和SGI超级计算机,看见MIPS产品在销售。目前随着RISC体系结构遭到x86芯片的竞争,MIPS有可能是起初RISC CPU设计中唯一的一个在本世纪盈利的。和英特尔相比,MIPS的授权费用比较低,也就为除英特尔外的大多数芯片厂商所采用。MIPS无疑是优秀的,但是基于MIPS的处理器我完全不熟知,这里不再展开。
Power架构:
Power架构是由IBM开发的处理器架构,主要应用于服务器、超级计算机和嵌入式系统等领域。Power架构以其高性能和可靠性而著称。PowerPC(Power Personal Computing)是基于Power架构的一种处理器架构,最初由IBM、摩托罗拉(Motorola)和苹果(Apple)共同合作开发。PowerPC架构具有精简、高性能和低功耗的特点,被广泛应用于个人电脑、工作站、服务器和嵌入式系统等领域。虽然PowerPC架构在个人电脑领域的市场份额较小,但在工业控制、航空航天、军事等领域仍然有着重要的应用。Power架构和PowerPC处理器在高性能计算和企业级应用领域表现出色,为用户提供了可靠的计算解决方案。
AVR架构:
AVR架构是由Atmel(后来Microchip Technology收购了Atmel,Microchip)公司开发的一种低功耗、高性能的8位和32位(主要是8位)微控制器架构。AVR架构主要用于嵌入式系统领域,广泛应用于家用电器、智能设备、自动化控制、传感器接口等各种应用场景。相比于ARM,AVR可能并不适用于复杂的应用场景,AVR架构更注重低功耗设计,适合需要长时间运行的电池供电设备和低功耗应用。相比于ARM,AVR架构的微控制器也集成了一些常用的外设,但通常更适用于简单的嵌入式控制和传感器接口,但谈不上是丰富的。ARM架构适用于需要高性能、复杂功能和广泛应用的场景,而AVR架构适用于对低功耗、简单功能和成本敏感的场景。
在手册中找寻字节序的踪迹
包括在 ARM、ST、MicroChip 等官方论坛中,都可以见到 " many Cortex-A (perhaps all) offers big endian support " 诸如此类的说辞。如,点进 ARM 论坛 中,可搜索 Endian…
ST 32 MCU 没有大端?
不谈8位单片机,至少到现在,我没有发现ST的32位芯片中有支持大端字节序的MCU或MPU。而且我咨询过ST的 在线技术支持 ,也没有得到明确的结果。
ST的技术支持隔了一天就给了我回复,表示他们也不知道…
Cortex-M 系列
刚开始我从网络上随意浏览到到信息中,有人说,ARM-M系列是小端,也有人说,它是支持大端的。我先从 ST 意法半导体的 ARM 32位M系列微控制器,下载查看M3相关数据手册,如下,
连续的查看了M3、M4系列的几款MCU的数据手册,几乎如上,它们的AIRCR寄存器中的 Endian位,但都是只读的,并不可写,只能是默认的小端字节序模式。那,这算是支持还是不支持呢?哈哈,有字节序标识位,虽然是只读的,但也说明架构或内核或芯片的开发者是想法的,至少是保留了一种手段。
一份来自ARM论坛的参考,读到,
Cortex-M cpus can be little-endian or big-endian, but it can’t switch between endianess without at least a chip RESET (pick one during board-level design) or possibly a chip re-design (pick when creating the chip.) I’ve never seem anything by little-endian-only chips in the marketplace. See Section A3.3 “Control of endianness in ARMv7-M” in the ARMv7-M Architecture Reference Manual.
正是受到了上边这句话的启发,我去探究了ARM架构和内核的关联,已经整理在了本文的前述章节中。还是以ARM-M3为例,它对应的是ARMv7-M 指令集架构。于是我转移到ARM官网,并从中搜寻下载,M3对应架构的手册 ARMv7-M 架构手册,其中关于字节序的控制说明如下,
如上图,清楚说明了,Armv7-M 指令集架构是支持字节序模式选择的。在(芯片)复位时,通过一个控制输入确定字节序是大端(BE)还是小端(LE),即 AIRCR.ENDIANNESS 位指示字节序。但是这种字节序映射有以下限制:
1、字节序设置仅适用于数据访问。指令获取始终为小端。(划重点)
2、对SCS的所有访问都是小端。SCS 是 System Control Space 缩写,它是在Arm架构处理器中定义的一个特殊地址空间,用于存储系统控制寄存器和与系统控制相关的重要信息,其中包含了一些关键的系统控制寄存器,用于配置和管理处理器的各种功能和特性。
如果需要实现支持大端指令获取,可以在总线结构中实现此功能。具体描述如下,
如上所描述,
Armv7-R 支持以大端和小端格式进行指令获取,格式由系统控制寄存器中的IE位确定。Armv7-M 只支持以小端格式进行指令获取。在需要使用大端指令格式的 Armv7-M 实现中,总线结构必须在半字内提供字节交换。字节交换仅适用于指令获取,不得在数据访问时发生。
Armv7-M和Armv7-R都支持可配置的字节序模型用于数据访问。Armv7-R通过其xPSR和System Control寄存器中的EE位支持动态字节序控制,而 Armv7-M 在复位时是静态配置的。在手册的 A3.3 Endian support 章节中,还详细的描述了在大端和小端字节模式下,字、半字、字节的存储,这算是一种对字节序的权威定义吧,我在《网络通信/大小端字节序由来、决定因素、给编程带来的困扰》中详细讲述了这段,这里仅简单介绍。
至此,我只能说是,手眼所及之处,我没有找到可以真正支持大端字节序的基于ARM-M3内核的处理器芯片。但这并不能代表,不存在基于ARM-M3的支持内存大端字节序的芯片,毕竟我所看到的芯片产品,只是沧海几粟。更重要的原因是,毕竟ARM-M3的根基 Armv7-M 架构,是可以支持大端字节序的。因此,只能说基于 Cortex-M3 或 Cortex-M4 内核的芯片是有可能支持大端字节序的,我现在没找到,即使真的现在不存在,未来也可能有厂商去生产,只要有需求和市场。
Cortex-A 系列
看到网络上有人说,Cortex-A9 内核的处理器是支持大小端字节序设置的,我挺高兴的。因为公司恰好有款开发版,其中搭载了赛灵思(Xilinx)的Zynq 7000芯片。该系列芯片结合了ARM Cortex-A9处理器核心和赛灵思的可编程逻辑资源,提供了高度集成的处理和可编程能力。开始我将重点放在了对 Xilinx 数据手册和产品手册上,但是并没有找到内存字节序Endian的蛛丝马迹。结合前文,我们也可以知道 Cortex-A9 对应的是 Armv7-A 架构,于是我转移了战线,
如下,在ARM开发网站搜搜 Armv7-A 编程手册,
逐步进入 《ARM Cortex-A Series Programmer’s Guide for ARMv7-A 》 Ver4.0 ,下载并打开,查找Endian相关信息,可以发现一大堆,其中不乏关于大小端字节序的有效权威信息。在 Chapter 14 讲移植的章节中,甚至系统详细地讲述了大端和小端系统都有哪些典型案例、字节对齐的案例等,想当初我还是在网络上零散习得类似知识,哎,真有点后悔没早与之相识。谈回本小节的重点,Cortex-A 系列到底是否支持大端字节序,参考上述手册14.1小节的讲述,
如上,Cortex-A系列处理器支持两种端序配置的系统,由CPSR E位控制,该位允许软件动态切换数据的大小端字节序模式。但内存中的指令始终被视为小端序。REV指令可用于在ARM寄存器内部反转字节,提供大端和小端格式之间的简单转换。
我忍不住要再说一遍,《ARM Cortex-A Series Programmer’s Guide for ARMv7-A 》 Ver4.0 ,这个手册绝对是研究大小端字节序的超级优秀资料,干活太多了,如果哪位朋友时间宽裕,建议好好读读。
哈哈,实验室有块 Zynq 7000 的开发板,我却没有从其相关数据手册中找到任何关于大小端设置的寄存器或配置说明。会用这块Zynq板子的人也早就离职了,没有现成的环境,我看了下相关教学视频,太繁杂,要好几十个小时才能入门,我最终还是放弃了。
Cortex-R 系列
我们再倒回头去(后来在 Armv7-M 架构手册中读到的)
Armv7-M和Armv7-R都支持可配置的字节序模型用于数据访问。Armv7-R通过其xPSR和System Control寄存器中的EE位支持动态字节序控制,而 Armv7-M 在复位时是静态配置的。
上述这段话,重新这勾起了我的好奇心。可惜我时间太紧,暂时不能去研读了。这里只是附上 《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》 架构手册,以备后用。
小结
参考 《ARM Cortex-A Series Programmer’s Guide for ARMv7-A 》 Ver4.0 第14.1 章节,
如上所述。ARM核心支持两种模式,但最常用的,通常默认为小端模式。大多数用于ARM的Linux发行版倾向于仅支持小端序。x86架构是小端序的。另一方面,PowerPC或传统的68K通常是大端序,尽管Power架构也可以处理小端序。几种常见的文件格式和网络协议指定了不同的字节序。例如,.BMP和.GIF文件是小端序的,而.JPG是大端序的,TCP/IP是大端序的,但USB和PCI是小端序的。
如上描述,传输和存储,被归为一类,即数据共享。
芯片外设支持大端字节序
在前期查询ARM-M和ARM-A系列的芯片手册时,虽然没有找到可以直接设置内存字节序的寄存器标记位,但是却有了些其他的意外收获。如下列举了在芯片外设层级上支持大端字节序的情况。
DMAC 支持大端字节序的情况
ST 没有ARM-A9的具体产品,之前有,但似乎是停产了,相关文档都标注了废弃,不过我还是打开了其中的一份,找到了一丝丝 endian 的痕迹,如下,
CRC 支持大端字节序的情况
在阅读 microchip公司(2016年以36亿美元收购Atmel公司)的 PIC32MZ EC 是32位嵌入连接系列MCU数据手册时,发现,其采用MIPS microAptiv或 M4K内核,虽然不支持内存大小端字节序配置,如下,
但是在搜索的过程中我发现,这款芯片的 AXI Block RAM(BRAM) Controller 相关章节中,提及到:
DMAC
在查看一些数据手册的时候,我发现有不少产品的DMAC(直接内存访问控制器 )大多是可以配置大小端字节序模式的。后来,也发现SPI、IIS等控制器,很多情况下支持大小端设置。
找到一个大端芯片哦
我嘚瑟了,我终于找到了。哈哈,纯属巧合,最早参与Power微处理架构研制的三大巨头,Apple、IBM、Motorola,一定是最擅长大端字节序系统的吧。我记错了,我想着 Atmel 是其中之一来,哈哈,所以就在MicroChip的网站上,视图能找到一个支持大端字节序的,阴差阳错找到啦。具体的,在MicroChip 产品中按照下图顺序找到 AT32UC3xxxx,
随便打开一个具体型号,如第一个 AT32UC3C0512C,在Doc部分下载并打开 Atmel AVR 32-bit Architecture Manual - Complete Datasheet 手册,搜索Endian,可得,
我还找到了上述产品的最小开发板,倒是不贵,哈哈,可是AVR的调试仿真器,真是逆天的贵,我买不起,于是到此结束。
大端字节序在消亡?
那就消亡呗,反正事实是这样的,哈哈。
相关文章
《CAN总线/CAN应用层协议设计,理解并实践仲裁段位域定义》
《语言基础/分析和实践 C&C++ 位域结构数据类型》
《网络通信/大小端字节序由来、决定因素、给编程带来的困扰》
《存储和传输/探究普通结构和位域结构体数据在内存中的字节对齐规则》
《网络通信/协议栈内网络字节序与主机字节序的转换实现》
《网络编程/在哪些场景中不必要进行网络字节序装换? Windows Sockets: Byte Ordering》