嵌入式Linux应用程序开发(精品).ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《嵌入式Linux应用程序开发(精品).ppt》由会员分享,可在线阅读,更多相关《嵌入式Linux应用程序开发(精品).ppt(103页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1嵌入式嵌入式Linux应用程序开发应用程序开发主讲人:方攀主讲人:方攀Email:Blog:2Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.嵌入式Linux应用程序开发嵌入式Linux应用程序开发及交叉编译:HelloWorld!嵌入式Linux内核模块开发:HelloModule!Linux环境下多进程及多线程编程3Copyright 2007 Prochip Electronics C
2、o,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.1.1Linux应用程序介绍在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是灵活运用C编译器.目前Linux下最常用的C语言编译器是GCC(GNUCompilerCollection),它是GNU项目中符合ANSIC标准的编译系统,能够编译用C、C+和ObjectC等语言编写的程序.GCC不仅功能非常强大,结构也异常灵活.最值得称道的一点就是它可以通过不同
3、的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula-3和Ada等.开放自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程.在使用GCC编译程序时,编译过程可以被细分为四个阶段:预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking)Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备.和其它常用的编译器一样,GCC
4、也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码GCC提供了30多条警告信息和三个警告级别,使用它们有助于增强程序的稳定性和可移植性此外,GCC还对标准的C和C+语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化,能够减轻编程的工作量.4Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.1.1应用程序起步编写源文件在/root/下建一个自己的目录#mkdirpr
5、oject#cdproject#vimhelloworld.c#includeintmain(void)printf(Welovearm,welovesep4020!n);return1;5Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.代码注意问题代码注意问题main函数的返回值应该是int类型;main函数在终止前没有调用“return1;”语句来结尾。6Copyright 2007 Pr
6、ochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.1.2编译helloworld.c(1)在pc机上编译能在pc机上运行的应用程序的方法#gcc-ohelloworld_pchelloworld.c(这个是用i386的gcc编译器编译的,所以只能在pc机的linux环境中运行)(2)在pc机上编译能在sep4020板子上运行的应用程序的方法#arm-linux-gcc-ohelloworld_armhelloworld.c(这个
7、是用arm的交叉gcc编译器编译的,所以可以下载到板子上运行)7Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.1.3运行helloworld程序(1)在pc机上运行i386的程序rootlocalhostcode#./helloworld_pcWelovearm,welovesep4020!(2)在开发板上运行应用程序将应用程序helloworld_arm拷贝到/nfs/demo文件夹下ro
8、otlocalhostcode#cphelloworld_arm/nfs/demo/#cddemo/demo#./helloworld_armWelovearm,welovesep4020!8Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.2.1编写HelloModule源代码前面我们介绍了一个简单的Linux程序HelloWorld,它是运行于用户态的应用程序,现在我们再介绍一个运行于内核态
9、的HelloModule程序,它其实是一个最简单的驱动程序模块。我们将HelloModule的源代码放置于/root/project/module目录,名称为hellomodule.c,内容如下:9Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.#include#includeMODULE_LICENSE(GPL);staticint_initsep4020_hello_module_init
10、(void)printk(Hello,sep4020moduleisinstalled!n);return0;staticvoid_exitsep4020_hello_module_cleanup(void)printk(Good-bye,sep4020modulewasremoved!n);module_init(sep4020_hello_module_init);module_exit(sep4020_hello_module_cleanup);10Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to b
11、e reproduced by any means without prior written consent.2.2编译HelloModule源代码由于这个模块是加到嵌入式linux的内核中的,所以它肯定会用到许多嵌入式linux源码的头文件的,我们的嵌入式linux的内核源码位置在/linux-3.2/下面,这中间的链接过程非常复杂,为了不让我们手动输入编译指令,一般编译2.6版本的驱动模块需要把驱动代码加入内核代码树,并做相应的配置,如下步骤Step1:把刚才的源码文件拷贝到/linux-3.2/drivers/char/sep4020_char目录下Step2:编辑配置/linux-3
12、.2/drivers/char/sep4020_char的Kconfig文件,加入驱动选项(注意tristate前面有tab键)configSEP4020_HELLOMODULEtristatesep4020hellomoduledriver使之在makemenuconfig的时候出现;11Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.12Copyright 2007 Prochip Ele
13、ctronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.Step3:修改Makefile文件,在其中加入:obj-$(CONFIG_SEP4020_HELLOMODULE)+=hellomodule.oStep4:这时回到/linux-3.2源代码根目录位置,执行makemodules13Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced
14、by any means without prior written consent.2.3把HelloModule下载到开发板并安装使用 14Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.3 Linux进程程编程程3.1Linux进程的概念3.2Linux下的进程启动3.3进程控制编程3.4守护进程编程3.5进程间通信15Copyright 2007 Prochip Electronics
15、 Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.3.1Linux进程的概念(1)进程是一个独立的可调度的活动;(2)进程是一个抽象实体,当它执行某个任务时,将要分配和释放各种资源(P.Denning);(3)进程是可以并行执行的计算部分。以上进程的概念都不相同,但其本质是一样的。它指出了进程是一个程序的一次执行的过程。它和程序是有本质区别的,程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念;而进程是一个动态的概念,它是程序执行的过程,包括
16、了动态创建、调度和消亡的整个过程。它是程序执行和资源管理的最小单位。16Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.进程控制块进程控制块(1)进程是Linux系统的基本调度单位,那么从系统的角度看如何描述并表示它的变化呢?进程标识符:当一个进程产生时,系统都会为它分配一个标识符;进程所占的内存区域:每个进程执行时都需要占用一定的内存区域,此区域用于保存该进程所运行的程序代码和使用的程序变量
17、。每一个进程所占用的内存是相互独立的,因此改变一个进程所占内存中数据的任何改动,都只对该进程产生影响,不会影响到其它进程的顺利执行;文件描述符:当一个进程在执行时,它需要使用一些相关的文件描述符。文件描述符描述了被打开文件的信息,不同的进程打开同一个文件时,所使用的文件描述符是不同的。一个进程文件描述符的改变并不会对其它的进程打开同一个文件的描述符产生任何影响;17Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior writte
18、n consent.进程控制块进程控制块(2)安全信息:一个进程的安全信息包括用户识别号和组识别号;进程环境:一个进程的运行环境包括环境变量和启动该进程的程序调用的命令行;信号处理:一个进程有时需要用信号同其它进程进行通信。进程可以发送和接收信号,并对其作出相应处理;资源安排:进程是调度系统资源的基本单位。当多个进程同时运行时,linux系统内核安排不同进程轮流使用系统的各种资源;18Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without pr
19、ior written consent.进程控制块进程控制块(3)同步处理:多个程序之间同步运行的实现,也是通过进程来完成的。这将会使用到诸如共享内存、文件锁定等方法。进程状态:在一个进程存在期间,每一时刻进程都处在一定的状态,包括运行、等待被调度或睡眠状态。19Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.进程结构体描述进程结构体描述20Copyright 2007 Prochip Ele
20、ctronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.进程的标识进程的标识进程的标识:进程号、父进程号、父进程组号、会话号、会话首领号都是用于从不同的侧面来描述进程的身份测试进程号的代码:/*process.c*/#include#include#includeintmain()/*获得当前进程的进程ID和其父进程ID*/printf(ThePIDofthisprocessis%dn,getpid();printf(ThePPIDofthisproc
21、essis%dn,getppid();return1;21Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.进程状态进程状态一个进程在其生存期内,可处于一组不同的状态下,称为进程状态运行状态(TASK_RUNNING)当进程正在被CPU执行,或已经准备就绪随时可由调度程序执行,则称该进程为处于运行状态(running)。进程可以在内核态运行,也可以在用户态运行;可中断睡眠状态(TASK_INTE
22、RRUPTIBLE)当进程处于可中断等待状态时,系统不会调度该进行执行。当系统产生一个中断或者释放了进程正在等待的资源,或者进程收到一个信号,都可以唤醒进程转换到就绪状态(运行状态);22Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.不可中断睡眠状态(TASK_UNINTERRUPTIBLE)与可中断睡眠状态类似。但处于该状态的进程只有被使用wake_up()函数明确唤醒时才能转换到可运行的
23、就绪状态。暂停状态(TASK_STOPPED)当进程收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时就会进入暂停状态。可向其发送SIGCONT信号让进程转换到可运行状态。僵死状态(TASK_ZOMBIE)当进程已停止运行,但其父进程还没有询问其状态时,则称该进程处于僵死状态。23Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.24Copyright 2007 Proch
24、ip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.Linux下进程的模式和类型下进程的模式和类型在Linux系统中,进程的执行模式划分为用户模式和内核模式。如果当前运行的是用户程序、应用程序或者内核之外的系统程序,那么对应进程就在用户模式下运行;如果在用户程序执行过程中出现系统调用或者发生中断事件,那么就要运行操作系统(即核心)程序,进程模式就变成内核模式。在内核模式下运行的进程可以执行机器的特权指令,而且此时该进程的运行不受用户的干
25、扰,即使是root用户也不能干扰内核模式下进程的运行。用户进程既可以在用户模式下运行,也可以在内核模式下运行,25Copyright 2007 Prochip Electronics Co,ltd.All Rights Reserved.Not to be reproduced by any means without prior written consent.3.2 Linux下的进程启动下的进程启动 Linux下启动一个进程有两种主要途径:手工启动和调度启动。手动启动是由用户输入命令直接启动进程,而调度启动是指系统根据用户的设置自行启动进程。(1)手工启动,又可分为前台启动和后台启动。前
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 Linux 应用程序 开发 精品
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内