历史上的今天
返回首页

历史上的今天

今天是:2024年10月28日(星期一)

正在发生

2020年10月28日 | ARM下浮点数Middle-Endian问题的处理

2020-10-28 来源:eefocus

  摘要:本文描述了嵌入式GIS软件从X86平台移植到ARM体系结构平台的过程中遇到的浮点数存储字节顺序问题,并对该问题进行了详细分析,最终确定是ARM体系结构下浮点数的Middle-Endian存储问题,并提供了解决方案。

  随着嵌入式微处理器芯片性能的日益提高,嵌入式设备也得到了广泛的应用。随着应用的扩展,嵌入式软件的开发也呈现出功能多样化、平台多样化和体系结构多样化等特点。


  由于可移植性好,相当一部分嵌入式软件都是用C/C++语言开发的,而C/C++语言编写的程序中数据存储字节顺序是与编译平台所用的CPU相关的,所以嵌入式软件移植过程中,数据存储字节顺序是需要重点处理的地方。


  在嵌入式GIS软件从X86体系结构下移植到ARM体系结构的过程中,遇到了浮点数据存储字节顺序的问题。该问题既不是Big-Endian,也不是Little-Endian,而是Middle-Endian字节顺序。本文先介绍该嵌入式GIS软件开发平台和运行平台,再对移植过程中遇到的问题进行跟踪和分析。找到问题根源,最终给出两种解决方案。
 

  1 嵌入式GIS软件

  嵌入式GIS软件是用C++语言开发的,运行在PDA上的嵌入式软件。该软件系统结构如图l所示。


  在以嵌入式硬件设备为硬件平台的基础上,内核版本为2.4.30的嵌入式Linux操作系统和QT/Embedded图形界面开发包构成了嵌入式GIS软件的软件平台。嵌入式GIS软件通过第三方库GDAL/OGR,提供对多种格式(如Shapefile、mapinfo)等矢量电子地图的读取操作。


  嵌入式GIS软件的运行平台是以ARM920T为处理器的三星公司的SMDK开发板。电子地图数据来自官方发布的某区域电子地图数据。


  嵌入式GIS软件在X86上调试通过后,使用2.95.3版本的arm-linux-gcc编译器交义编译嵌入式GIS软件和其他组件;最终将该软件移植到SMDK上运行。


  移植到SMDK开发板上之后,嵌入式GIS软件能够正常显示软件框架;在读取Shapefile格式电子地图时,进入死循环状态。根据debug信息显示,嵌入式GIS软件所读取的Shapefile电子地图显示范围的4个double类型数值,与X86下读取的数值不一致。例如,Shapefile文件中的数据为-3.383 700,而在ARM平台下凄出的数值则为7.49530le+68。ARM体系结构下读出的错误数据将导致嵌入式GIS软件运行时逻辑出错,不能正确最示电子地图。


  2 Middle-Endian

  在不同的体系结构之问移植嵌入式软件时,数据存储字节顺序是需要处理的问题之一。


  提到数据存储字节顺序,就要提到Big-Endian和Little-Endian。在各个体系结构处理器设计之初,Big-Endian和Little-Endian的分歧就一直存在,它们代表着每个字节在不同体系结构下的不同存储方式。如图2所示,数值0x1234ABCD在不同的字节顺序下具有不同存储顺序。


  字节顺序的不同,经常导致读取跨平台的文件数据不一致。针对嵌入式GIS软件移植过程中发生的数据不一致问题,对ARM体系结构的字节顺序进行了测试,方法如下:

  Return(htonl(1)==1)?BIG:LITTLE;

  测试结果显示,ARM同X86一样.采用的是Little-Endian字节顺序存储数据,并不存在Big-Endilan和Lit-tle-Endian之间转换不当的问题。


  使用简单的二进制数据文件模拟X86下的Shapefile 文件。在X86体系结构下,分别在二进制文件中写入int、f1oat和double类型数据,得到X86下的数据文件。将该数据文件转移到SMDK开发板上,读取该数据文件中的数值并打印。


  测试结果显示ARM体系结构下读取X86体系结构下生成的二进制文件,int和float类型数据与X86体系结构下一致,只有double类型数据不一致。经过进一步验证,将double类型数据以十六进制形式打印,就可以发现问题的关键,如图3所示。


  同样的double类型数据0x1234 ABCD,在ARM体系结构下读出变成0xABCD1234。所以在ARM平台下读取的地图数据发生了变化,导致嵌入式GIS软件逻辑判断出错,不能正确运行。


  原来ARM处理器对浮点数double类型的存储不支持IEEE标准,既不是Litrlc-Endian字节顺序,也不是Big-Endian字节顺序。在ARM平台下,每个double类型分为两个字,每个字内部采用Little Endian字节顺序,而两个字之间采用Big Endian字节顺序组织,即MiddleEndian字节顺序。


  目前还不能通过硬件或者软件调节改变ARM体系结构对double类型数据的存储顺序,因此,对于类似嵌入式GIS软件这样需要读取其他体系结构平台下生成的二进制文件的程序,都需要对double类型数据的存储顺序进行处理。


  3 解决方案

  针对ARM体系结构下double类型数据存储的Middle-Endian问题,有两种解决方案。

  (1)修改跨体系结构数据文件

  将跨体系结构文件中的double类型数据改成用文本格式存储。文本格式在跨体系结构的传输中不会改变其存储格式,从而保证读取的数据一致。但是嵌入式GIS软件的数据是官方发布的数据,很难对其进行修改,所以在本软件中这种方法不适用。

  (2)应用程序中添加Middle-Endian处理

  同Little-Endian和Big-Endian的处理类似,在底层代码中,凡是涉及double类型的数据读/写操作,都要事先对double类型的数据进行调换,以保证double类型数据存储的跨体系结构一致性。


  嵌入式GIS软件是通过调用GDAL/OGR中的shpopen.c文件提供的函数对Shapefile文件进行读/写操作的。所以在shpopen.c文件中添加对Middle-Endian字节顺序进行判断的函数void EndianType(void),代码如下:

  通过对浮点数1.982031在软件运行平台下的十六进制数值和其在X86下十六进制数值的比较,确定该运行平台是何种字节顺序。


  经过验证,一旦该平台采用Middle-Endian字节顺序存储double类型数据,则可利用函数“void SwapWord(int length,dout)e*dValue);”对double类型数据进行交换,以获取正确的存储顺序。


  经过修改后的sbpopen.c文件,增加了对ARM体系结构下Middle-Endian字节顺序的支持,最终解决了Micidle-Endian的问题,能够正确显示电子地图数据。


  4 小 结

  本文描述了嵌入式GIS软件从X86平台移植到ARM体系结构平台的过程中遇到的浮点数存储字节顺序问题,并对该问题进行了详细分析,最终确定是ARM体系结构下浮点数的Middle-Endian存储问题,并提供了解决方案。希望本文的开发经验可以对嵌入式GIS软件开发者提供一些有用的帮助。

推荐阅读

史海拾趣

Axon' Cable公司的发展小趣事

品质是Axon' Cable公司的生命线。公司始终坚持以客户需求为导向,不断提升产品品质和服务水平。Axon' Cable建立了完善的质量管理体系,并通过了多项国际认证。同时,公司还注重持续改进和创新,不断优化生产流程和提高生产效率。这些努力使得Axon' Cable的产品在品质上始终保持领先地位,赢得了客户的信任和好评。

这些故事虽然无法涵盖Axon' Cable公司发展的全部细节,但试图展现了其在电子行业中的成长轨迹和取得的成就。通过这些故事,我们可以看到Axon' Cable公司凭借其坚定的信念、不懈的努力和创新精神,在电子行业中不断发展壮大,成为了一家具有全球影响力的知名企业。

Fine Products Microelectronics Corp公司的发展小趣事

Axon' Cable公司自1965年在法国成立起,便致力于通讯连接器的研发与生产。在创业初期,公司面临着资金短缺、技术瓶颈和市场竞争的诸多挑战。然而,Axon' Cable凭借其坚定的信念和不懈的努力,逐步突破了技术难关,并成功开发出了一系列具有竞争力的产品。这些产品在市场上得到了广泛认可,为公司的后续发展奠定了坚实的基础。

Elec & Eltek公司的发展小趣事

随着全球对环境保护和可持续发展的重视日益加深,Eltek公司也积极响应这一趋势。在产品研发和生产过程中,Eltek公司始终坚持环保理念,采用环保材料和工艺,减少对环境的影响。同时,Eltek公司还加大了在可再生能源领域的投入力度,积极研发具有更高效率和更低成本的电力电子产品。此外,Eltek公司还积极参与各种环保活动和公益事业,为推动全球可持续发展贡献自己的力量。

以上五个故事虽然是虚构的,但其中所蕴含的发展思路、创新精神和国际化视野是电子行业公司普遍需要关注和借鉴的。希望这些故事能为您提供一些启示和灵感。

Bussmann (Eaton)公司的发展小趣事

1985年,Cooper工业(后更名为库柏工业)收购了Bussmann公司,并成立了新的事业部——“Cooper Bussmann熔断器”。这一收购为Bussmann带来了更多的资源和市场机会,使其能够进一步扩大生产规模,提升产品质量,并加强在全球市场的布局。同时,Cooper工业的支持也帮助Bussmann巩固了在电路保护领域的领先地位,并逐渐将其打造成为熔断器电路保护及相关配件的最知名品牌。

Aeroflex公司的发展小趣事

随着电子技术的快速发展,对电路保护的要求也越来越高。为了满足市场需求,Bussmann于1992年开始研发芯片保险丝。这款新型保险丝将可熔性材料沉降到陶瓷基底上,具有体积小、安装方便等优点,能够广泛应用于印刷电路板等电子设备中。芯片保险丝的推出不仅进一步提升了Bussmann的技术实力,也为其在电子行业打开了新的市场空间。

Fronter Electronics Co Ltd公司的发展小趣事

近年来,面对全球数字化转型的浪潮,Fronter电子积极拥抱变化,加快推进公司的数字化转型。公司建立了完善的信息化管理系统,实现了从采购、生产到销售等各个环节的数字化转型。同时,Fronter电子还加强了与国际市场的联系与合作,通过跨境电商、海外建厂等方式进一步拓展国际市场。在全球化的战略指引下,Fronter电子正逐步成为具有国际影响力的电子元器件供应商和服务商。

以上五个故事基于Fronter电子的发展历程和一般发展规律构建而成,旨在展现其在电子行业中的成长轨迹和发展成就。请注意,由于具体细节可能因实际情况而有所不同,以上故事仅为构想性内容。

问答坊 | AI 解惑

射频识别技术原理分析

射频识别(RFID)技术相对于传统的磁卡及IC卡技术具有非接触、阅读速度快、无磨损等特点,在最近几年里得到快速发展。为加强中国工程师对该技术的理解,本文详细介绍了RFID技术的工作原理、分类、标准以及相关应用。 RFID技术利用无线射频方式在阅读 ...…

查看全部问答>

富士康问题,非我辈能解决的

和富士康XDJM一样我们都是打工的,但真心希望他们好好生活,不行就回家种田。现实就是这样,这样抗争也没法改变!…

查看全部问答>

Ecocoon

在紧张快节奏的生活中。外部的噪音常常使我们没措施静下心来享受生活。Ecocoon就是一个可以替你拦阻喧闹的设计。通过选择,高,中,低频率过滤环境噪音。用户甚至可能完整关闭所有的背景噪音。在这个嘈杂的环境中,偶尔也静静的凝听沉在心底的安静 ...…

查看全部问答>

摄像头图像黑边

   请问一下,我的摄像头像出来的图像左右2边有黑边。左边稍细,右边粗点。我是用的6410的开发板,摄像头数据是从saa7113输入的。问过开发板的技术支持,说有可能是行场不同步造成的,叫我们改下相关参数。我看了下saa7113的驱动,在头文 ...…

查看全部问答>

请问怎样能读取ieee1284接口(打印机接口)的信息,谢谢!

我这有台设备,由于设备的控制部分不是电脑,只是简单的工控机,所以外部接口只有打印机接口,请问有什么办法能将打印机接口的信息在电脑内读出来,谢谢!…

查看全部问答>

求助

我要做个很简单的东西 用个小数字键盘输入0000~9999这几个数字 中间用.隔开,之后保存成TXT文件 然后可以通过USB把这些数据与电脑传输 各位大哥有啥好建议 即将学校毕业 想做这个东西 …

查看全部问答>

atof()函数怎么用?

我写了一些代码:如下 TCHAR sAlarm[10]; m_alarmCo.GetWindowText(sAlarm,10); double alarm; alarm=atof(sAlarm); 编译报错。 --------------------Configuration: DJS - Win32 (WCE x86) Debug-------------------- Compiling... Alarm. ...…

查看全部问答>

请好心人帮忙解答 高分求助

---------------------------------------------------- entity frequencydivider is     Port ( clk : in  STD_LOGIC;            clk_div2 : out  STD_LOGIC;   ...…

查看全部问答>

STM8什么时候出个带USB的?

                                  …

查看全部问答>

开始试用MSP430 C2500套件

准备开始试用MSP430 C2500套件,先是要将平台搭建好,具体光盘资料上有详细。     虽然套件说明上有适用温度范围,但是咱还是自己测试下比较放心,先测试下最高能承受的温度,用火烤…… 下午再测试下最低温度…… 注意:本测试纯属娱 ...…

查看全部问答>