Ivan Karpov | Dreamstime.com
软件更新促销

如何使用Ada来隔离软件和硬件更新

2021年6月25日
Ada的数据表示特性解决了硬件更新中最棘手的问题之一:创建可移植的代码,该代码可以定义具有特定物理布局的数据结构,并与由字节顺序差异引起的问题隔离。

成员可以以PDF格式下载此文章。

你会学到什么:

  • 数据表示如何受硬件更新影响。
  • 如何使用Ada表示子句为数据表示创建可移植规范。
  • 如何使用GNAT的Scalar_storage_order功能来编写endianness-acnostic代码。


希望,你将你的时间和努力倒入的软件将在周围使世界变得更好的地方。但今天的硬件是否足以支持未来的功能和要求?新硬件的Breakneck Pace随着资源增加,推动市场,为担忧提供了一些缓解。但如果它还会导致现有硬件的过时?您的代码库是否可以优雅地迁移到新硬件(即,您是否可以重新编译源代码并期望正确的行为)当更新到达的时间?

出现的一个问题是在编程语言中显式使用非便携式构建;例如,实现依赖于实现或具有未定义或未确定行为的功能。这是一个研究的区域,以及C,C ++和ADA等语言的标准,标识并表征了语义可以表现出这种行为的所有功能。

更巧妙的是,您的代码可能包含关于底层机器架构(位长度,字大小,Endianness等)的隐式假设,如果这些假设不再正确,则代码在为新硬件目标编译时可能会破坏。您的软件的一个常见影响的区域将是其外部接口。通信协议通常以独立于端点的处理器体系结构的方式规定通信链路上的数据和消息格式。内存映射的外部寄存器是规定格式的另一种通信形式。

考虑以大端数据格式定义的IP数据包的具体示例。假设一个现有的系统是大端的,并且需要在网络上传输一个无符号的32位整数。如果现有代码库的实现假设它运行在一个大端机器上,可以简单地提供一个32位无符号整数原语的地址作为字节缓冲区,直接发送到网络。

如果要传输的数字的值是0xDEADBEEF,那么缓冲区在内存中的字节(按照地址递增的顺序)将包含0xDE 0xAD 0xBE 0xEF。不幸的是,相同的代码将在小端机器上编译和运行,但是内存中缓冲区的字节内容将是0xEF 0xBE 0xAD 0xDE,这将被接收器解释为一个完全不同的值(0xEFBEADDE) !

要创建真正可移植的代码,使这种令人头痛的硬件更新成为过去,您需要有工具来允许您在处理外部接口时精确地指定数据在内存中的表示方式。

Ada记录代理条款

Ada擅长的一个方面是,该语言是专门为解决长期存在的嵌入式项目所面临的问题而设计的,这意味着可移植性是主要考虑的问题。为了实现(以及其他好处)改进的可移植性,Ada具有丰富的规范语义,为程序员提供了精确控制数据在内存中的表示方式的工具,甚至包括位!

Ada语言的这个特性被称为记录表示子句.为了理解这个特性,我们将快速介绍a机器标量存储元素.简单地说,存储元素是可寻址内存的最小数量(通常是一个字节),而机器标量是硬件可以有效加载、存储或操作的存储元素的整数倍。

确切的机器标量是实现定义的,并且通常包括8-,16-,32-和64位值。记录表示子句允许程序员精确控制机器标量中的比特将存储异构数据类型的字段(称为ADA中的记录或C / C ++中的结构)。

我喜欢通过示例学习,所以让我们创建并分析用于存储日历日期的数据类型的Ada规范:

子类型Yr_Type是自然范围0 ..127;子类型Mo_Type是自然范围1 ..12;子类型Da_Type自然范围1 ..31日;type Date_Type is record Years_Since_1980: Yr_Type;月:Mo_Type;Day_Of_Month: Da_Type;结束记录; for Date_Type use record Years_Since_1980 at 0 range 0 .. 6; Month at 0 range 7 .. 10; Day_Of_Month at 0 range 11 .. 15; end record;

在Ada惯用方式中,我们声明了自然数的子类型,以定义其有效范围YR_TYPE.Mo_Type,Da_Type.编译器将自动插入运行时代码以确保不会分配无效值。然后使用这些类型来定义记录类型Date_Type

最后,使用该子句使用该子句使用记录指定的关键词Years_Since_1980现场位于第0机器标量的位0到6字段位于第0个机器标量的第7位到第10位,并且Day_Of_Month字段位于第0机器标量的位11到15。请注意,无需明确指定机器标量(与C / C ++位字母相比) - ADA编译器负责制作正确的选择。

在这一点上,那些乐于处理数据表示问题的人可能会问这样的问题:“最不重要位(LSB)是第0位吗?”“存储元素在内存中是如何排序的?”

处理位序和端序

这些问题的答案在重新定位一个具有不同联系的另一个平台的特定方向的遗留硬件中的遗留硬件中的应用程序时尤为重要。如果任何数据通过传统系统存储在内存或持久存储器中,或者需要保留与其他子系统的互操作性,则所有数据结构必须在两个平台上精确相同的表示。如果可移植性是一个问题,则必须使用属性来覆盖实现定义定义的本机位排序和endianness。让我们专注于具有X86_64架构的目标的具体情况。

重要的是要记住,记录表示子句中的组件的位偏移始终相对于一些机器标量。通常,使用换档和掩模操作提取和设置组件值。

要找出给定组件属于哪个机器标量,必须首先标识共享相同机器标量偏移量的组件集。在我们的示例中,这将是所有三个组件,因为它们的偏移量都是0。编译器通过选择其位长大于记录表示子句中为任何字段指定的最大位偏移量的最小机器标量来确定所使用的机器标量。

在本例中,x86_64体系结构提供了一个两字节整数机器标量,编译器将使用它来处理这种数据类型。(如果类型的实例需要比机器标量大小更严格的对齐,则可以单独指定对齐要求。这是一个有趣的主题,在Ada中处理得很好,但是超出了本文的范围。)

位序是指机器标量中位的编号,而端序是指组成机器标量的存储元素的顺序。这些排序是目标硬件的属性,可以是独立的。

机器标量是具有两个重要属性的逻辑实体:

  • 最重要的位始终是最左边的位。
  • 最重要的字节总是最左边的字节。

理解位顺序的关键是要知道,位重要性属性对于机器标量中的任何位范围都有效,而不管它们是如何排序(编号)的。位按从0开始的升序编号,位序简单地定义了用于引用机器标量中的位的数字。存储元素排序(endianness)类似地只是机器标量的字节排序(编号),表明其本身是机器按照升序将字节放入内存。

表1示出了最高有效位为0(缩写MSB0)和最低有效位为0的比特排序之间的差值(缩写LSB0)。它还说明了小端和大端编码之间的存储元件排序的差异。请注意,机器标量位的值相同,并且不会根据排序更改。


当我们想要表示机器标量中特定范围内的位值时,事情就变得有趣了;例如,在我们的Date_Type上面的记录。假设我们想要将“December 12th, 2012”存储在一个对象中Date_Type.的Years_Since_1980字段将具有32个值的值Mo_Type字段将具有12个值,而且Day_Of_Month字段也将具有值12.用于存储机器标量中每个字段的位取决于指定的位顺序将是不同的(表2)


关键的观察结果是,只有用来表示每个字段的位范围发生了变化,但用于编码每个字段的位值,从左到右,在每个位范围内保持不变。从这个意义上说,指定位序可以控制使用机器标量的哪位来编码每个字段。注意,我们仍然不知道内存中的数据布局(即字节的顺序)——这仍然取决于目标的字节顺序。

正是为了克服这个限制,在GNAT Ada、C和c++编译器中引入了Scalar_Storage_Order属性。此属性的作用是覆盖给定记录类型的机器标量中存储元素的顺序,即控制字节顺序。如果已知字节顺序和位序,则完全确定数据的实际内存表示。

有四种可能的位序和端序组合,但GNAT将其限制为Little Endian LSB0和Big Endian MSB0。这两种组合提供了足够的灵活性,使程序员能够完全控制内存中的数据布局。little-endian MSB0和big-endian LSB0的更奇特的组合仍然可以存在,但需要对目标架构进行假设(因此是不可移植的!)

x86_64体系结构本身使用小端和LSB0。指定Date_Type的Bit_Order和Scalar_Storage_Order属性与Ada方面可以产生显示的内存表示表3在这个目标上。


因此,用于大端系统的现有代码可以移植到小端系统,无需任何麻烦,也无需对数据表示进行任何更改——只需在相关的记录类型声明上添加适当的属性定义。在需要完全指定数据表示形式的数据类型上定义了这些属性之后,未来的硬件更新就会变得自动且轻松。这是因为编译器负责生成和插入用于位移、位掩码和字节翻转的运行时代码。

要记住的一件事是,当数据类型的表示规范不同于本机表示时,性能和可移植性之间的权衡。使代码可移植所需的额外运行时代码可能不适用于性能要求较高的代码部分。在这种情况下,为特定目标的体系结构重写代码可能是不可避免的。

结论

以可移植的方式定义物理数据表示不是件容易的事,错误的字节顺序假设是应用程序外部接口错误的常见来源,无论是通过内存映射寄存器还是通信协议。如果应用程序的数据不能在需要时精确地放置在内存中,那么硬件更新可能会被证明是不必要的昂贵、耗时和冒险的。

本文演示如何使用ADA语言和GNAT编译器的功能轻松地将数据类型的内存表示,与基础硬件的外部性无关。这允许程序员开发与硬件迁移风险绝缘的便携式的长寿应用程序。

要了解更多关于ADA的信息,我们鼓励您访问免费的,在线,互动培训网站seath.adacore.com.

从我们的合作伙伴

UCC25640X半桥LLC评估模块

概述。订购并开始开发。TI的标准条款和条件评估项目适用..技术文档。内容是按“原样”提供的……

浅色窗帘上静音功能的规范和使用

2021年5月13日
光幕是一种方便、不引人注目的自动化安全组件,可以保护机器,减少事故。在很多情况下,浅色窗帘可以……

权力完整性特征信心

价格适合任何预算,WaveSurfer 4000HD有更多的能力,比你想象的分析电力轨道,功率排序,和电源管理…

启用5G和机器人的未来

11月18日,2021年

理解和使用e - stop

问:什么是e-stop以及它如何使用?答:E-STOP或紧急停止开关,用于确保机器以及人员安全。他们是使用......

声音你的意见!

本网站要求您注册或登录以发表评论。
目前还没有任何评论。想开始对话吗?

从我们的合作伙伴

UCC25640X半桥LLC评估模块

概述。订购并开始开发。TI的标准条款和条件评估项目适用..技术文档。内容是按“原样”提供的……

浅色窗帘上静音功能的规范和使用

光幕是一种方便、不引人注目的自动化安全组件,可以保护机器,减少事故。在很多情况下,浅色窗帘可以……

权力完整性特征信心

价格适合任何预算,WaveSurfer 4000HD有更多的能力,比你想象的分析电力轨道,功率排序,和电源管理…
1330724©Ian Poole |dreamstime.com.
Dreamstime L 1330724
beplay 5倍流水

检测假冒ICs

12月15日,2021年
Baidu