ARM9的GPS定位程序在Linux26下的移植毕业设计.docx
《ARM9的GPS定位程序在Linux26下的移植毕业设计.docx》由会员分享,可在线阅读,更多相关《ARM9的GPS定位程序在Linux26下的移植毕业设计.docx(30页珍藏版)》请在冰豆网上搜索。
ARM9的GPS定位程序在Linux26下的移植毕业设计
ARM9的GPS定位程序在Linux2.6下的移植
摘要
随着生活节奏的日益加快,人们把越来越多的精力投入到了工作之中,对于子女尤其是儿童的照顾就显得力不从心了。
现代通信技术的发展,已经可以使这样的设计实现——利用GPS定位。
GPS具有高效的定位功能,定位频率高,误差小。
嵌入式设备功能强大、可靠性高,开源的Linux操作系统又为其添加了新的生命力。
该GPS程序之前在博创2.4开发平台上运行正常,但是考虑到2.6版本比2.4版本有更多的功能函数等优势,在参考了大量资料后,将博创2.4平台升级为2.6版本。
但是由于版本不同的问题,程序在2.6平台上运行不正常,于是翻看了大量资料,对其进行了移植工作。
关键词:
儿童定位; GPS; Linux; 移植
ABSTRACT
Asthepaceoflifequickening,peopleputmoreenergyintowork,especiallychildren'scareforchildrenisnot.Thedevelopmentofmoderncommunicationtechnology,havebeenabletomakesuchadesign-usingGPS.GPSpositioningfunctionishigh,thelocationofhighfrequencyandsmallerror.Embeddeddeviceshasstrongfunction,highreliability,theopen-sourceLinuxoperatingsystemandtoaddanewvitality.
TheGPSprogrambeforerunningon2.4developmentplatform,butgiventhe2.6versionhasmorefeaturesthanversion2.4functionadvantages,inreferencetoalargeamountofinformation,willhavea2.4platformupgradetoversion2.6.Butversionduetothedifferentproblems,programsrunon2.6platformisnotnormal,thenflickingthroughalargeamountofdata,ontheportingeffort.
Keywords:
children'spositioning;GPS;Linux;transplant
引言
随着生活节奏的加快,人们把越来越多的精力投入到了工作之中,对于子女尤其是儿童的照顾就显得力不从心了。
很多儿童的意外就是在无人看管的情况下发生的。
因此,一种能够监控儿童活动情况并能够实时和家长互通的系统的开发就显得很有必要了。
当父母离开时,该系统可将儿童的位置信息传送到父母携带的接收设备中,使家长对儿童的具体情况能及时掌握,从而达到避免意外事件的发生的目的。
目前,国内外厂商已经研发出该类产品,市场前景广阔。
因此,儿童定位系统设计所研究的问题是具有实际的意义的。
本次毕业设计—ARM9的GPS定位程序在Linux2.6下的移植,对博创开发平台进行了升级,并针对版本不同对端口及内核进行了分析,对该程序进行了移植。
本论文共五章,第一章为绪论,主要概述儿童定位的现状及发展前景;第二章开发平台简介,主要介绍博创开发平台;第三章为开发工具软件的安装与配置,介绍其软件环境;第四章为开发平台升级,说明了2.4版本与2.6版本在驱动上的区别;第五章为GPS,主要说明GPS的实现原理和接口。
1 绪论
1.1 儿童定位系统背景及应用现状
随着生活节奏的日益加快,人们把越来越多的精力投入到了工作之中,对于子女尤其是儿童的照顾就显得力不从心了。
儿童的很多意外都是在无人看管的情况下发生的。
因此,一种能够实时监护儿童的日常活动,并可以及时和家长通信的系统的设计就显得很有必要了。
当父母离开时,该系统可将儿童的位置、活动范围、声音等信息传送到父母携带的接收设备中,使家长对儿童的具体情况能及时掌握,从而达到避免意外事件的发生的目的。
目前,国内外厂商已经研发出该类产品,市场前景广阔。
因此,儿童定位系统设计所研究的问题是具有实际的意义的。
现代通信技术的发展,已经可以使这样的设计实现——利用GPS定位、GSM通信、QT、嵌入式Linux平台进行系统的设计。
GPS(GlobalPositioningSystem-全球定位系统)是在海、陆、空进行全方位实时三维导航与定位的新一代卫星导航与定位系统。
GPS具有高效的定位功能,定位频率高,误差小等优点。
GPS由三个独立的部分组成【1】:
空间部分:
21颗工作卫星,3颗备用卫星。
地面支撑系统:
1个主控站,3个注入站,5个监测站。
用户设备部分:
接收GPS卫星发射信号,以获得必要的导航和定位信息,经数据处理,完成导航和定位工作。
GPS接收机硬件一般由主机、天线和电源组成。
Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。
Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。
严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统【1】。
1.2 所需做的工作
基于Linux操作系统的应用开发环境是由开发板和pc机所构成。
目标硬件开发板用于运行操作系统的内核编译、应用程序的开发和调试则需要通过pc机来完成。
实现交叉编译。
因为Linux版本问题以及开发平台的不同,需要自己摸索和修改。
首先需要查找有关于系统升级的资料[1],了解升级方法和步骤,搭建平台,为程序移植做准备。
所谓Linux移植就是把Linux操作系统针对具体的目标平台做必要改写之后,安装到该目标平台使其正确的运行起来。
这个概念目前在嵌入式开发领域讲的比较多。
其基本内容是:
获取某一版本的Linux内核源码,根据我们的具体目标平台对这源码进行必要的改写(主要是修改体系结构相关部分),然后添加一些外设的驱动,打造一款适合于我们目标平台(可以是嵌入式便携设备也可以是其它体系结构的PC机)的新操作系统,对该系统进行针对我们目标平台的交叉编译,生成一个内核映象文件,最后通过一些手段把该映象文件烧写(安装)到我们目标平台中。
而通常对Linux源码的改写工作难度较大,它要求你不仅对Linux内核结构要非常熟悉,还要求你对目标平台的硬件结构要非常熟悉。
同时还要求你对相关版本的汇编语言较熟悉,因为与体系结构相关的部分源码往往是用汇编写的。
所以这部分工作一般由目标平台提供商来完成。
比如说针对目前嵌入式系统中最流行的ARM平台,它的这部分工作就是由英国ARM公司的工程师完成的,我们所要做的就是从其网站上下载相关版本Linux内核的补丁(Patch)。
把它打到我们的Linux内核上,再进行交叉编译就行。
升级成功后根据移植步骤,首先了解GPS接口原理和各个管教的函数定义及其参数设置,包括串口连接的方式。
其次,还要更深入的了解其内核设置,对内核驱动有个详细的了解,学习两个版本的区别。
最后将程序成功调试出来。
2 硬件平台系统简介
2.1 博创平台简介
本次毕设所使用的硬件系统为博创UP-CUPS2410/P270嵌入式开发平台如图2-1,这是一款经典的嵌入式开发平台,拥有许多有用的功能模块可供我们进行系统开发。
由北京博创兴业科技有限公司开发的UP-NetARM3000、UP-NetARM2410系列以及UP-TECHPXA270系列实验仪器。
UP-NetARM3000的CPU为ARM7TDMI内核的三星S3C44B0X01芯片,由于没有MMU(内存管理单元)只能运行uClinux,UP-NetARM2410系列的CPU为ARM920T内核的三星S3c2410芯片。
UP-TECHPXA270系列实验仪器为IntelXscale系列的PXA270CPU。
其中USB主口可选择的模块有蓝牙模块和摄像头模块;168pin扩展插槽的可选模块有GPS+GPRS模块,FPGA模块和CAN节点模块。
本课题所使用的模块就是GPS+GPRS模块。
图2-1博创平台
2.2 嵌入式Linux简介
Linux正在嵌入式开发领域稳步发展。
Linux使用GPL,所有对特定开发板、PDA、掌上机、可携带设备等使用嵌入式Linux感兴趣的人都可以从因特网上免费下载其内核和应用程序,并开始移植和开发。
许多Linux改良品种迎合了嵌入式市场,它们包括RTLinux(实时Linux)、uclinu(用于非MMU设备的Linux)、MontavistaLinux(用于ARM、MIPS、PPC的Linux分发版)、ARM-Linux(ARM上的Linux)和其它Linux系统。
嵌入式Linux的发展比较迅速。
NEC、索尼已经在销售个人视频录像机等基于Linux的消费类电子产品,摩托罗拉则计划在其未来的大多数手机上使用Linux,IBM也制定了在手持机上运行Linux的计划。
数年来,“Linux标准库”组织一直在从事对在服务器上运行的Linux进行标准化的工作,现在,嵌入式计算领域也开始了这一工作。
嵌入式Linux标准吸引了“Linux标准库”以及Unix组织中有益的元素。
2.3 GPS模块简介
GPS(GlobalPositioningSystem-全球定位系统)
GPS的主要优点包括:
(1)全球,全天候工作:
能为用户提供连续,实时的三维位置,三维速度和精密时间。
不受天气的影响。
(2)定位精度高:
单机定位精度优于10米,采用差分定位,精度可达厘米级和毫米级。
(3)功能多,应用广:
目前已广泛的应用于大地测量、工程测量、航空摄影测量、运载工具导航和管制、地壳运动监测、工程变形监测、资源勘察、地球动力学等学科领域。
GPS由三个独立的部分组成:
空间部分:
21颗工作卫星,3颗备用卫星。
地面支撑系统:
1个主控站,3个注入站,5个监测站。
用户设备部分:
接收GPS卫星发射信号,以获得必要的导航和定位信息,经数据处理,完成导航和定位工作。
GPS接收机硬件一般由主机、天线和电源组成。
2.3.1 GPS实现原理
GPS定位的基本原理是根据高速运动的卫星瞬间位置作为已知的起算数据,采用空间距离后方交会的方法,确定待测点的位置。
如图所示,假设t时刻在地面待测点上安置GPS接收机,可以测定GPS信号到达接收机的时间△t,再加上接收机所接收到的卫星星历等其它数据可以确定以下四个方程式,如图2-1
、
图2-1GPS实现原理方程
上述四个方程式中待测点坐标x、y、z和Vto为未知参数,其中di=c△ti(i=1、2、3、4)。
di(i=1、2、3、4)分别为卫星1、卫星2、卫星3、卫星4到接收机之间的距离。
△ti(i=1、2、3、4)分别为卫星1、卫星2、卫星3、卫星4的信号到达接收机所经历的时间。
c为GPS信号的传播速度(即光速)。
四个方程式中各个参数意义如下:
x、y、z为待测点坐标的空间直角坐标。
xi、yi、zi(i=1、2、3、4)分别为卫星1、卫星2、卫星3、卫星4在t时刻的空间直角坐标,可由卫星导航电文求得。
Vti(i=1、2、3、4)分别为卫星1、卫星2、卫星3、卫星4的卫星钟的钟差,由卫星星历提供。
Vto为接收机的钟差。
由以上四个方程即可解算出待测点的坐标x、y、z和接收机的钟差Vto。
目前GPS系统提供的定位精度是优于10米,而为得到更高的定位精度,通常采用差分GPS技术:
将一台GPS接收机安置在基准站上进行观测。
根据基准站已知精密坐标,计算出基准站到卫星的距离改正数,并由基准站实时将这一数据发送出去。
用户接收机在进行GPS观测的同时,也接收到基准站发出的改正数,并对其定位结果进行改正,从而提高定位精度。
如图2-2
图2-2GPS
2.3.2 GPS接口
接口特性如下:
RS-232输出,可输入RS232或者具有RS-232极性的TTL电平。
可选的波
特率为:
300、600、1200、2400、4800、9600、19200。
串口输出协议:
输出NEMA0183格式的ASCII码语句,输出:
GPALM,GPGGA,GPGLL,GPGSA,GPGSV,GPRMC,GPVTG(NMEA标准语句);PGRMB,PGRME,PGRMF,PGRMM,PGRMT,PGRMV(GARMIN定义的语句)。
还可将串口设置为输出包括GPS载波相位数据的二进制数据。
输入:
初始位置、时间、秒脉冲状态、差分模式、NMEA输出间隔等设置信息。
在缺省的状态下,GPS模块输出数据的波特率为4800,输出信息包括:
GPRMC、GPGGA、GPGSA、GPGSV、PGRME等,每秒钟定时输出。
3 开发工具软件与系统软件部分
3.1 儿童定位系统程序框图
整个儿童定位系统程序框图如图3-1所示,本次毕业设计主要研究GPS模块。
图3-1儿童定位系统程序框图
3.2 开发工具软件的安装
参考linux虚拟机使用说明里的Samba服务器的的配置。
参照执行安装环境脚本命令:
./install安装脚本程序将自动建立/arm2410cl目录,并将所有开发软件包安装到/arm2410cl目录下,同时自动配置编译环境,建立合适的符号连接。
注意:
安装完成后看一下主编译器Armv4l-unknown-linux-gcc是否在
/opt/host/armv4l/bin/,如果不是这个路径,请使用vi修改/root/.bash_profile文件中PATH变量为PATH=$PATH:
$HOME/bin:
/opt/host/armv4l/bin/,存盘后执行:
source/root/.bash_profile,则以后armv4l-unknown-linux-gcc会自动搜索到,可以在终端上输入armv,然后按tab键,会自动显示armv4l-unknown-linux-
3.3 开发环境配置
配置网络,包括配置IP地址、NFS服务、防火墙。
网络配置主要是要安装好以太网卡,对于一般常见的RTL8139网卡,REDHAT9.0可以自动识别并自动安装好,完全不要用户参与,因此建议使用该网卡。
然后配置宿主机IP为192.168.0.121。
双击设备eth0的蓝色区域,进入以太网设置界面,对于REDHAT9.0,它默认的是打开了防火墙,因此对于外来的IP访问它全部拒绝,这样其它网络设备根本无法访问它,即无法用NFSmount它,许多网络功能都将无法使用。
因此网络安装完毕后,应立即关闭防火墙。
操作如下:
点击红帽子开始菜单,选择安全级别设置,选中无防火墙。
在系统设置菜单中选择服务器设置菜单,再选中服务菜单,将iptables服务的勾去掉,并确保nfs选项选中。
配置NFS:
点击主菜单运行系统设置->服务器设置->NFS服务器(英文为:
SETUP->SYSTEMSERVICE->NFS),点击增加出现如下在界面,在目录(Drictory):
中填入需要共享的路径,在主机(Hosts):
中填入允许进行连接的主机IP地址。
并选择允许客户对共享目录的操作为只读(Read-only)或读写(Read/write)。
配置完成后,可用如下办法简单测试一下NFS是否配置好了:
在宿主机上自己mount自己,看是否成功就可以判断NFS是否配好了。
例如在宿主机/目录下执行:
mount192.168.0.10:
/arm2410cl/mnt其中192.168.0.10应为主机的IP地址。
然后到/mnt/目录下看是否可以列出/arm2410cl目录下的所有文件和目录,可以则说明mount成功,NFS配置成功。
3.4 超级终端
超级终端是一个通用的串行交互软件,很多嵌入式应用的系统有与之交换的相应程序,通过这些程序,可以通过超级终端与嵌入式系统交互,使超级终端成为嵌入式系统的“显示器”。
超级终端的原理是将用户输入随时发向串口(采用TCP协议时是发往网口,这里只说串口的情况),但并不显示输入。
它显示的是从串口接收到的字符。
所以,嵌入式系统的相应程序应该完成的任务便是:
1、将自己的启动信息、过程信息主动发到运行有超级终端的主机;
2、将接收到的字符返回到主机,同时发送需要显示的字符(如命令的响应等)到主机。
3、在单片机开发时使用。
如图3-2所示
图3-2设置步骤
将波特率设为115200,数据流控制设为无。
3.5 FlashFXP
FlashFXP是一款功能强大的FXP/FTP软件,集成了其它优秀的FTP软件的优点,如CuteFTP的目录比较,支持彩色文字显示;如BpFTP支持多目录选择文件,暂存目录;又如LeapFTP的界面设计。
支持目录(和子目录)的文件传输,删除;支持上传,下载,以及第三方文件续传;可以跳过指定的文件类型,只传送需要的本件;可自定义不同文件类型的显示颜色;暂存远程目录列表,支持FTP代理及Socks3&4;有避免闲置断线功能,防止被FTP平台踢出;可显示或隐藏具有“隐藏”属性的文档和目录;支持每个平台使用被动模式等。
GPS连接后,需要通过FlashFXP来完成代码的导入。
3.6GPS程序
3.6 程序分析
GPS原始采集的数据如上图所示。
在接收进程receive中收到“\n”之后,表示收到一条完整的信息。
在show_gps_info进程中进行数据的解析和显示:
void*show_gps_info(void*data)
{
while
(1){
if(GET_GPS_OK){
GET_GPS_OK=FALSE;
printf("%s",GPS_BUF);
gps_parse(GPS_BUF,&gps_info);
show_gps(&gps_info);
}
usleep(100);
if(STOP)break;
}
}
gps_parse实现GPRMC格式数据的解析:
voidgps_parse(char*line,GPS_INFO*GPS)
{
inti,tmp,start,end;
charc;
char*buf=line;
c=buf[5];
if(c=='C'){//判断"GPRMC"语句
GPS->D.hour=(buf[7]-'0')*10+(buf[8]-'0');//读取小时
GPS->D.minute=(buf[9]-'0')*10+(buf[10]-'0');//读取分钟
GPS->D.second=(buf[11]-'0')*10+(buf[12]-'0');//读取秒
tmp=GetComma(9,buf);
GPS->D.day=(buf[tmp+0]-'0')*10+(buf[tmp+1]-'0');//读取日
GPS->D.month=(buf[tmp+2]-'0')*10+(buf[tmp+3]-'0');//读取月
GPS->D.year=(buf[tmp+4]-'0')*10+(buf[tmp+5]-'0')+2000;//读取年
//------------------------------
GPS->status=buf[GetComma(2,buf)];//读取小时
GPS->latitude=get_double_number(&buf[GetComma(3,buf)]);//读取纬度
GPS->NS=buf[GetComma(4,buf)];//南纬or北纬
GPS->longitude=get_double_number(&buf[GetComma(5,buf)]);//读取经度
GPS->EW=buf[GetComma(6,buf)];//东经或者西经
#ifdefUSE_BEIJING_TIMEZONE
UTC2BTC(&GPS->D);
#endif
}
if(c=='A'){//"$GPGGA"
GPS->high=get_double_number(&buf[GetComma(9,buf)]);//读取小时
}
}
4 移植过程
4.1 Linux2.6内核驱动与2.4的区别
随着Linux2.6的发布,由于2.6内核做了新的改动,各个设备的驱动程序在不同程度上要
进行改写。
1、使用新的入口
必须包含
module_init(your_init_func);
module_exit(your_exit_func);
老版本:
intinit_module(void);
voidcleanup_module(voi);
2.4中两种都可以用,对如后面的入口函数不必要显示包含任何头件。
2、模块参数
必须显式包含
module_param(name,type,perm);
module_param_named(name,value,type,perm);
参数定义
module_param_string(name,string,len,perm);
module_param_array(name,type,num,perm);
老版本:
MODULE_PARM(variable,type);
MODULE_PARM_DESC(variable,type);
3、模块别名
MODULE_ALIAS("alias-name");
这是新增的,在老版本中需在/etc/modules.conf配置,现在在代码中就可以实现。
4、结构体的初试化
gcc开始采用ANSIC的struct结构体的初始化形式:
staticstructsome_structure={
.field1=value,
.field2=value,
..
};
老版本:
非标准的初试化形式
staticstructsome_structure={
field1:
value,
field2:
value,
..
};
5、内核可剥夺
preempt_disable();
preempt_enable_no_resched();
preempt_enable_noresched();
preempt_check_resched();
6、新增完成事件(completionevents)
init_completion(&my_comp);
voidwait_for_completion(structcompletion*comp);
voidcomplete(