0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于LPC2210芯片和uClinux实现导航定位信息获取模块的设计

电子设计 来源:单片机与嵌入式系统应用 作者:徐柳茂,蒋念东, 2021-05-22 11:47 次阅读

作者:徐柳茂,蒋念东,黄永强

GPS是当前在导航系统中应用最广泛的定位技术之一,但GPS也有其自身的不足。例如,当GPS终端在建筑密集的地方或在高架桥底下等恶劣的地理位置时,定位信号比较容易丢失,往往难以获取有效的定位信息。由美国高通公司开发的GPSOne定位模块,提供的定位信号是基于网络与蜂窝的定位技术。即使在卫星信号不好的情况下,只要存在联通的网络信号,利用蜂窝定位技术,就可以较容易地获得定位信号。此信号可作为GPS信号丢失情况下的一种补偿信号。

GPSOne是传统GPS定位技术与CDMA网络技术巧妙结合的混合型定位技术,即GPSOne=A-GPS+AFLT+Cell-ID。它是第一种可以在室内稳定工作的基于GPS技术的解决方案,是唯一商用的GPS定位解决方案,同时也是目前世界上最经济有效的集成型无线GPS解决方案。利用GPSOne能够弥补GPS自身不足的这一特点,本导航系统的定位信息获取模块采用GPS和GPSOne双定位方案,以实现更精确、可靠的定位。该定位信息获取模块的硬件架构是ARM+GPS+GPSOne;CPU采用Philips公司LP系列的LPC2210的ARM7芯片操作系统采用uClinux,本系统获取定位信息的关键,在于编写好串口通信程序,从而更好地实时接收和处理当前的位置信息。由于系统功能较为复杂,需要实现GUI界面交互、定位、报警、数据库查询、语音提示等多项功能,故对串口数据的接收,利用I/O复用机制进行处理更利于系统实现和管理。

1 uClinux串口编程操作方法

在Linux中,设备分为3类:字符设备、块设备和网络设备。uClinux用设备文件表示大部分I/O设备。文件系统提供了统一的接口来访问一般意义上的文件和设备文件。

系统串口COM1与COM2,分别对应uClinux系统的/dev/ttyS0、/dev/ttyS1两个串口设备文件。串口属于字符型设备,对串口的编程也就是对相应文件进行读/写、控制等操作。串口编程的基本步骤是:先打开串口,设置串口属性,然后进行收发数据,最后关闭串口。

(1)打开串口

通过使用标准的文件打开函数open,达到访问串口设备驱动的目的。例如,以读写的方式打开串口1,可用下面的方法实现:

fd=“open”(“/dev/ttyS0”,O_RDWR);

(2)设置串口属性

主要是设定结构体termios各成员的值。基本设置包括:波特率、数据位、校验位、停止位、输入和输出模式等。一般在设置时,先获取系统已有的串口属性,并在它的基础上进行修改。另外,设置时要用到系统预定义的宏。

(3)收发数据

uClinux下串口发送和接收数据,通过使用文件操作中的read和write的方法来实现。例如:

write(fd,buffer,Length);

read(fd,buffer,Length);

(4)关闭串口

关闭串口只须关闭已打开的串口文件描述符,如close(fd);

2 常用的几种I/O模型

通常在操作I/O时,会用到下面几种模型之一:阻塞型I/O、非阻塞型I/O和复用型I/O。下面以读取串口数据为例,简要说明它们的基本工作原理和特点。

2.1 阻塞型I/O

顾名思义,它以阻塞方式操作I/O,如图1所示。若一个进程以阻塞方式调用read函数读取串口数据,则该进程会一直睡眠在read系统调用上。此时系统内核会一直等待数据,直到串口有数据到达为止。当串口数据准备好后,内核就把数据从内核拷贝至用户空间;而当数据拷贝完成后,才唤醒串口读取进程,通知它读取数据报。

基于LPC2210芯片和uClinux实现导航定位信息获取模块的设计

2.2 非阻塞I/O

图2中,在非阻塞I/O模型下,I/O操作是即时完成的。当进程调用read函数时,设置了O_NONBLOCK标志,那么即使串口没有数据可读,read函数也会立即返回。此时其返回值为-EAGAIN,表明串口数据未就绪。如果串口有数据可读,则read函数会读取该数据,并返回所读数据的长度。通常轮询I/O的方法就是采用这种模型来读取串口数据的,此时进程必须通过反复调用来检测是否有数据可读。如果轮询频率过低,则容易丢失数据;轮询频率过高,则占用太多处理器的处理周期。

2.3 I/O复用

上述两种I/O模型,是最常用的两种操作I/O的方式;但在面向较复杂、需要处理多个I/O的系统时,这两种模型存在着不足之处。例如:在应用进程中需要对多个I/O设备进行监听,当某个设备可读或可写时,进程能马上得知,并进行相关处理。这时若采用阻塞方式操作I/O,则进程会阻塞在某个设备的I/O读写操作上而不能适用于这种情况;若采用非阻塞方式,则往往需要定时或循环地探测所有设备,才作相应处理,这种作法相当耗费系统中央处理器的执行周期。可见,上述的两个I/O模型都不能满足这类应用,故此需要引入一种特别的I/O处理机制,即I/O复用。

所谓I/O复用,是指当一个或多个I/O条件(可读、能写或出现异常)满足时,进程能立即知道,从而正确并高效地对它们进行处理。

在uClinux下,系统提供select函数和poll函数,用来支持I/O复用的实现。如图3所示,若使用Select的系统调用来查询是否有数据可读时,进程是在等待多个I/O描述接口的任一个变为可读,但此期间并不阻塞进程。当有数据报已准备好时,返回可读条件,并通知进程再次进行系统调用准备读取相应的I/O数据。此时内核就开始拷贝准备好的数据至用户空间,并返回指示进程处理数据报。

与上面提及的两种I/O模型不同的是:在这个处理过程中,使用了两次系统调用来达到读取数据的目的。虽然两次系统调用的开销似乎更大,但它的最大好处在于能同时等待多个描述符准备好。因此select调用功能更多地是借助了内核来监听I/O设备描述符的。

下面具体介绍select函数的功能及应用。

3 uClinux中基于select的I/O复用机制和工作原理

在系统存在多个输入或输出流但不希望其中任一个流被阻塞的场合,经常使用复用I/O的方法解决。uClinux中,用户程序多使用select机制实现I/O复用控制,select函数允许进程对一个或多个设备文件进行非阻塞的读或写操作。

select的函数定义于中,原型如下:

int select(int n,fd_set*readfds,fd_set*writefds,fd_set*exceptfds,struct timeval*timeout):

该函数允许进程指示内核等待多个事件中的任一个发生,并仅在一个或多个事件发生或经过某指定的时间后才唤醒进程。该函数的第1个参数n表示文件描述符集合中最大值再加1;第2个参数readfds,表示可读的文件描述符集合,用于查看是否有可读取数据;第3个参数writefds表示可写的文件描述符集合,用于查看是否能写入数据;第4个参数exceptfds用于异常控制;最后一个参数timeout决定了select将会阻塞多久才把控制权移交给调用它的进程。调用select之前,必须对此参数进行初始化。若timeout值为O,则select直接返回O。此时I/O操作没有等待就立即返回,相当于一种非阻塞I/O的调用。

在应用中,通常先调用select查看哪个I/O设备可读/写。如果没有可读/写的设备,并且没有设置超时返回功能,那么进程将阻塞在select调用上;如果有,则select函数返回,紧接着可通过测试参数readfds和writefds来确定哪个I/O设备可读或能写,而后以非阻塞方式操作该I/O设备,从而实现期望功能。

在实现select应用的过程中,还会使用到这些select相关接口:

void FD_ZERO(fd_set*fdset);

void FD_SET(int fd,fd_set*fdset);

void FD_CLR(int fd,fd_set*fdset);

int FD_ISSET(int fd,fd_set*fdset);

其中,fd_set表示设备文件描述符集合,fd表示设备文件描述符。FD_ZERO函数用于清除设备文件描述符集合所有元素;FD_SET函数用于把某个文件描述符添加至文件描述符集合;FD_CLR函数用于从文件描述符集合中删除某个文件描述符;而FD_ISSET用于检测设备文件描述符集合的某个文件描述符是否有效,有效则表示该位对应的设备有数据可读或可写。

4 轮询检测方法与select方法的比较

4.1轮询检测方法

轮询检测方法是指对串口进行非阻塞的读写操作。当操作未成功时,让进程或线程挂起一段时间,然后再使用非阻塞调用来重新查询串口是否有可读/写数据。用此方法,相当于系统不断地对接收或者发送操作的执行结果进行探测,直到把数据发出去或者接收完成定量的数据,才退出此轮询循环。而对于接收与发送不确定哪个时刻会到达的情况,即随机性比较高的读/写操作,采用轮询方法会造成CPU资源浪费。如果轮询频率过低,则会使系统少接收一部分数据或接收过慢;反之,则接收方会因为等待太久而不能接收更多新的数据。轮询频率过高的情况,会让CPU过度频繁地查询串口状态,造成过多的耗用CPU执行周期,降低其利用率。

4.2 select机制能充分利用系统时间的原因

与频繁调用非阻塞读写函数来轮询监听I/O的方法相比,select调用允许用户把进程本身挂起来,同时使系统内核监听所要求的一组文件描述符的任何活动。只要确认在任何被监控的文件描述符上出现活动,select调用将返回指示该设备文件已经准备好的信息。这样就使进程能相对实时地监测到I/O设备上随机的变化,而不必由进程本身去探测输入数据是否准备好。

5 利用select I/O的机制实现GPS与GPSOne数据的接收

本文提出的基于GPS与GPSOne信号的双定位的解决方案,即对系统两个串口定位信号的监听与处理,充分利用uClinux下基于Select的I/O复用机制,更利于较复杂系统的控制和管理。方案实现的程序流程如图4所示。

以下代码为使用Select I/O机制接收GPS信息和GPSOne信息的软件实现:

是否能写入数据;第4个参数exceptfds用于异常控制;最后一个参数timeout决定了select将会阻塞多久才把控制权移交给调用它的进程。调用select之前,必须对此参数进行初始化。若timeout值为O,则select直接返回O。此时I/O操作没有等待就立即返回,相当于一种非阻塞I/O的调用。

在应用中,通常先调用select查看哪个I/O设备可读/写。如果没有可读/写的设备,并且没有设置超时返回功能,那么进程将阻塞在select调用上;如果有,则select函数返回,紧接着可通过测试参数readfds和writefds来确定哪个I/O设备可读或能写,而后以非阻塞方式操作该I/O设备,从而实现期望功能。

在实现select应用的过程中,还会使用到这些select相关接口:

void FD_ZERO(fd_set*fdset);

void FD_SET(int fd,fd_set*fdset);

void FD_CLR(int fd,fd_set*fdset);

int FD_ISSET(int fd,fd_set*fdset);

其中,fd_set表示设备文件描述符集合,fd表示设备文件描述符。FD_ZERO函数用于清除设备文件描述符集合所有元素;FD_SET函数用于把某个文件描述符添加至文件描述符集合;FD_CLR函数用于从文件描述符集合中删除某个文件描述符;而FD_ISSET用于检测设备文件描述符集合的某个文件描述符是否有效,有效则表示该位对应的设备有数据可读或可写。

4 轮询检测方法与select方法的比较

4.1轮询检测方法

轮询检测方法是指对串口进行非阻塞的读写操作。当操作未成功时,让进程或线程挂起一段时间,然后再使用非阻塞调用来重新查询串口是否有可读/写数据。用此方法,相当于系统不断地对接收或者发送操作的执行结果进行探测,直到把数据发出去或者接收完成定量的数据,才退出此轮询循环。而对于接收与发送不确定哪个时刻会到达的情况,即随机性比较高的读/写操作,采用轮询方法会造成CPU资源浪费。如果轮询频率过低,则会使系统少接收一部分数据或接收过慢;反之,则接收方会因为等待太久而不能接收更多新的数据。轮询频率过高的情况,会让CPU过度频繁地查询串口状态,造成过多的耗用CPU执行周期,降低其利用率。

4.2 select机制能充分利用系统时间的原因

与频繁调用非阻塞读写函数来轮询监听I/O的方法相比,select调用允许用户把进程本身挂起来,同时使系统内核监听所要求的一组文件描述符的任何活动。只要确认在任何被监控的文件描述符上出现活动,select调用将返回指示该设备文件已经准备好的信息。这样就使进程能相对实时地监测到I/O设备上随机的变化,而不必由进程本身去探测输入数据是否准备好。

5 利用select I/O的机制实现GPS与GPSOne数据的接收

本文提出的基于GPS与GPSOne信号的双定位的解决方案,即对系统两个串口定位信号的监听与处理,充分利用uClinux基于Select的I/O复用机制,更利于较复杂系统的控制和管理。方案实现的程序流程如图4所示。

以下代码为使用Select I/O机制接收GPS信息和GPSOne信息的软件实现:

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    447

    文章

    47838

    浏览量

    409224
  • gps
    gps
    +关注

    关注

    22

    文章

    2750

    浏览量

    164393
  • 操作系统
    +关注

    关注

    37

    文章

    6293

    浏览量

    121904
收藏 人收藏

    评论

    相关推荐

    LPC2210的紧凑型图像采集系统OV7620

    LPC2210的紧凑型图像采集系统OV7620  摘要 利用ARM7(LPC2210)与CMOS感光芯片(OV7620)实现了一个紧凑型圈像采集
    发表于 10-03 14:16

    lpc2210开发板原理图

    lpc2210开发板电路图+原理图[hide][/hide]
    发表于 09-14 11:07

    ARM处理器LPC2210在脑血氧监测仪中的应用

    LPC2210的P0.0_TxD0和P0.1_RxD0口。本系统具有16个按键,用于菜单选择,输入病人的信息等功能。系统使用了I2C接口的键盘驱动芯片ZLG7290,ZLG7290是一款功能强大的键盘
    发表于 12-04 10:38

    1632位微控制器LPC2210相关资料下载

    1632位微控制器LPC2210资料下载内容主要介绍了:LPC2210功能和特性LPC2210引脚功能LPC2210内部方框图LPC2210
    发表于 03-29 06:04

    如何利用SCA3000和LPC2210设计三轴倾斜角智能传感器?

    本文基于三轴加速度计SCA3000和ARM处理器芯片LPC2210设计了一种三轴倾斜角智能传感器,它具有全方位和全摆幅的特点。本文对两轴、三轴加速度计测量倾斜角的原理进行了分析,采用两轴、三轴数据的合理运用,实现精度高、抗噪性能
    发表于 04-07 06:00

    基于LPC2210的LED显示屏控制系统该如何去设计?

    LED显示屏控制系统的原理是什么?LED显示屏控制系统是由哪些部分组成的?怎样去设计一种基于LPC2210的LED显示屏控制系统?
    发表于 06-07 06:27

    LPC2210中文资料数据资料(使用指南)

    LPC2210使用指南 1. 介绍 概述LPC2210是基于一个支持实时仿真和嵌入式跟踪的16/32位ARM7TDMI-STM CPU的微控制器对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%而
    发表于 08-24 17:10 148次下载

    LPC2210 pdf datasheet (16/32-b

    The LPC2210 is based on a 16/32 bit ARM7TDMI-S™ CPU with real-time emulationand embedded
    发表于 12-25 19:34 30次下载

    μC/OS-II 在LPC2210上的移植实现

    对嵌入式实时操作系统μC/OS-II 的组成和LPC2210 微处理器进行了简单介绍。在此基础上,详细介绍了将μC/OS-II 移植到LPC2210 微处理器的步骤和方法,指出了移植过程 的关
    发表于 07-08 08:57 41次下载

    基于LPC2210的远程Modem管理系统

    摘要:随着电子技术的发展 ,ARM系列微处理器得到越来越广泛的应用。介绍了一种基于 LPC2210的嵌入式 Modem,详细地阐述了 Modem的硬件及嵌入式操作系统移植方案,实  现 Mod
    发表于 09-09 16:14 24次下载

    基于LPC2210的汽车防撞装置的设计

             随着私家车的增多,给日常生活带来了方便,同时也给交通带来极大压力。汽车的安全问题变得尤其重要。本文介绍基于LPC2210 的汽车防撞系统
    发表于 09-11 08:21 27次下载

    lpc2210开发板电路图

    lpc2210开发板电路图
    发表于 09-14 11:07 142次下载
    <b class='flag-5'>lpc2210</b>开发板电路图

    LPC2210使用指南

    LPC2210是基于一个支持实时仿真和嵌入式跟踪的16/32位ARM7TDMI-SCPU的微控制器。对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。由于LP
    发表于 07-30 23:27 53次下载

    LPC2210应用到远程视频监控系统的设计

    本文为LPC2210应用到远程视频 监控系统 的设计,给出了软件设计结构。
    发表于 06-29 15:47 39次下载
    <b class='flag-5'>LPC2210</b>应用到远程视频监控系统的设计

    基于ARM-LPC2210芯片uClinux移植及应用

    本文主要介绍了如何将unlinux移植到LPC2210之中,并给出了开发uClinux应用程序的方法,实验结果证实本文所给出的方法是正确与有效的.
    发表于 12-06 16:45 82次下载
    基于ARM-<b class='flag-5'>LPC2210</b><b class='flag-5'>芯片</b>的<b class='flag-5'>uClinux</b>移植及应用