本书系统论述了基于ARM处理器的嵌入式Linux系统开发的原理、方法与实践。全书共15章,分别介绍了嵌入式Linux系统管理、Linux编程基础、Linux高级编程、Linux内核开发、Linux系统移植和Linux驱动程序开发等。
本书内容吸收了作者在Linux系统教学、科研和实际项目研发中的经验,实践性强。在内容编排上,按照读者学习的一般性规律,结合大量实例论述,能够使读者高效地掌握嵌入式Linux系统的基本原理和应用方法。本书既可以作为高等院校相关专业的教材,也可以作为从事嵌入式系统开发人员的参考用书。
嵌入式系统的知识体系庞大,在授课学时不断减少的背景下,要根据不同专业对嵌入式课程体系进行具体的设计。对于嵌入式教学存在的种种弊端,应做到“因课施教”。嵌入式学习必须配合实践,这是因为实践可以激发学习兴趣,提高学习能力,而且有助于检验学习效果。正是在这种背景下,笔者在总结教学团队的丰富教学经验的基础上,从嵌入式操作系统开发的工程实践出发,将操作系统安装、操作系统开发、Linux高级编程、底层驱动等内容有机地结合在一起,构建起嵌入式系统开发的完整过程。力争从实际应用角度出发,培养逻辑思维和创新思维能力,提高分析、解决实际工程问题的能力。
(1)从零开始,轻松入门系统阐述理论的同时,兼顾内容的实用性和可读性,从C语言入手,便于理解和运用。
(2)经典实例,清晰直观从Linux基本操作入手,以VI、GCC、高级编程为主线,直到系统驱动开发,均给出了丰富的实例,并给出了实例的完整代码和运行结果,注重实例的科学分析方法,并妥善处理好知识点与实例的有效衔接。
(3)图文并茂,操作简单根据读者认识和学习嵌入式开发的规律编排内容,将数学工具工程化,将抽象问题形象化,将复杂问题简单化,将零散问题系统化,并给出笔者理解的“标签”。
(4)教学课件配书教案(PPT)可到清华大学出版社网站本书页面下载。
(5)学习辅导书中配套代码,开发环境,读者可通过QQ群获取并在线学习答疑。
嵌入式系统及其应用是一个庞大的知识体系,笔者在多年的授课过程中,也很难选择一本合适的书作为本科学生的授课教材。结合课堂讲稿和学生的部分毕业设计内容,以及在学生学习过程中经常遇到的问题,笔者整理成本书——《嵌入式Linux系统开发——基于ARM处理器通用平台》,之所以这么命名,是打破了以前ARM9体系或者ARM11体系的框架。Linux操作系统在ARM9之上的处理器均有较好的兼容,读者稍加修改,代码就能应用,所以命名时就回避了某一款处理器的限定。关于嵌入式有太多的内容可以介绍,本书侧重应用,并结合了当前嵌入式的发展和应用。
嵌入式系统无疑是当前最热门、最有发展前途的IT应用领域之一。嵌入式系统用在某些特定的专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时还对实时响应等要求很高。特别是随着消费家电的智能化,嵌入式更显重要。像我们平时常见的手机、PDA、电子字典、可视电话、数字相机、数字摄像机、机顶盒、高清电视、游戏机、智能玩具、交换机、路由器、数控设备或仪表、汽车电子、家电控制系统、医疗仪器、航天航空设备等都是典型的嵌入式系统。
嵌入式系统是软硬结合的产品,嵌入式开发主要分为两类。
一类是无线电相关专业,例如电子工程、通信工程等专业出身的人,他们主要搞硬件设计,有时需要开发一些与硬件关系最密切的最底层软件(例如BootLoader、BoardSupportPackage)、最初级的硬件驱动程序等。他们的优势是对硬件原理非常清楚,不足是他们更擅长定义各种硬件接口,但对复杂的软件系统往往力不从心(例如嵌入式操作系统原理和复杂的应用软件等)。
另一类是软件、计算机专业出身的人,主要从事嵌入式操作系统和应用软件的开发。如果我们学软件的人对硬件原理和接口有较好的掌握,也完全可以编写BSP和硬件驱动程序。嵌入式硬件设计完成后,各种功能就全靠软件来实现了。嵌入式设备的增值很大程度上取决于嵌入式软件,设备越智能,系统越复杂,软件的作用越关键,这也是目前的趋势。
目前,国内外的相关人才都很稀缺。一方面,该领域入门门槛较高,不仅要了解较底层的软件(例如操作系统级、驱动程序级软件),对软件专业水平要求较高(嵌入式系统对软件设计的时间和空间效率要求较高),而且必须熟悉硬件的工作原理,所以非专业IT人员很难切入这一领域;另一方面,该领域较新,发展太快,很多软硬件技术出现时间不长或正在出现(例如ARM处理器、嵌入式操作系统、MPEG技术、无线通信协议等),掌握这些新技术的人较少。嵌入式人才稀缺,身价自然就高。嵌入式人才稀少的根本原因可能是大多数人无条件接触该领域,这需要相应的嵌入式开发板和软件,另外需要有经验的人进行开发流程的指导。
与企业计算等应用软件的开发人员不同,嵌入式领域人才的工作强度通常较低,收入却很高。从事企业应用软件的IT人员,这个用户的系统开发完成后,又要去开发下一个用户的系统,并且每个用户的需求和完成时间都必须按客户要求改变,往往疲于奔命,重复劳动。相比而言,开发嵌入式系统的公司,都有自己的产品计划,按自己的节奏行事,所开发的产品通常是通用的,不会因客户的不同而修改。某一型号的产品开发完成后,往往有较长的一段空闲时间(或只是对软件进行一些小修补),有时间进行充电和休整。另外,从事嵌入式软件开发的人员的工作范围相对狭窄,所涉及的专业技术范围比较小(ARM、RTOS、MPEG、802.11等),随着时间的累积,经验也逐渐累积,可“倚老卖老”,寥寥数语的指导就足够让初入道者琢磨半年。如果从事应用软件开发,可能不同的客户的软件开发平台也完全不同,这会使得开发工作也相对更加辛苦。
嵌入式开发更注重的是练习,嵌入式系统开发设计最难的是入门,嵌入式系统开发涉及知识较多,初学者很难从纷杂的知识中快速上手学习,现在市面上用于嵌入式开发的学习板比比皆是,价格都比较低廉,读者可以买一款相对通用的开发板,按照书中的操作练习,本书将一步一步引导初学者进行嵌入式开发的学习。任何知识的学习都是由浅入深,由感性认识到理性认识,掌握了前几章的学习,相信读者一定能够掌握嵌入式入门开发的基本要领。
本书主要由冯新宇编写。此外,本书第11~15章由蒋洪波编写。参与编写的还有杨昕宇、刘宇莹、刘琳、史殿发、孟莹等。
感谢广州碾展公司的技术支持!
感谢您选择了本书,希望我们的努力对您的工作和学习有所帮助,也希望您把对本书的意见和建议反馈给我们。
作者
2017年4月
冯新宇黑龙江科技大学副教授,长期从事嵌入式系统项目开发和相关教学工作。曾主持或参与嵌入式相关课题和项目开发20余项;近10年来一直作为指导教师参与全国电子设计大赛、飞思卡尔电子设计大赛、黑龙江省电子设计大赛等工作,所指导的学生多次获得各种赛事重大奖励。代表性著作有《ADS2009射频电路设计与仿真》、《四旋翼无人飞行器设计》与《ARMCortex-M3体系结构与编程》。
第1章Linux概述与系统管理1
1.1嵌入式系统概述1
1.1.1嵌入式系统的发展历史1
1.1.2嵌入式系统的特点2
1.1.3嵌入式系统的体系结构2
1.1.4典型嵌入式系统介绍3
1.2嵌入式Linux基础4
1.2.1Linux发行版本4
1.2.2Linux定制安装6
1.3Linux常用命令18
1.3.1系统管理相关命令18
1.3.2文件管理相关命令19
1.3.3备份压缩相关命令25
1.3.4网络通信相关命令26
1.3.5其他常用命令30
1.4服务器配置34
1.4.1samba服务器34
1.4.2NFS服务器38
1.4.3TFTP服务器40
习题与练习42
第2章Linux脚本编程43
2.1常用shell命令43
2.2脚本编写基础44
2.2.1特殊字符44
2.2.2变量和参数46
2.2.3退出和退出状态48
2.3流程控制49
2.3.1条件测试49
2.3.2操作符相关主题51
2.3.3循环控制53
2.3.4测试与分支55
习题与练习58
第3章Linux编程基础59
3.1编辑器介绍59
3.1.1vi介绍59
3.1.2vi的各模式功能键60
3.2程序编译与调试63
3.2.1gcc编译流程64
3.2.2gcc编译选项分析64
3.2.3gdb程序调试69
习题与练习75
第4章C语言进阶76
4.1C语言的基本知识76
4.2数据类型77
4.2.1常量和变量78
4.2.2进制78
4.2.3字符79
4.2.4转义符与字符集79
4.2.5类型转换79
4.2.6输入输出82
4.2.7运算符83
4.3控制语句86
4.3.1分支语句86
4.3.2循环语句88
4.4数组与字符串97
4.4.1数组的定义97
4.4.2数组本质探讨98
4.4.3一维数组和二维数组99
4.4.4字符串101
4.5函数103
4.5.1函数的定义103
4.5.2函数的深度剖析103
4.5.3函数的作用剖析104
4.6指针108
4.6.1指针的本质108
4.6.2连续空间的内存地址108
4.6.3指针变量109
4.6.4指针数组和指针的指针111
4.6.5函数和指针115
4.7预处理指令119
4.7.1宏定义120
4.7.2#include121
4.7.3条件编译121
习题与练习123
第5章文件I/O编程124
5.1文件和目录124
5.2目录操作126
5.3文件操作134
5.3.1基本概念134
5.3.2检查文件及确定文件的权限136
5.3.3创建文件137
5.3.4打开文件138
5.3.5关闭文件139
5.3.6删除文件140
5.3.7文件指针移动142
5.3.8其他常用函数145
5.4设备控制148
5.5Linux时间编程159
5.5.1取得目前的时间159
5.5.2取得目前时间和日期160
5.5.3取得当地目前时间和日期161
5.5.4将时间结构数据转换成经过的秒数162
5.5.5设置目前时间162
5.5.6取得当前时间163
5.5.7将时间和日期以ASCII码格式表示164
5.5.8将时间和日期以字符串格式表示164
习题与练习165
第6章进程控制166
6.1进程控制概述166
6.1.1进程的定义166
6.1.2进程控制块167
6.1.3分配进程描述符168
6.1.4进程的创建168
6.1.5进程状态169
6.1.6进程调度171
6.1.7虚拟内存172
6.1.8文件锁172
6.2进程控制编程173
6.2.1创建进程173
6.2.2进程终止181
6.2.3守护进程186
习题与练习187
第7章进程间通信188
7.1进程间通信概述188
7.2管道通信190
7.2.1无名管道190
7.2.2有名管道192
7.2.3标准流管道195
7.3消息队列196
7.3.1键值196
7.3.2打开/创建消息队列197
7.3.3发送消息197
7.3.4接收消息198
7.3.5消息控制198
7.4信号201
7.4.1信号处理的方式201
7.4.2信号操作指令201
7.5信号量207
7.5.1信号量创建208
7.5.2信号量操作208
7.6内存共享214
7.6.1共享内存创建214
7.6.2共享内存的操作216
7.6.3共享内存段连接到本进程空间216
7.6.4共享内存解除217
习题与练习220
第8章多线程技术221
8.1Linux多线程概念221
8.2Linux线程实现222
8.2.1线程创建222
8.2.2线程退出224
8.2.3线程等待226
8.2.4线程标识获取228
8.2.5线程清除229
8.3线程函数传递及修改线程的属性232
8.3.1线程函数传递232
8.3.2绑定属性235
8.3.3分离属性236
8.3.4优先级属性237
8.3.5线程的互斥239
8.3.6线程的同步241
8.3.7信号量243
习题与练习245
学习Linux环境高级编程,首先学习的是文件的操作。因为有一句很有趣的话“Linux下一切皆文件”。所以掌握了文件操作的方法,也就算摸到了门路。
5.1文件和目录
首先直观地感受一下,在终端下输入命令ls-l,如图5-1所示。
图5-1文件目录
图5-1的前2行为
drwxr-xr-x2rootroot40962015-06-251111
-rw-r--r--1rootroot02015-06-2511.c
1.drwxr-xr-x
drwxr-xr-x代表的是文件类型和文件权限。常用的文件类型有:
(1)-:普通文件,存各种数据。
(2)d:目录文件,存结构体,结构体内部标识这个目录中的文件名称等信息。
(3)l:链接文件,需要注意的是,软链接才是文件,而硬链接仅仅是一节点。
(4)c:字符设备,除了块设备都是字符设备,没有扇区的概念。
(5)b:块设备,所有存储类的驱动都称为块设备,包含扇区处理。
(6)p:管道设备,是用内核内存模拟的通道。
从上述说明可以看出,例子中的文件是一个目录文件,原因是第一个符号代表文件类型,d代表此文件是一个目录文件。
2.文件权限
文件权限有:
(1)r为读,二进制权重为100,即4。
(2)w为写,二进制权重为010,即2。
(3)x为执行,二进制权重为001,即1。
(4)-为无操作,二进制权重为0。
(5)rwx的顺序不可改,表示可读可写可执行。
(6)-wx表示不能读,可写可执行。
上述就是文件权限的表示方法,文件权限是用八进制来表达的,如果一个文件有全部的权限,那么对应八进制里的数是7(4+2+1)。同时读者会发现有多组rwx,它所表达的不仅仅是它自身的权限。这里涉及一个分组的概念。
(1)u组:创建者(user);
(2)g组:创建者所在组的成员(group);
(3)o组:其他人所具备的权限(other)。
也就是说,例子中的三组rwx都是依照上述顺序来说明权限的。例子里的文件权限就是:创建者可读可写可执行,所在组的成员可读可执行,其他成员可读不可写不可执行。
3.2
图中文件类型和权限之后是数字2,这个2表示的是文件节点数,也就是说,此文件是一个目录文件。所以,目录的节点数代表该目录下的文件个数,在这里应该是有两个文件。如果此文件不是目录,只是普通文件,那么这个数字就代表硬链接的个数。关于链接的几点说明如下:
(1)链接分为硬链接和软链接(符号链接,即快捷方式)。
(2)硬链接,只是增加一个引用计数,本质上并没有物理上的增加文件。硬链接不是文件。
(3)符号链接,是在磁盘上产生一个文件,这个文件内部写入了一个指向被链接的文件的指针。
(4)采用ln指令,用来在文件之间创建链接,默认为创建硬链接(目录不能创建硬链接),使用选项-s创建符号链接。硬链接指向文件本身,符号链接指向文件名称。
(5)Linux里寻找文件的顺序是,根据文件名,找到inode编号,根据编号找到inode块,然后根据inode块中的属性信息找到数据块(即文件内容)。
(6)符号链接、硬链接、Windows快捷方式都具有指向功能;但它们的区别也很明显:Windows快捷方式指向文件的位置,符号链接是一种文件,创建链接时,系统会为符号链接重新分配一个inode(节点)编号,但硬链接根本不是一种文件,只是一种指向。
(7)创建硬链接只是增加一个引用计数,硬链接和它的源文件共享一个inode。
……