第7章-嵌入式Linux课件_第1页
第7章-嵌入式Linux课件_第2页
第7章-嵌入式Linux课件_第3页
第7章-嵌入式Linux课件_第4页
第7章-嵌入式Linux课件_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

ARM嵌入式系统

第七章嵌入式Linux

嵌入式Linux嵌入式Linux概述ARMLinux在PXA270实验系统上的移植ARMLinux的设备驱动ARMLinux下应用程序设计嵌入式Linux概述

Linux介绍嵌入式Linux系统交叉开发环境开发工具GNU的介绍Linux介绍Linux是类UNIX操作系统。最初是由LinusTorvalds于1991年在基于Intel80386处理器的IBM兼容机上开发的操作系统。出现在二十世纪九十年代,在短短的十几年的时间里发展成为功能强大,设计完善的操作系统。源程序可以在/下载。Linux有着异常丰富的驱动程序资源,支持各种主流的硬件设备与技术。嵌入式Linux能够固化在容量只有几KB或者几MB的存储芯片或者微控制器中,Linux包含了现代的UNIX操作系统的所有功能特性,这些功能包括多任务、虚拟内存、虚拟文件系统、SVR4进程间通信、对称多处理器(SMP)、多用户支持等功能。Linux介绍Linux具有以下特性:单一内核支持多处理器良好的开放性设备独立性支持多线程抢占式内核功能文件系统

嵌入式Linux操作系统的应用领域:手机、PDA数字相机、数字电视机、数码相机VCD/DVD音响设备、可视电话家庭网络设备洗衣机、电冰箱智能玩具Linux介绍广泛应用的原因:公开源代码没有专利费外部设备驱动丰富网络协议及中间件非常丰富非常稳定嵌入式Linux嵌入式Linux(EmbeddedLinux)是指对标准Linux经过小型化裁剪处理之后,能够固化在容量只有几KB或者几MB字节的存储器芯片或者单片机中,是适合于特定嵌入式应用场合的专用Linux操作系统。在目前已经开发成功的嵌入式系统中,大约有一半使用的是Linux。这与它自身的优良特性是分不开的。嵌入式Linux同Linux一样,具有低成本、多种硬件平台支持、优异的性能和良好的网络支持等优点。

嵌入式Linux

嵌入式Linux还在Linux基础上做了部分改进,主要的改动有:改善的内核结构提高的系统实时性嵌入式Linux同Linux一样,也有众多的版本,其中不同的版本分别针对不同的需要在内核等方面加入了特定的机制。

嵌入式Linux系统交叉开发环境交叉开发模型主要思想是,首先在宿主机(Host)上安装开发工具,编辑、编译目标板(Target)的Linux引导程序、内核和文件系统,然后下载到目标板上运行。通常这种在宿主机环境下开发,在目标机上运行的开发模式叫做交叉开发。交叉开发模型见图所示。

开发工具GNU的介绍

GNU(GNU’sNotUnix)项目是自由软件基金会(FreeSoftwareFoundation)的董事长RichardM.Stallman于1984年发起,意在软件开发团体中发起支持开发自由软件的运动。GNU软件包括:C编译器gccC++编译器g++GNU的汇编器asGNU的链接器ld二进制转换工具(objcopy、objdump)调试工具(gdb、gdbserver、kgdb)和基于不同硬件平台的开发库。开发工具GNU的介绍1.GNUBinutils工具工具集GNUBinutils主要是一套用来构造和使用二进制代码所需的工具集。建立嵌入式交叉编译环境,GNUBinutils工具包是不可缺少的,没有Binutils,GNU的C编译器gcc将无法正常工作。Binutils的官方下载地址是:ftp:///gnu/binutils/,在这可以下载到不同版本的Binutils工具包。目前比较新的版本是Binutils-2.17。GNUBinutils工具集主要有以下一系列的部件。开发工具GNU的介绍ldGNU的链接器汇编器产生的目标代码生成可执行文件asGNU的汇编器汇编语言编写的源程序换成二进制形式的目标代码add2line将地址转换成文件名或行号对C++filt过滤掉C++符号,防止重载冲突gprof显示程序调用段的各种数据nlmconv将目标代码转换成NLnm从目标代码中列出所有变量objdump显示目标文件信息strings从文件中列出可打印的字符串ranlib对归档文件生成索引windresWindows源程序的编译器开发工具GNU的介绍2.编译器gccgcc是GNU推出的功能强大,性能优越的多平台编译器,是Linux中最重要的软件开发工具。是GNU的代表作品之一。编译器被成功地移植到不同的处理平台上,标准的台式Linux上的gcc是针对IntelCPU的,而ARM系列开发软件使用的是针对ARM系列处理器的gcc编译器arm-elf-gcc、arm-elf-as及相应的GNUBinutils工具集。使用gcc编译器编译C语言程序时,通常会经过四个处理阶段,即预处理阶段、编译阶段、汇编阶段和链接阶段。gcc是通过文件的后缀来区别文件的类别,下面的表中给出gcc的部分约定规则。在使用gcc编译器时,需要给出一系列调用参数和文件名,当没有给出时,gcc将使用缺省参数,gcc基本的用法是:

gcc[options][filename]开发工具GNU的介绍

其中,options就是参数选项,filename是相关的文件名称。常用的选项有:–c:只编译生成目标文件,不链接成可执行文件。–DMACRO=DEFN:以字符串“DEFN”定义MACRO宏。–E: 只对程序进行预处理。–g: 生成调试信息,GNU调试器可利用该信息。–llibrary: 用来指定所使用的库文件。–ldirectory:为include文件的搜索指定目录。–ofilename:生成指定的文件名的可执行文件。

开发工具GNU的介绍开发工具GNU的介绍3.调试器gdb

gdb是GnuDeBugger的缩写,是GNUC的用来调试C和C++程序的调试工具。开发者在使用它时,可以了解程序在运行时的详细情况,如程序的内部结构和内存等信息。gdb能够通过完成以下几个任务来帮助你查找程序中的错误。启动程序,设置影响程序运行的调试条件。能使程序在特定条件下停止。在程序停止时,检查程序的运行情况。调整程序,改正错误后继续调试。gdb调试命令的使用方法以下程序是汉诺塔的源程序:

#include"stdio.h"

main()

{voidhanoi(int,char,char,char);

intm;

printf("inputthenumberofdisks:");

scanf("%d",&m);

printf("Thesteptomoving%ddisks:\n",m);

hanoi(m,'A','B','C');}

voidhanoi(intn,chara,charb,charc)

{voidmove(char,char);

if(n==1)move(a,c);

else

{hanoi(n-1,a,c,b);

move(a,c);

hanoi(n-1,b,a,c);}}

voidmove(charx,chary)

{printf("%c-->%c\n",x,y);

}gdb调试命令的使用方法为了方便调试可执行程序,可以用下面的语句来编译程序。#gcc–g–otesttest.c开始调试:#gdb–Qtest(gdb)

1.查看源代码,使用list命令(gdb)list

1 #include<stdio.h>2 main()3 {4 voidHanoi(int,char,char,char);5 intm;6 scanf("%d",&m);7 printf("Thesteptomove%ddisks:\n",m);8 hanoi(m,'A','B','C');9 }10 voidhanoi(intn,chara,charb,charc)(gdb)gdb调试命令的使用方法2.运行源程序,使用run命令。(gdb)runStartingprogram/home/ding/test.exeInputthenumberofdisks;3Thesteptomove3disks:A-->CA-->BC-->BA-->CB-->AB-->CA-->CProgramexitednormally(gdb)如上所述,使用run命令会执行一个可执行程序。gdb调试命令的使用方法设置断点使用breakN命令来设置断点,N表示在源代码的第N行处设置断点,如果想看程序中断点数量与位置,可以使用infobreak命令来查看。清除断点gdb用clear指令来清除断点。它的使用格式如下;(gdb)clearn查看变量的值gdb用print指令查看变量的值。执行时键入print或p。如果想看变量的类型时,用whatis命令。单步执行gdb用step指令进行单步执行方式。此指令可以跟踪到函数内部,执行时键入step或s。另外一个指令是next指令,只用于单步执行,不进入到函数内部。退出程序调试如果程序执行完了,则直接退出。如果程序在执行中,则提示程序在执行中,是否要退出的提示,确认后即可结束调试。ARMLinux在PXA270实验系统上的移植ARMLinux的开发环境的建立ARMLinux的交叉编译

ARMLinux内核的配置与编译嵌入式Linux文件系统的建立与设置

ARMLinux的开发环境的建立

1.Toolchain简介ARM交叉编译环境不同于X86系列桌面的编译环境。PXA270芯片同样是基于ARM体系结构的,所以在基于PXA270的嵌入式的开发过程中必须使用ARM的交叉编译环境。

Toolchain具体包括如下:GNUgcccompilersforC,C++GNUbinutilGNUCLibraryGNUCheaderARMLinux的开发环境的建立2.Toolchain的安装与配置

在本书使用的所有的Toolchain均以压缩文件的形式提供,如下所示:binutils-2.15.tar.gzgcc-3.3.2.tar.gzglibc-2.3.2.tar.gzglibc-linuxthreads-2.3.2.tar.gzARMLinux的开发环境的建立搭建开发环境所需的全部资源文件已经全部在光盘中提供,在开发主机上以root用户登录,放入光盘之后使用mount命令将其挂载,这样主机就可以将光盘当作文件来读取。当光盘放入光驱之后,linux系统可以自动的挂载,可以跳过这个步骤:[rootlocalhostroot]#mount/dev/cdrom/mnt/cdrom[rootlocalhostroot]#cd/mnt/cdromARMLinux的开发环境的建立

检查CD-ROM正确挂载后,需要在开发主机上创建目录,并将光盘内容拷贝到目录中。在根目录创建了一个名为PXA270_Linux的目录,将光盘中的内容拷贝到了该目录中。[rootlocalhostroot]#mkdir/PXA270_Linux[rootlocalhostroot]#cd/PXA270_Linux[rootlocalhostPXA270_Linux]#cp/mnt/cdrom/PXA270_Linux/*-a./ARMLinux的开发环境的建立

移动到bin目录下使用ls命令查看,可以看到这些编译工具。

ARMLinux的开发环境的建立

为了之后在任何目录下面都能够使用Toolchain,必须要对路径进行设置。打开/root/.bash_profile文件来设置路径,使用vi编译器来改.bash_profile文件。[rootlocalhostroot]#vi~/.bash_profile

用vi编辑器打开/root/.bash_profile文件并添加下述的路径:PATH=$PATH:/opt/xscalev1/binARMLinux的开发环境的建立

现在在任何的目录下都能打开/opt/xscalev1/bin。保存并退出该文件,使用source命令来使路径生效。此时,使用arm-linux-命令时,Toolchain中的工具会被使用。ARMLinux的交叉编译

使用vi编辑器创建一个hello.c文件。编写一个简单的程序来打印出一行简单的信息:HelloWorld。程序如下所示:#include"stdio.h"

main()

{printf("HelloWorld\n");

return0;}保存并退出该文件。使用如下的命令来编译该文件。[rootlocalhostroot]#gcc–ohellohello.c[rootlocalhostroot]#arm-linux-gcc–ohello-armhello.c[rootlocalhostroot]#filehello

[rootlocalhostroot]#filehello-arm

ARMLinux的交叉编译下载该二进制(hello-arm)文件到EELIOD并执行将会输出“HelloWorld.”。若要下载到目标板,将会使用到minicom中的串口下载功能。首先需要配置minicom。配置完成之后,可以通过minicom来对目标板进行操作。下面几幅图minicom的配置过程以及程序下载到目标板的方法:Minicom的使用Minicom的使用Minicom的使用Minicom的使用Minicom的使用ARMLinux内核的配置与编译

arch包括所有与体系结构相关的内核代码include包括编译内核所需要的头文件init包含内核的初始化代码,但不是系统的引导代码,其中所包含main.c和version.c文件是研究Linux内核的起点mm该目录包含所有独立于CPU体系结构的内存管理代码,如页式存储管理内存的分配和释放等。与ARM体系结构相关的代码在arch/arm/mm中kernel包括主要的内核代码,此目录下的文件实现大多数Linux的内核函数,其中最重要的文件是sched.c。ARMLinux内核的配置与编译2.内核配置系统的基本结构

Makefile分布在Linux内核源码中的Makefile,定义Linux内核的编译规则;顶层Makefile是整个内核配置、编译的总体控制文件。config.in给用户提供配置选择的功能;.config:内核配置文件,包括由用户选择的配置选项,用来存放内核配置后的结果。配置工具包括对配置脚本中使用的配置命令进行解释的配置命令解释器和配置用户界面(基于字符界面:makeconfig;基于Ncurses图形界面:makemenuconfig;基于XWindows图形界面:makexconfig)。rules.make规则文件,被所有的Makefile使用。ARMLinux内核的配置与编译3.编译内核的常用命令Makeconfig:内核配置。makedep:寻找依存关系。。makeclean:清除以前所产生的所有的目标文件,模块文件,核心以及一些临时文件等,不产生任何文件。makermproper:删除所有以前在生成内核过程中所产生的所有文件,及除了做makeclean外,还要删除.config,.depend等文件,把核心源码恢复到最原始的状态。makezImage:在make的基础上产生压缩的核心映像文件./arch/$(ARCH)/boot/zImage以及./arch/$(ARCH)/boot/compressed目录下产生一些临时文件。makebzImage:在make的基础上产生压缩比例更大的的核心映像文件./arch/$(ARCH)/boot/bzImage及./arch/$(ARCH)/boot/compressed目录下产生一些临时文件。ARMLinux内核的配置与编译4.内核编译过程makemrproper删除所有以前在生成内核过程中所产生的所有文件makemenuconfig内核配置makedep寻找依存关系makezImage产生压缩的核心映像文件内核编译完毕之后,生成zImage内核映象文件保存在源代码的arch/arm/boot/目录下。ARMLinux内核的配置与编译5.内核配置项介绍首先将压缩的linux内核源代码文件linux-2.4.21-PXA270.tar.gz解压,进入linux内核源代码所在的目录,并在终端输入makemenuconfig,系统弹出基于Ncurses内核配置图形界面,便可进行内核选项的配置。[rootlocalhostroot]#tarxvfzlinux-2.4.21-PXA270.tar.gz[rootlocalhostroot]#cdPXA270_Linux/kernel/[rootlocalhostkernel]#makexsbase270_config[rootlocalhostkernel]#makeoldconfig[rootlocalhostkernel]#makemenuconfigARMLinux内核的配置与编译6.下载Linux内核镜像如果bootp和tftp命令能够正常工作,可以使用如下命令来下载内核,具体步骤如下:设置需要下载的镜像名:在菜单模式下,选择“a”,按提示输入内核镜像和文件系统镜像名,用户必须保证在/tftpboot目录下存在同名的镜像文件。下载内核镜像:在菜单模式下,选择“3”,此时,内核镜像通过以太网下载到开发板的sdram上;若传输超时或失败,请重新执行。烧写到flash:在菜单模式,选择“4”,将刚下载的内核镜像烧到flash上。以上步骤正常结束后,内核镜像已烧入flash中。嵌入式Linux文件系统的建立与设置1Linux文件系统的类型EXT文件系统NFS文件系统JFFS2文件系统2文件系统的制作Busybox介绍Busybox的编译配制文件系统

ARMLinux的设备驱动

Linux的设备管理设备驱动程序结构GPIO驱动程序设计基于轮循的UART驱动程序设计基于中断UART驱动程序设计Linux的设备管理嵌入式Linux设备驱动程序的设计大致包括以下步骤:向系统申请也可以动态获得主、次设备号。实现设备初始化和卸载模块。设计对设备文件操作。如定义file_operations结构。设计对设备文件操作调用。如read、write等操作。实现中断服务函数,用request_irq向内核注册。将驱动程序编译到内核或编译成模块,用ismod命令加载。生成设备节点文件。Linux的设备管理驱动程序的加载方法在设计完主要数据结构和函数接口后就要把设备驱动加入到内核中。内核模块是Linux内核的重要组成要素,内核模块能在Linux系统启动之后能够动态进行装载和卸载,因此不需对内核进行重新编译或重启系统就可将内核的一部分替换掉。GPIO驱动程序的设计主要包括以下四个函数的设计:加载本驱动时执行init_module函数卸载驱动时执行cleanup_module函数打开驱动程序文件时执行gpio_open函数关闭驱动程序文件时执行gpio_release函数

基于轮循的UART驱动程序设计基于轮循的UART驱动程序,主要函数的功能如下:init_module()初始化串口模块,加载串口设备驱动;uart_open()打开一个串口设备节点,当一个设备节点被打开时,计数器MOD_INC_USE_COUNT加一;uart_release()关闭一个设备节点,当一个设备节点被关闭时,MOD_DEC_USE_COUNT减一;uart_write()调用copy_from_user()函数将用户空间的数据拷贝到内核空间,然后通过BTuart发送出去,在该函数中调用了SerialOutputByte()函数;uart_read()首先读BTRBR寄存器,将接收到的数据读到内核空间,然后通过copy_to_user()函数将接收数据拷贝到用户空间;cleanup_module()将BTuart设备驱动卸载;基于中断UART驱动程序设计基于中断UART驱动程序设计,主要函数的功能如下:init_module()初始化串口模块,加载串口设备驱动;uart_open()打开一个串口设备节点,当一个设备节点被打开时,计数器MOD_INC_USE_COUNT加一;uart_release()关闭一个设备节点,当一个设备节点被关闭时,MOD_DEC_USE_COUNT减一;uart_write()首先调用copy_from_user()函数将用户空间的数据拷贝到内核空间,然后通过BTuart发送出去,在该函数中调用了SerialOutputByte()函数;uart_read()interruptible_sleep_on()使接收进程进入睡眠状态,等待中断唤醒睡眠状态;uart_init(void)配置串口的波特率、数据位、停止位、奇偶校验和开启串口接收中断;SerialOutputByte(constcharc)串口发送,将字符C通过串口发送出去;

ARMLinux下应用程序设计

UART应用程序设计基于SOCKET的网络应用程序设计USB摄像头接口应用程序设计

Framebuffer图片显示应用程序设计

UART应用程序设计

在Linux操作系统中对底层终端的处理是一个非常复杂的过程,需要处理许多不同类型的设备。Linux系统处理终端的方法是通过串行接口连接的控制台与系统通信并运行程序。1.终端控制函数介绍在对底层终端操作中有一个用于查询和操作终端的标准接口结构体termios,该结构体对终端的输入、输出、硬件特性、控制协议等方面进行了定义,具体定义如下:c_iflag:用来控制输入处理选项;c_oflag:控制输出数据的处理;c_cflag:设置决定终端硬件特性的控制标志;c_lflag:存放本地模式标志,用来操纵终端特性;c_line:表示控制协议;c_cc:包含特殊字符序列的值以及它们所代表的操作。UART应用程序设计1)终端属性控制函数对终端的操作主要通过属性设置函数tcsetattr()和属性获取函数tcgetattr()来实现。tcsetattr()和tcgetattr()的调用形式如下:inttcsetattr(intfd,intaction,structtermios*tp)函数tcsetattr()使用由tp引用的termios数据结构来设置与文件描述符fd相关联的终端参数inttcgetattr(intfd,structtermios*tp)查询和文件描述符相关联的终端参数,并将参数存储到由tp所引用的termios数据结构体中。UART应用程序设计

2)终端速度控制函数终端速度控制函数用来设置终端设备的输入、输出速度,速度以波特率来定义。这些函数都是成对出现,其中的两个用来获取和设置输入的速度,另两个用来获取和设置输出线路的速度,它们定义形式如下:intcfgetispeed(structtermios*tp)intcfsetispeed(structtermios*tp,speed_tspeed)intcfgetospeed(structtermios*tp)intcfsetospeed(structtermios*tp,speed_tspeed)UART应用程序设计

2串口操作函数步骤1)打开串口函数,返回操作标志2)关闭串口子程序,返回操作标志3)向串口写数据,返回写入串口的总长度4)设置串口参数,主要设置数据位、停止位、奇偶校验位、速度、超时设置等参数,返回操作标志。5)读取串口数据UART应用程序设计

3串口通信源代码的编译1)PC平台的串口通信程序编译将光盘提供的serial.c的源代码复制到硬盘中(假设将源码复制在/root/PAX270_Linux目录下)对源码进行编译。[rootlocalhostPAX270_Linux]#cdserial[rootlocalhostserial]#gcc–oserialserial.c在PC机上运行serial程序;[rootlocalhostserial]#./serial1UART应用程序设计

2)ARM平台的串口通信程序的编译将光盘提供的serialarm的源代码复制到硬盘中(假设将源码复制在/root/PAX270_Linux目录下)设置交叉编译工具参数(arm-linux-gcc)。对源代码进行编译。[rootlocalhostPAX270_Linux]#cdserialarm[rootlocalhost

serialarm]#arm-linux-gcc–oserialarmserialarm.c将编译好的程序serial下载到开发板的/usr/qpe/bin目录下。在目标板上利用chm

温馨提示

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

评论

0/150

提交评论