730 likes | 948 Views
嵌入式系统应用 Application of embedded System. 何福贵 hefugui@163.com. 第五部分 基于 Linux 的嵌入式操作系统. Linux 简介 嵌入式 Linux 应用程序的交叉编译 客户机 / 服务器应用程序的实现 GPS 应用程序 GSM/GPRS 应用程序 . 1 、 Linux 简介. 1.Linux 简介. Linux 操作系统
E N D
嵌入式系统应用Application of embedded System 何福贵 hefugui@163.com
Linux简介 • 嵌入式Linux • 应用程序的交叉编译 • 客户机/服务器应用程序的实现 • GPS应用程序 • GSM/GPRS应用程序
1.Linux简介 • Linux操作系统 正式的Linux 1.0于1994年3月诞生于芬兰赫尔辛基大学的天才大学生Linus手中。现在,Linux已成为当前最流行的免费操作系统。只要遵守GPL(General Public License) (GNU通用公共许可证),任何人都可以自由使用Linux的源程序。
1.Linux简介 Linux操作系统的特征 • Linux是开放源代码的,不在存黑箱技术,这样软件部分不存在盲点,这就有助于将来出现问题的分析和处理。 • 当在开发过程中遇到问题时,可得到很快的解决。遍布全球的众多Linux爱好者都是Linux开发者的强大技术支持者。Linux的源代码随处可得,注释丰富,文档齐全,易于解决各种问题。 • 选择范围宽。Linux的最初版本Linux-1.0,发布的版本序列是Linux-1.1, Linux-1.2, Linux-1.3, Linux-2.0, Linux-2.1, Linux-2.2, Linux-2.3, Linux-2.4, Linux-2.5 到Linux-2.6,目前发布的最新版本是Linux-2.6.13。众多的源代码版本提供了很大的选择范围。可以适应不同的系统的配置要求。
1.Linux简介 Linux操作系统的特征 • 现在有许多Linux上运行的软件及嵌入式GUI,它们源代码开放且遵守GPL,这为开发应用程序提供了方便。 • Linux是开放源代码的OS,在价格上极具竞争力,适合中国国情。 • 由于Linux不仅支持x86芯片,还是一个跨平台的系统,它可以支持20~30种CPU,所以使用Linux,可以为将来更换CPU类型提供方便。 • Linux的网络功能非常强, Linux对硬件有广泛的支持,且硬件实现部分源代码开放,可方便地开发设备驱动程序.
1.Linux简介 Linux的内核结构
1.Linux简介 Linux操作系统的发展情况及前景 Linux操作系统发展至今,已经成为具有全部UNIX特性的POSIX兼容的操作系统,能够与各种传统的商业操作系统分庭抗礼。
1.Linux简介 下面是Linux源代码目录树结构。 • init 内核初始化代码 • kernel 内核核心部分:进程、定时、程序执行、信号、模块… • mm 内存管理 • arch 平台相关代码 • fs 文件系统 • Net 网络代码 • Ipc 进程间通信 • Drivers 设备驱动程序 • Lib 通用内核函数 • Include 头文件(.h) • scripts 配置内核的一些脚本文件 • Documentation有关内核各个部分的通用解释和注释的文本文件
home usr bin dev var etc tmp team bin 1.Linux简介 根文件系统目录结构
1.Linux简介 运行在Linux内核上的根文件系统目录说明 • / 根目录(最上层目录) • /bin bin是binary的缩写,存放着使用者最经常使用的命令。 • /boot 存放的是启动Linux时使用的一些核心文件。包括linux 内核。 • /dev dev是device(设备)的缩写。这个目录下是所有LINUX的外部设备。 • /etc 用来存放所有的系统管理所需要的配置文件和子目录。 • /home 用户的主目录。 • /lib 存放着系统最基本的动态链接共享库。 • /lost+found 这个目录平时是空的,当系统不正常关机后,存放其它目录不能 存放的文件。 • /mnt 这个目录是让用户临时挂载别的文件系统。 • /proc 是一个特殊的文件系统目录,它是系统内核的映射,可以通过直接访问这个目录来获取系统信息。 • /root 系统管理员目录,也叫作超级权限者的用户主目录。 • /tmp 用来存放一些临时文件的地方了。 • /var 这个目录中存放着那些不断变化的文件,例如系统的日志文件就在/var/log目录中 • /usr 这个目录的内容比较多,存放系统应用程序。
1.Linux简介 • Linux的内核版本指的是在Linus本人领导下的开发小组开发出的系统内核的版本号, 目前最新的版本的序号是: linux-2.6.13.1,其中, 序号的第二位为偶数的版本表明这是一个可以使用的稳定版本, 如2.4.20, 而序号的第二位为奇数的版本一般有一些新的东西加入, 是个不一定很稳定的测试版本, 如2.5.1。 • Linux由于其“自由”和“开放”的特性,衍生出了数量众多各具特色的发行版。所谓发行版,有一些组织或商业厂家, 将Linux系统的内核与外围应用软件和文档包装起来, 并提供一些系统安装界面和系统设定与管理工具, 这样就构成了一个发行版本,实际上, Linux的发行版本就是Linux核心再加上外围的实用程序组成的一个大软件包而已。相对于操作系统内核版本, 发行版本的版本号是随着发布者的不同而不同, 与Linux系统内核的版本号是相对独立的。目前主要的Linux的发行版本有:Red Hat Linux、红旗Linux、Debain、Turbilinux、 Xteamlinux 和Mandriva Linux等,都使用Linux作为内核,本质是一致的。但由于各种发行版侧重的用户群体不同,往往在使用上差异很大
2.嵌入式Linux • 嵌入式系统是以应用为中心,以计算机技术为基础、软硬件均可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。其发展已有二十多年的历史,国际上也出现了一些著名的嵌入式操作系统,如VxWorks,Palm OS,Windows CE等等,但这些操作系统均属于商品化产品,价格昂贵且由于源代码不公开导致了诸如对设备的支持,应用软件的移植等一系列的问题。而Linux作为一种优秀的Free OS,近几年在嵌入式领域异军突起,成为了最有潜力的嵌入式操作系统。
2.嵌入式Linux 常见嵌入式Linux操作系统 • RT-Linux 美国新墨西哥理工学院开发的嵌入式硬实时操作系统。它将标准Linux核心作为其实时内核的一个进程同实时进程一起调度,从而在改动最小的情况校充分利用了Linux下现有的资源。 • ucLinux ucLinux是针对微控制领域而设计的Linux系统,其最大特征就是没有MMU(内存管理单元模块)。ucLinux包含Linux常用的API和小于512k的内核及相关的工具,900k左右。 • Embedix 嵌入式Linux行业主要厂商Lineo推出,最小需要8M内存,3M ROM或者FLASH,提供了超过25种的Linux系统服务,是一种较完整的嵌入式Linux解决方案。
2.嵌入式Linux • XLinux 美国网虎公司推出,主要开发者陈盈豪,核心仅143k,而且还在不断减小中,号称世界上最小的嵌入式Linux系统。其核心采用了“超字元集”的专利技术,与标准字符集兼容的同时还覆盖了12个国家和地区的字符集,在国际化方面具有得天独厚的优势。 • KURT-Linux 该OS是为多媒体应用和ATM网络应用设计的“严格”的实时系统。
中断控制硬件 中断控制硬件 RTLINUX 实时内核 LINUX内核 LINUX内核 实时任务 LINUX进程 LINUX进程 Linux到RTLinux体系结构的变化
嵌入式Linux系统构成 嵌入式Linux也是Linux • 基于主流的Linux内核源码开发 • 不同的类型对内核有不同的修改 • 基于标准Linux系统构架定制嵌入式系统 Linux系统的构成 • 硬件平台 • 引导程序 • Linux内核 • 根文件系统
引导程序bootloader Bootloader • Bootloader是引导设备启动并且执行主程序的固件 Monitor • 除了引导功能,minitor还有命令行的接口,可以有调试、读写内存、擦写FLASH、配置参数等功能。 习惯上,可以把上面两种软件都叫做"bootloader“
Linux的bootloader 所有Linux系统都需要通过bootloader引导启动 • 对于嵌入式Linux系统,需要专门定制引导程序 • 已经有各种各样的bootloader供嵌入式系统使用 PPC 和x86 平台已经有众人皆知的bootloader • 其他体系结构没有标准的bootloader • 依赖于硬件供应商提供的bootloader 开放的和商业的bootloader
x86 Bootloaders X86平台的2个主要引导程序: LILO和GRUB • LILO: http://brun.dyndns.org/pub/linux/lilo/ • GRUB: http://www.gnu.org/software/grub/ • LILO 和GRUB 工程的Makefile不允许交叉编译,需要X86主机上本地编译。 其它bootloaders: Rolo, EtherBoot,LinuxBIOS • –很少用 • –应用于特定环境下
ARM Bootloaders U-Boot 已经成为标准的ARM bootloader • Armboot跟ppcboot合并,成为u-boot • 支持arm720, arm920, arm926, sa1100, xscale… • ttp://armboot.sourceforge.net/ Blob • blob 是由LART 工程中开发的bootloader • blob 已经移植到其它基于ARM的系统上 • http://www.lart.tudelft.nl/lartware/blob Redboot 也能支持
PowerPC Bootloaders U-boot 是PowerPC平台的主要引导程序 • Ppcboot是u-boot的前身 • 能够支持上百的PowerPC 板子 • 支持PPC 4xx, 5xx, 8xx, 82xx, 7xx, 74xx…等系列处理器 OpenBIOS • 开放源码的IEEE 1275-1994 兼容的固件 • 支持一些IBM PPC405 的板子 Redboot也能支持
MIPS Bootloaders YAMON • MIPS嵌入式Linux系统的标准引导程序 • MIPS公司的开放源码的软件 • 支持大多数的MIPS开发板 PMON • 作为初始化代码使用 • 需要移植到自己的开发板上 U-boot 和Redboot也能支持
其它bootloader SuperH • sh-boot 是SH平台的标准引导程序 • Redhat 也能支持 M68K • Redhat 能支持 • 没有标准的bootloader
3.应用程序的交叉编译 步骤: 1.目标机的应用程序在宿主机上编译. 2.在宿主机安装交叉编译器 3.在宿主机编译和连接目标机应用程序 4.下载到目标机运行
3. 应用程序的交叉编译 交叉编译器和交叉链接器是能够在宿主机上运行,并且能够生成在目标机上直接运行的二进制代码的编译器和链接器。例如在基于ARM体系结构的gcc交叉开发环境中,arm-linux-gcc是交叉编译器,arm-linux-ld是交叉链接器。通常情况下,并不是每一种体系结构的嵌入式微处理器都只对应于一种交叉编译器和交叉链接器,比如对于M68K体系结构的gcc交叉开发环境而言,就对应于多种不同的编译器和链接器。如果使用的是COFF格式的可执行文件,那么在编译Linux内核时需要使用68k-coff-gcc和m68k-coff-ld,而在编译应用程序时则需要使用m68k-coff-pic-gcc和m68k-coff-pic-ld。
3. 应用程序的交叉编译 • 嵌入式系统在链接过程中通常都要求使用较小的函数库,以便最后产生的可执行代码能够尽可能地小,因此实际运用时一般使用经过特殊处理的函数库。对于嵌入式Linux系统来讲,功能越来越强、体积越来越大的C语言函数库glibc和数学函数库libm已经不能满足某些系统的要求,这时需要采用它们的精化版本uClibc、uClibm和newlib等。 • 目前嵌入式的集成开发环境都支持交叉编译和交叉链接,如ADS和GNU工具链等,编写好的嵌入式软件经过交叉编译和交叉链接后通常会生成两种类型的可执行文件:用于调试的可执行文件和用于固化的可执行文件。
4.客户机/服务器应用程序的实现 • TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了一种新型的I/O操作。UNIX用户进程与网络协议的交互作用比用户进程与传统的I/O设备相互作用复杂得多 . • 在UNIX系统中,网络应用编程界面有两类:UNIX BSD的套接字(socket)和UNIX System V的TLI。由于Sun公司采用了支持TCP/IP的UNIX BSD操作系统,使TCP/IP的应用有更大的发展,其网络应用编程界面──套接字(socket)在网络软件中被广泛应用,至今已引进微机操作系统DOS和Windows系统中,成为开发网络应用软件的强有力工具
4.客户机/服务器应用程序的实现 • Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。 • Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。
Network Applications User Kernel BSD Sockets Socket Interface INET Sockets TCP UDP Protocol Layers IP ARP Network Devices PPP SLIP Ethernet Linux Networking Layers
files_struct count close_on_exec open_fs fd[0] fd[1] fd[255] BSD Socket File Operations file lseek read write select ioctl close fasync dentry f_mode f_owner f_op f_dentry f_version … inode … inode socket SOCK_STREAM type protocol data Address Family socket operations SOCK_STREAM sock type protocol socket Linux BSD Socket Data Structure
4.客户机/服务器应用程序的实现 • TCP/IP Networking LayersBSD Socket InterfaceINET Socket Layer • Create • Bind • Listen • Accept • Connect
4.客户机/服务器应用程序的实现_ socket() • 我们使用系统调用socket()来获得文件描述符:#include<sys/types.h>#include<sys/socket.h>int socket(int domain,int type,int protocol);第一个参数domain设置为“AF_INET”。第二个参数是套接口的类型:SOCK_STREAM或SOCK_DGRAM。第三个参数设置为0。系统调用socket()只返回一个套接口描述符,如果出错,则返回-1。
<include/linux/socket.h> AF_UNIX Unix domain sockets AF_INET Internet IP Protocol AF_IPX Novell IPX AF_APPLETALK Appletalk DDP AF_X25 Reserved for X.25 project ... ... 4.客户机/服务器应用程序的实现_ socket()
4.客户机/服务器应用程序的实现_ bind() • 一旦你有了一个套接口以后,下一步就是把套接口绑定到本地计算机的某一个端口上。但如果你只想使用connect()则无此必要。下面是系统调用bind()的使用方法:#include<sys/types.h>#include<sys/socket.h>intbind(int sockfd,struct sockaddr*my_addr,int addrlen);第一个参数sockfd是由socket()调用返回的套接口文件描述符。第二个参数my_addr是指向数据结构sockaddr的指针。数据结构sockaddr中包括了关于你的地址、端口和IP地址的信息。第三个参数addrlen可以设置成sizeof(structsockaddr)。如果出错,bind()也返回-1。如果你使用connect()系统调用,那么你不必知道你使用的端口号。当你调用connect()时,它检查套接口是否已经绑定,如果没有,它将会分配一个空闲的端口。
4.客户机/服务器应用程序的实现_ connect() • 统调用connect()的用法如下:#include<sys/types.h>#include<sys/socket.h>int connect(int sockfd,struct sockaddr* serv_addr,int addrlen);第一个参数还是套接口文件描述符,它是由系统调用socket()返回的。第二个参数是serv_addr是指向数据结构sockaddr的指针,其中包括目的端口和IP地址。第三个参数可以使用sizeof(structsockaddr)而获得。
4.客户机/服务器应用程序的实现_ listen() • 如果你希望不连接到远程的主机,也就是说你希望等待一个进入的连接请求,然后再处理它们。这样,你通过首先调用listen(),然后再调用accept()来实现。系统调用listen()的形式如下:int listen(int sockfd, int backlog);第一个参数是系统调用socket()返回的套接口文件描述符。第二个参数是进入队列中允许的连接的个数。进入的连接请求在使用系统调用accept()应答之前要在进入队列中等待。这个值是队列中最多可以拥有的请求的个数。大多数系统的缺省设置为20。你可以设置为5或者10。当出错时,listen()将会返回-1值。当然,在使用系统调用listen()之前,我们需要调用bind()绑定到需要的端口,否则系统内核将会让我们监听一个随机的端口。所以,如果你希望监听一个端口,下面是应该使用的系统调用的顺序:socket();bind();listen();
4.客户机/服务器应用程序的实现_ accept() • accept()系统调用accept()比较起来有点复杂。在远程的主机可能试图使用connect()连接你使用listen()正在监听的端口。但此连接将会在队列中等待,直到使用accept()处理它。调用accept()之后,将会返回一个全新的套接口文件描述符来处理这个单个的连接。这样,对于同一个连接来说,你就有了两个文件描述符。原先的一个文件描述符正在监听你指定的端口,新的文件描述符可以用来调用send()和recv()。
4.客户机/服务器应用程序的实现_ server() #include<sys/types.h> #include<sys/socket.h> #include<stdio.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> int main() { int server_sockfd,client_sockfd; int server_len,client_len; struct sockaddr_in server_address,client_address; server_sockfd = socket(AF_INET,SOCK_STREAM,0); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = INADDR_ANY;//inet_addr("192.168.2.122"); server_address.sin_port = 9734; server_len = sizeof(server_address); bind(server_sockfd,(struct sockaddr *)&server_address,server_len); listen(server_sockfd,5); while(1) { char ch; printf("server waiting\n"); client_len = sizeof(client_address); client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address,&client_len); read(client_sockfd,&ch,1); ch++; write(client_sockfd,&ch,1); close(client_sockfd); } }
4.客户机/服务器应用程序的实现_ client() #include<sys/types.h> #include<sys/socket.h> #include<stdio.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> int main() { int sockfd; int len; struct sockaddr_in address; int result; char ch = 'A'; sockfd = socket(AF_INET,SOCK_STREAM,0); address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr("192.168.2.120"); address.sin_port = 9734; len = sizeof(address); result = connect(sockfd,(struct sockaddr*)&address,len); if(result == -1) { perror("oops:client1"); } write(sockfd,&ch,1); read(sockfd,&ch,1); printf("char from server = %c\n",ch); close(sockfd); exit(0); }
5.GPS应用程序的实现 5.1 GPS简介 GPS即全球定位系统(Global Positioning System)的简称。GPS是美国国防部(U.S.Department Of Deefense--DOD)从本世纪70年代开始研制,历时20年,耗资一百多亿美元,于1994年全面建成。具有在海、陆、空进行全方位实时三维导航与定位能力的新一代卫星导航与定位系统。我国测绘等部门在近10年的使用表明,GPS是全天候、高精度、高效率,多功能等显著特点,赢得广大测绘工作者的信赖,并成功地应用于大地测量、工程测量、航空摄影测量、运载工具导航和管制、地壳运动监测、工程变形监测、水纹测试、资源勘察、地球动力学等多种学科,从而给测绘领域带来一声场深刻的技术革命。 GPS系统的特点: 高精度、全天候、高效率、多功能、操作简便、应用广泛等。 GPS的应用: GPS是目前技术最成熟且真正实用的一种卫星导航和定位系统。它具有定位快、全时域、全天候、高动态等特点,现在交通、测量、勘探、航空、航海等诸多民用领域获得了广泛应用。 由于GPS定位技术具有精度高、速度快、成本低的显著优势,因而以成为目前世界上应用最广泛、应用最强的全球精密授时、测距、导航的定位系统。