ARM体系下浮点数Middle-Endian问题的处理_第1页
ARM体系下浮点数Middle-Endian问题的处理_第2页
ARM体系下浮点数Middle-Endian问题的处理_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、    ARM体系下浮点数Middle-Endian问题的处理随着嵌入式微处理器芯片性能的日益提高,嵌入式设备也得到了广泛的应用。随着应用的扩展,嵌入式软件开发也呈现出功能多样化、平台多样化、体系结构多样化的特点。由于可移植性好,相当一部分嵌入式软件都是用CC+语言开发的,而CC+语言编写的程序中数据存储字节顺序是与编译平台所用的CPU相关的,所以嵌入式软件移植过程中,数据存储字节顺序是需要重点处理的地方。在嵌入式GIS软件从x86体系结构下移植到ARM体系结构的过程中    随着嵌入式微处理器芯片性能的日益提高,嵌入式设备

2、也得到了广泛的应用。随着应用的扩展,嵌入式软件开发也呈现出功能多样化、平台多样化、体系结构多样化的特点。    由于可移植性好,相当一部分嵌入式软件都是用CC+语言开发的,而CC+语言编写的程序中数据存储字节顺序是与编译平台所用的CPU相关的,所以嵌入式软件移植过程中,数据存储字节顺序是需要重点处理的地方。    在嵌入式GIS软件从x86体系结构下移植到ARM体系结构的过程中,遇到了浮点数据存储字节顺序的问题。该问题既不是Big-Endian,也不是Little-Endian,而是Middle-Endian字节顺序。本文先介绍该嵌入

3、式GIS软件开发平台和运行平台,再对移植过程中遇到的问题进行跟踪和分析。找到问题根源,最终给出两种解决方案。1 嵌入式GIS软件    嵌入式GIS软件是用C+语言开发的,运行在PDA上的嵌入式软件。该软件系统结构如图l所示。    在以嵌入式硬件设备为硬件平台的基础上,内核版本为2430的嵌入式Linux操作系统和QTEmbedded图形界面开发包构成了嵌入式GIS软件的软件平台。嵌入式GIS软件通过第三方库GDALOGR,提供对多种格式(如Shapefile、mapinfo)等矢量电子地图的读取操作。  

4、60; 嵌入式GIS软件的运行平台是以ARM920T为处理器的三星公司的SMDK开发板。电子地图数据来自官方发布的某区域电子地图数据。    嵌入式GIS软件在x86上调试通过后,使用2953版本的arm-linux-gcc编译器交义编译嵌入式GIS软件和其他组件;最终将该软件移植到SMDK上运行。    移植到SMDK开发板上之后,嵌入式GIS软件能够正常显示软件框架;在读取Shapefile格式电子地图时,进入死循环状态。根据debug信息显示,嵌入式GIS软件所读取的Shapefile电子地图显示范围的4个double类型数值,

5、与X86下读取的数值不一致。例如,Shapefile文件中的数据为-3383 700,而在ARM平台下凄出的数值则为749530le+68。ARM体系结构下读出的错误数据将导致嵌入式GIS软件运行时逻辑出错,不能正确最示电子地图。2 Middle-Endian    在不同的体系结构之问移植嵌入式软件时,数据存储字节顺序是需要处理的问题之一。    提到数据存储字节顺序,就要提到Big-Endian和Little-Endian。在各个体系结构处理器设计之初,Big-Endian和Little-Endian的分歧就一直存在,它们代表着每

6、个字节在不同体系结构下的不同存储方式。如图2所示,数值0x1234ABCD在不同的字节顺序下具有不同存储顺序。    字节顺序的不同,经常导致读取跨平台的文件数据不一致。针对嵌入式GIS软件移植过程中发生的数据不一致问题,对ARM体系结构的字节顺序进行了测试,方法如下:    return(htonl(1)=1)?BIG:LITTLE;    测试结果显示,ARM同x86一样采用的是Little-Endian字节顺序存储数据,并不存在Big-Endilan和Lit-tle-Endian之间转换不当的问题。

7、    使用简单的二进制数据文件模拟x86下的Shapefile 文件。在x86体系结构下,分别在二进制文件中写入int、f1oat和double类型数据,得到x86下的数据文件。将该数据文件转移到SMDK开发板上,读取该数据文件中的数值并打印。    测试结果显示ARM体系结构下读取x86体系结构下生成的二进制文件,int和float类型数据与x86体系结构下一致,只有double类型数据不一致。经过进一步验证,将double类型数据以十六进制形式打印,就可以发现问题的关键,如图3所示。   

8、 同样的double类型数据0x1234 ABCD,在ARM体系结构下读出变成0xABCD1234。所以在ARM平台下读取的地图数据发生了变化,导致嵌入式GIS软件逻辑判断出错,不能正确运行。    原来ARM处理器对浮点数double类型的存储不支持IEEE标准,既不是Litrlc-Endian字节顺序,也不是Big-Endian字节顺序。在ARM平台下,每个double类型分为两个字,每个字内部采用Little Endian字节顺序,而两个字之间采用Big Endian字节顺序组织,即MiddleEndian字节顺序。    目前

9、还不能通过硬件或者软件调节改变ARM体系结构对double类型数据的存储顺序,因此,对于类似嵌入式GIS软件这样需要读取其他体系结构平台下生成的二进制文件的程序,都需要对double类型数据的存储顺序进行处理。3 解决方案    针对ARM体系结构下double类型数据存储的Middle-Endian问题,有两种解决方案。(1)修改跨体系结构数据文件    将跨体系结构文件中的double类型数据改成用文本格式存储。文本格式在跨体系结构的传输中不会改变其存储格式,从而保证读取的数据一致。但是嵌入式GIS软件的数据是官方发布的数据,很难

10、对其进行修改,所以在本软件中这种方法不适用。(2)应用程序中添加Middle-Endian处理    同Little-Endian和Big-Endian的处理类似,在底层代码中,凡是涉及double类型的数据读写操作,都要事先对double类型的数据进行调换,以保证double类型数据存储的跨体系结构一致性。    嵌入式GIS软件是通过调用GDALOGR中的shpopenc文件提供的函数对Shapefile文件进行读写操作的。所以在shpopen.c文件中添加对Middle-Endian字节顺序进行判断的函数void EndianT

11、ype(void),代码如下:    通过对浮点数1982031在软件运行平台下的十六进制数值和其在x86下十六进制数值的比较,确定该运行平台是何种字节顺序。    经过验证,一旦该平台采用Middle-Endian字节顺序存储double类型数据,则可利用函数“void SwapWord(int length,dout)e*dValue);”对double类型数据进行交换,以获取正确的存储顺序。代码如下:       经过修改后的sbpopenc文件,增加了对ARM体系结构下Middle-Endian字节顺序的支持,最终解决了Micidle-Endian的问题,能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论