历史上的今天

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

正在发生

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

发布者:RainbowPromise 来源: eefocus关键字:ARM  浮点数  Middle-Endian 手机看文章 扫描二维码
随时随地手机看文章

  摘要:本文描述了嵌入式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软件开发者提供一些有用的帮助。

关键字:ARM  浮点数  Middle-Endian 引用地址:ARM下浮点数Middle-Endian问题的处理

上一篇:基于μC/OS-Ⅱ和ARM的超声波测距系统设计
下一篇:专家浅谈ARM仿真器中的断点资源

推荐阅读

        10月25日,小米在北京故宫举行MIX 3发布会,雷军还发布了一款特别产品——小米MIX 3故宫特别版。昨天晚上,雷军在微博上确认,小米MIX 3故宫特别版将在11月底上市,搭载骁龙845处理器,10GB专享大内存,256GB存储,售价4999元。  据介绍,小米MIX 3采用了携手故宫博物院研制的陶瓷特别色,将来自“霁蓝釉”的色彩灵感,首次融入精密...
(文章来源:中科罗伯特机器人学院) 如今,企业们已经大量的应用了工业机器人,为什么有这么多的企业会选择使用工业机器人来代替人工进行生产呢?在这些生产过程中,工业机器人待敌有着怎么样的优势呢,让我们一起看一下吧。 1、生产效率高,工业机器人生产一件产品耗费的时间是固定的。在同样的生存周期内,使用机械手的产量也是固定的,不会有太大...
无论是居家照明,还是商业照明,我们都大致上将照明设计分为两种:有主灯设计和无主灯设计。有主灯设计指的就是主灯(吊灯、吸顶灯等相对大体型的灯具)+辅灯(台灯、落地灯、壁灯、筒射灯等小体型灯具)的照明搭配,而无主灯设计,则主要是用射灯、筒灯、灯带、辅灯来设计整个空间的照明。 射灯在家装照明中的应用其中,射灯是无主灯设计,甚至是有主灯...
  此前消息称,小米有望于 2021 年末或者 2022 年初举办发布会,正式推出小米 12 系列新旗舰手机,预计会首发高通骁龙 898 SoC。  据微博博主 @数码闲聊站 称,小米两款 SM8450 迭代真旗舰都备案了,2201122C 和 2203121C,新屏幕新影像规格新快充方案…,可能就是小米 12 系列要来了。  骁龙 898 芯片预计采用三星 4nm 工艺制...

史海拾趣

问答坊 | AI 解惑

单结晶体管的管脚判别

单结晶体管又叫双基极二极管,它的符号和外形见附图。 判断单结晶体管发射极E的方法是:把万用表置于R*100挡或R*1K挡... …

查看全部问答∨

(毕业设计)基于FPGA的数据采集系统

暗。。终于把自己都给搞乱了。。一大堆资料 。。一大堆A/D。。到现在都不知道该如何下手了。。。 求哪位大哥大姐。。做个这个题目的给个参考啊。。:Q :\'(…

查看全部问答∨

单片机资料宝典(c版)

单片机资料宝典(c版),实用! …

查看全部问答∨

急需 帮帮我各位大哥大姐

要单片机对第三象限直线插补进行编程…

查看全部问答∨

mcs-51的psw中ov于cy的关系,以及ac的用法

mcs-51的psw中ov于cy的关系,以及ac的用法 初学单片机,请多多指教!!谢谢…

查看全部问答∨

我用creat创建的新对话框为什么只闪了一下就没了

从dialog a创建的,creat(iddof_dialog_b,this)…

查看全部问答∨

风力发电机充电控制

400W风力发电机,需要做一个整流,充电电路,电池是24V100AH,请帮助!…

查看全部问答∨

变频恒压供水的基本知识

一、变频恒压供水的特点1. 节能,可以实现节电20%-40%,能实现绿色用电。2. 占地面积小,投入少,效率高。3. 配置灵活,自动化程度高,功能齐全,灵活可靠。4. 运行合理,由于是软起和软停,不但可以消除水锤效应,而且电机轴 ...…

查看全部问答∨

单片机和C语言学到何种程度可以开始学习嵌入式?

如题,我想学习嵌入式,但是不知道单片机和C语言学到何种程度可以开始学习嵌入式?…

查看全部问答∨

IAR FOR 430中精确软件延时方法

IAR FOR 430中精确软件延时方法 在用单片机的时候常常会用到延时函数,430也不例外,常见的形式有: void delay(unsigned int ms)    {             &nbs ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved