《ARM嵌入式Linux系统开发技术详解》是2008年电子工业出版社出版的图书,作者是杨水清。
基本介绍
- 书名:ARM嵌入式Linux系统开发技术详解
- 作者:杨水清
- ISBN:9787121074691
- 类别:图书 >> 计算机/网路 >> 作业系统/系统开发 >> LINUX
- 页数:620
- 定价:75.00
- 出版社:电子工业出版社
- 出版时间:2008-11-1
- 开本:16开
宣传语
继《Windows驱动开发技术详解》之后又一本心血力作!
原创经典,嵌入式系统一线工程师倾力打造。
深入Linux系统底层和核心,透析ARM嵌入式Linux系统开发的本质。
通过嵌入式系统开发实例,归纳ARM嵌入式Linux系统开发的整个过程。
内容简介
本书由浅入深、通俗易懂地讲解了嵌入式Linux的系统设计与开发。从嵌入式处理器ARM开始,讲解了ARM处理器的资源、ARM的指令集、ADS开发工具、嵌入式系统硬体环境的构建、Boot Loader、Linux核心移植、嵌入式档案系统、嵌入式Linux多任务程式开发、嵌入式Linux设备驱动开发、嵌入式Linux网路程式开发、MiniGUI图形界面开发、设备驱动开发案例、综合案例等内容。
书中通过大量的例程来讲解知识要点,并提供了大量极有参考价值的开发案例,读者可以通过这些例程和开发案例对嵌入式Linux开发有一个系统的学习和提高。
本书共有四个方面的内容。在嵌入式系统的硬体结构中讲述了嵌入式处理器ARM的特点、嵌入式系统硬体环境的构建和ADS开发工具的使用。在嵌入式Linux系统移植中讲述了目标板软体环境的构建,主要包括Boot Loader、Linux核心、档案系统以及交叉开发环境的构建。在嵌入式Linux软体开发中讲述了嵌入式Linux C语言开发工具的使用、标準库的使用、多任务开发基础和设备驱动开发基础。在嵌入式套用系统实例分析中讲述了嵌入式Linux的网路程式开发、MiniGUI图形界面开发、CAN汇流排设备驱动设计、DM9000网路驱动设计、SD卡驱动设计和嵌入式B超系统设计。
本书语言通俗易懂,内容丰富,注重理解与实例,知识涵盖面广。非常适合从事嵌入式Linux系统开发的初级工程师、高校学生、Linux程式开发人员阅读和学习。
前言
你想知道手中的MP4由什幺组成吗?
你想亲手製作一个电子相框吗?
你想深入研究作业系统核心,学习编写驱动程式吗?
你想为嵌入式系统设计功能强大的图形界面吗?
你想知道一个真实的嵌入式系统是如何从无到有建立起来的吗?
本书将从作者亲身开发的经验带给你详细实用的解答!
嵌入式Linux开发的前景
嵌入式产业发展迅猛,已成为计算机体系的重要组成部分。嵌入式系统产品正不断渗透各个行业,其产业增幅也不断加大。在计算机后PC技术时代,嵌入式系统将拥有最大的市场。任何一个普通人都可以拥有从小到大的各种使用嵌入式技术的电子产品,小到手机、MP3等,大到智慧型家电、车载电子设备等。在工业和服务领域中,使用了嵌入式技术的数字工具机、工业机器人、安全系统等也在逐渐改变传统工业和服务方式。正是因为有如此大的需求,所以促使笔者结合多年的开发经验,编写了本书。
本书特点
1.注重读者的学习与接受情况:在嵌入式Linux系统下进行开发,一个很大的困难就是各种工具纷繁複杂,不知从何入手。本书在每个部分都安排了一章,引导读者一步一步熟悉各种开发工具和环境,使读者首先建立起感性认识,为进一步深入学习打下基础。
2.代码注释规範细緻:为了便于读者学习,在实例代码中,进行了非常详细的注释。这些注释可以引导读者理解和掌握编写程式的关键过程。例如下面的代码,是C语言标準库章节中的实例。在实例中,对代码的档案名称、代码的作用和重要函式的功能提示,都体现在了代码注释中。
/**********************************************************************************/
/*档案:program_16_3.c */
/*简介:将字元串a,b,c分别採用10,2,16进制转换成数字 */
/**********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *a="1000000000";
char *b="1000000000";
char *c="ffff";
/*将字元串a採用10进制转换成数字*/
printf("a=%d\n",strtol(a,NULL,0));
/*将字元串b採用2进制转换成数字*/
printf("b=%d\n",strtol(b,NULL,2));
/*将字元串c採用16进制转换成数字*/
printf("c=%d\n",strtol(c,NULL,16));
return 0;
}
3.Eclipse集成开发环境:长期以来Linux开发没有统一的开发平台,大多数的开发者都直接使用VI、GCC等命令行工具,这样其实不利于大型项目的开发,这也是很多开发者感到遗憾的地方。笔者经过多年的比较,引入了Eclipse作为进行嵌入式Linux开发的集成开发环境,取得了很好的效果(如下图所示),因此把它介绍给读者。
4.起点高、内容新:市场上大多介绍嵌入式Linux开发的同类书籍都是基于Linux 2.4核心的,2.6版本的核心已经十分成熟了,取代2.4版本的核心指日可待。而且,与之配套的还需要基于2.6核心的Linux开发平台。因此笔者选择了基于2.6核心的Ubuntu系统、arm-linux-gcc 3.4作为开发平台(如下图所示),介绍给读者,帮助读者抢占嵌入式Linux开发领域的制高点。
5.内容深入:本书在注重基础和实际的同时,注重知识的扩充。设备驱动开发、网路程式设计和图形界面编程是在实际中套用极为广泛的内容,本书中对这些知识的讲述可以使读者对嵌入式Linux系统的开发有一个从书本到实践的本质上的提高。
本书适合的读者
嵌入式Linux开发入门者;
高校计算机、电子专业学生;
高校毕业设计的学生;
嵌入式Linux爱好者;
嵌入式Linux相关学习和研究的研究生;
嵌入式Linux程式设计师。
致谢
感谢吴伟的通力合作,精心撰写了第11章、第15章和第19章。
感谢我们的家人(唐颖、俞秋华),是你们的支持使我们坚持写完本书。
感谢所有开放源码软体和开发文档的作者们。
目录
第1章 嵌入式系统概述 1
本章介绍了嵌入式系统的一些基础知识,解释了什幺是嵌入式系统、嵌入式系统中的处理器以及嵌入式系统中的软体系统。在学习了本章的内容以后,读者会对嵌入式系统有个整体的印象。本章将读者引入嵌入式系统开发的大门,从下一章开始,将逐步学习嵌入式系统的开发过程。
1.1 嵌入式系统简介 1
1.1.1 嵌入式系统 1
1.1.2 嵌入式系统的特点 2
1.1.3 嵌入式系统的发展趋势 2
1.2 嵌入式系统中的处理器 4
1.2.1 微处理器 4
1.2.2 微控制器 4
1.2.3 数位讯号处理器 5
1.2.4 嵌入式片上系统 5
1.3 嵌入式系统中的软体系统 5
1.3.1 嵌入式系统中的软体系统 5
1.3.2 嵌入式系统软体开发的一般过程 6
1.3.3 嵌入式应用程式的开发 6
1.4 本章小结 6
第2章 快速体验——目标板 7
本章首先介绍了目标板的结构,然后带着读者对该目标板做了一番初次体验。包括软体的安装和简单使用,以及在Linux下体验Telnet和ftp命令。希望通过本章的讲解,使读者对嵌入式系统开发有一个初步的、感性的认识。
2.1 目标板结构 7
2.2 ARM初体验 8
2.2.1 测试ARM处理器 8
2.2.2 安装ADS 1.2 9
2.2.3 安装Multi-ICE和配置AXD 10
2.2.4 ADS的简单使用 12
2.2.5 使用Telnet和ftp 15
2.3 本章小结 16
第3章 ARM的内部资源 17
本章对S3C2440嵌入式处理器片内资源的基本特性及功能进行了简单的描述,希望读者通过对本章的阅读,能对S3C2440嵌入式处理器的片内资源有一个比较全面的了解和掌握,但在此处不过于深入讨论每一个功能模组的具体细节。如果读者有兴趣对S3C2440的各个功能模组进行详细的了解,可以参考相关用户手册。
3.1 S3C2440微处理器 17
3.1.1 主要结构 17
3.1.2 片内资源 18
3.1.3 体系结构 18
3.2 S3C2440存储器映射 18
3.2.1 bank0汇流排宽度 18
3.2.2 nWAIT引脚的作用 19
3.2.3 nXBREQ/nXBACK引脚操作 19
3.3 S3C2440内部资源详解 20
3.3.1 Cache高速快取 20
3.3.2 时钟和电源管理 20
3.3.3 中断控制器 22
3.3.4 脉冲频宽调製定时器(PWM) 23
3.3.5 实时时钟(RTC) 23
3.3.6 通用I/O连线埠 24
3.3.7 LCD控制器 24
3.3.8 UART控制器 25
3.3.9 A/D转换和触控萤幕接口 25
3.3.10 看门狗定时器 26
3.3.11 IIC汇流排接口 26
3.3.12 AC97音频解码器接口 27
3.3.13 USB设备控制器 27
3.3.14 SD接口 27
3.3.15 SPI接口 28
3.3.16 相机接口 28
3.3.17 工作电压 29
3.4 本章小结 29
第4章 熟悉ARM处理器 30
本章首先介绍了ARM公司的历史,并列出了使用比较流行的ARM处理器系列,读者可以根据不同的需要做出自己的选择。接下来详细介绍了ARM的指令集。希望读者通过本章的学习,能对ARM处理器有一个大体的认识,熟悉ARM的指令集并在实际开发中学习和套用。
4.1 为什幺用ARM 30
4.2 ARM公司简介 30
4.3 ARM微处理器系列 30
4.3.1 ARM7微处理器 30
4.3.2 ARM9微处理器 31
4.3.3 ARM10微处理器 31
4.3.4 ARM11微处理器 32
4.4 ARM微处理器的结构 32
4.4.1 体系结构 32
4.4.2 暂存器结构 33
4.4.3 指令结构 33
4.5 ARM微处理器的选择 33
4.5.1 核心的选择 33
4.5.2 工作频率的选择 33
4.5.3 晶片记忆体储器的选择 33
4.5.4 片内外围电路的选择 34
4.6 ARM的指令集概述 34
4.6.1 ARM微处理器的指令分类和格式 34
4.6.2 指令的条件域 35
4.7 ARM指令的定址方式 36
4.7.1 立即定址 36
4.7.2 暂存器定址 36
4.7.3 暂存器间接定址 36
4.7.4 基址变址定址 36
4.7.5 多暂存器定址 37
4.7.6 相对定址 37
4.7.7 堆叠定址 37
4.8 ARM指令集详解 37
4.8.1 跳转指令 38
4.8.2 数据处理指令 38
4.8.3 乘法指令与乘加指令 42
4.8.4 程式状态暂存器访问指令 44
4.8.5 载入/存储指令 45
4.8.6 批量数据载入/存储指令 47
4.8.7 数据交换指令 47
4.8.8 移位指令 48
4.8.9 协处理器指令 49
4.8.10 异常产生指令 51
4.9 本章小结 51
第5章 熟悉ADS集成开发环境 52
本章介绍了ADS集成开发环境。通过具体的例子,展示了ADS的使用过程和主要功能。希望读者通过本章的学习,能够初步学会使用ADS,帮助自己学习和开发ARM系统。
5.1 命令行开发工具 52
5.1.1 armcc介绍 52
5.1.2 armcc用法详解 53
5.1.3 armlink介绍 54
5.1.4 armlink用法详解 54
5.1.5 ARM运行时库 54
5.1.6 CodeWarrior集成开发环境 55
5.1.7 ADS调试器 56
5.1.8 实用程式 57
5.1.9 支持的软体 57
5.2 使用ADS创建工程 57
5.2.1 建立一个工程 58
5.2.2 编译和连结工程 60
5.2.3 target设定选项 60
5.2.4 Language Settings 61
5.2.5 Linker设定 62
5.2.6 ARM fromELF工具 63
5.2.7 命令行下编译工程 64
5.3 使用AXD调试代码 65
5.3.1 打开调试档案 65
5.3.2 查看存储器内容 65
5.3.3 设定断点 66
5.3.4 查看变数值 67
5.4 本章小结 67
第6章 ARM的外部电路 68
本章详细介绍了基于S3C2440处理器的基本套用电路图。这些电路在S3C2440微处理器的系统设计中会经常使用到,读者也可以根据自身的实际需求,做必要的修改。
6.1 核心板电路 68
6.1.1 晶振电路 68
6.1.2 复位电路 69
6.1.3 启动配置电路 69
6.1.4 FLASH接口 69
6.1.5 SDRAM接口 70
6.2 底板电路 73
6.2.1 电源电路 73
6.2.2 串口电路 74
6.2.3 USB接口 74
6.2.4 乙太网接口 76
6.2.5 JTAG调试接口 76
6.2.6 音频接口 76
6.2.7 LCD接口 77
6.2.8 SD卡接口 78
6.3 本章小结 79
第7章 嵌入式作业系统概述 80
本章从作业系统的一般特性讲起,介绍了作业系统的进程管理、存储管理、档案管理和设备管理等基本功能。然后对嵌入式作业系统与一般作业系统的特性进行了区别,介绍了嵌入式作业系统的特点、发展和分类。书中末尾章节介绍了常见的一些嵌入式作业系统及它们的特点和主要的套用领域。
7.1 作业系统的结构和功能 80
7.2 进程管理 81
7.2.1 进程的描述 82
7.2.2 进程的调度 82
7.3 存储管理 83
7.3.1 存储器的体系结构 83
7.3.2 记忆体管理的基本概念 84
7.3.3 连续分配存储管理方式 84
7.3.4 页式存储管理方式 86
7.4 档案管理 87
7.4.1 档案 88
7.4.2 目录 89
7.4.3 EXT2档案系统 89
7.5 设备管理 92
7.5.1 设备的分类 92
7.5.2 数据传输控制方式 93
7.5.3 中断处理 93
7.5.4 设备驱动程式 94
7.6 嵌入式作业系统的特点 95
7.6.1 嵌入式作业系统的发展 95
7.6.2 嵌入式作业系统的优势 96
7.6.3 嵌入式作业系统的分类 96
7.7 常见的嵌入式作业系统 97
7.7.1 VxWorks 97
7.7.2 pSOS 97
7.7.3 Palm OS 98
7.7.4 QNX 98
7.7.5 Windows CE 99
7.7.6 μC/OS-II 100
7.7.7 嵌入式Linux 100
7.8 本章小结 101
第8章 快速体验——构建开发环境 102
本章主要介绍了嵌入式开发环境的构建过程,首先对交叉开发的概念进行了介绍,说明了在嵌入式系统的开发中採用交叉开发的原因。然后分别介绍了主机环境和目标板系统环境的构建过程,同时对这两个环境的连线方式也做了简要的介绍。
最后介绍了目标板系统的三个主要方面:Bootloader、Kernel和根档案系统,说明了它们的作用和构建方法,同时举例说明了一些常用配置的配置方法。
8.1 交叉开发环境介绍 102
8.2 主机与目标板的连线方式 103
8.2.1 串口通信接口 103
8.2.2 乙太网接口 104
8.2.3 USB接口 104
8.2.4 JTAG接口 105
8.3 建立主机开发环境 105
8.3.1 Ubuntu 6.06的安装 105
8.3.2 Minicom的安装配置 107
8.3.3 Tftp服务的安装配置 109
8.3.4 NFS的安装配置 110
8.3.5 建立交叉工具链 112
8.4 启动目标板系统 116
8.4.1 Bootloader和Kernel 117
8.4.2 根档案系统 118
8.5 本章小结 119
第9章 Linux使用基础 120
Linux的命令行博大精深,有数不清的内容等待读者去探索。本章仅就一些最基本的知识做了最简要的介绍。另外由于Linux中的命令非常多,要全部介绍也是几乎不可能的。因此,本章按照命令的用途进行了分类讲解,力求举一反三。通过本章的介绍,相信读者可以很快地掌握Linux命令行的基本操作,并熟练掌握常用的命令。
9.1 Linux的基本概念 120
9.1.1 档案 120
9.1.2 目录 120
9.1.3 分区 121
9.1.4 挂载 122
9.1.5 用户系统 122
9.1.6 用户许可权 122
9.1.7 shell 123
9.1.8 环境变数 124
9.2 Linux的命令行 124
9.2.1 执行命令 124
9.2.2 参数 125
9.2.3 重定向符号 125
9.2.4 获取帮助 125
9.3 Linux的常用命令 127
9.3.1 档案管理 127
9.3.2 内容管理 130
9.3.3 许可权管理 131
9.3.4 备份压缩 132
9.3.5 系统设定 133
9.3.6 进程控制 136
9.3.7 网路设定 138
9.4 本章小结 139
第10章 Boot Loader 140
本章介绍了Boot Loader的概念、基本结构,并对Boot Loader的一般工作原理进行了介绍,重点介绍了vivi和U-Boot的开发调试及使用。通过学习这两种常见的Boot Loader,可以使读者实际接触到Boot Loader的工作原理和代码实现。
10.1 Boot Loader的概念 140
10.1.1 Boot Loader所支持的嵌入式体系 141
10.1.2 Boot Loader的安装位置 141
10.1.3 Boot Loader的启动过程 142
10.1.4 Boot Loader与主机的通信 142
10.1.5 Boot Loader的操作模式 142
10.2 Boot Loader的基本结构 143
10.2.1 Boot Loader的stage1 143
10.2.2 Boot Loader的stage2 144
10.3 vivi简介 149
10.3.1 vivi的体系架构 149
10.3.2 vivi启动的第一阶段 150
10.3.3 vivi启动的第二阶段 154
10.4 vivi的基本命令 158
10.4.1 mem命令 158
10.4.2 load命令 159
10.4.3 part命令 159
10.4.4 param命令 160
10.4.5 boot命令 160
10.4.6 go命令 161
10.4.7 bon命令 161
10.4.8 reset命令 161
10.4.9 help命令 162
10.5 U-Boot简介 162
10.5.1 U-Boot的特点 162
10.5.2 U-Boot的目录结构 163
10.5.3 U-Boot的启动过程 163
10.5.4 U-Boot的移植 165
10.6 U-Boot的基本命令 167
10.6.1 设定环境变数 167
10.6.2 数据通信 167
10.6.3 存储器操作 168
10.6.4 系统引导 168
10.6.5 其他 169
10.7 本章小结 169
第11章 Linux核心移植 170
本章给读者讲解了Linux核心移植中需要的基本知识,包括:Linux核心的5个子系统及其相互关係;Linux核心源码各目录包含模组及其功能;Linux核心编译的方法和步骤;Linux核心编译时的详细配置指南;Linux核心下载和调试的相关知识。其中需要初学者熟练掌握Linux编译的方法和步骤,并对其他相关知识有所了解。
11.1 Linux核心结构 170
11.2 Linux源码结构 171
11.2.1 arch目录 172
11.2.2 drivers目录 172
11.2.3 fs目录 173
11.2.4 其他目录 174
11.3 核心编译 175
11.3.1 编译準备 175
11.3.2 设定flash分区 176
11.3.3 配置核心 178
11.4 核心配置选项 180
11.4.1 常规设定 180
11.4.2 模组和块设备层 182
11.4.3 CPU类型 183
11.4.4 电源管理 185
11.4.5 汇流排和网路 187
11.4.6 驱动 188
11.4.7 档案系统 195
11.4.8 其他 198
11.5 下载核心 200
11.6 核心调试 201
11.6.1 核心调试步骤 201
11.6.2 常见核心问题 202
11.7 本章小结 203
第12章 嵌入式Linux档案系统 204
本章首先介绍了嵌入系统中两种主要的存储介质NAND Flash和NOR Flash,对它们的特点和区别进行了阐述。然后介绍了常见的适用于嵌入式系统的5种档案系统:CramFS档案系统、YAFFS 1/2档案系统、JFFS 1/2档案系统、Ramdisk档案系统和TmpFS/RamFS档案系统,分析了这些档案系统的基本结构和实现原理,介绍了各种档案系统及相应的映像档案的製作方法。最后针对档案系统的选择和设计提出了参考意见和方法。
12.1 嵌入式档案系统基础 204
12.1.1 NOR型Flash存储器 204
12.1.2 NAND型Flash存储器 205
12.1.3 MTD 简介 206
12.1.4 日誌型档案系统 207
12.1.5 BusyBox 208
12.2 CramFS档案系统 210
12.2.1 CramFS档案系统的特性 210
12.2.2 CramFS档案系统映像档案的结构 211
12.2.3 CramFS档案系统的工作原理 211
12.2.4 CramFS档案系统的初始化过程 212
12.2.5 CramFS档案系统的製作 213
12.2.6 CramFS档案系统的挂载流程 216
12.3 YAFFS档案系统 216
12.3.1 YAFFS档案系统的数据存储方式 217
12.3.2 YAFFS档案系统的工作原理 218
12.3.3 YAFFS档案系统对MTD的依赖性 219
12.3.4 YAFFS档案系统驱动的安装流程 221
12.3.5 YAFFS档案系统的製作 222
12.4 JFFS档案系统 223
12.4.1 JFFS1档案系统简介 224
12.4.2 JFFS2档案系统简介 225
12.4.3 JFFS3档案系统简介 227
12.4.4 JFFS2档案系统的工作原理 227
12.4.5 JFFS2档案系统的製作 230
12.5 基于RAM的档案系统 231
12.5.1 Ramdisk档案系统 231
12.5.2 RamFS/TmpFS档案系统 232
12.6 嵌入式档案系统的设计 233
12.6.1档案系统格式选择的基本策略 233
12.6.2 混合型档案系统格式设计方法 234
12.7 本章小结 235
第13章 嵌入式Linux C语言开发工具 236
“工欲善其事,必先利其器”,熟悉手头的开发工具是每一个开发人员都必须完成的功课。本章介绍了在开发嵌入式C语言时需要用到的主要开发工具,包括命令行模式下的开发工具:编辑器VIM、编译器GCC、调试器GDB、项目管理MAKE、版本管理CVS和图形化模式下的集成开发环境Eclipse等。读者可根据个人的喜好选择一种适合自己的开发环境。
13.1 编辑器VIM 236
13.1.1 VIM的编辑模式 236
13.1.2 VIM的进入与退出 238
13.1.3 游标的移动 239
13.1.4 删除和恢复 239
13.1.5 複製和贴上 240
13.1.6 查找和替换 240
13.1.7 网路资源 241
13.2 编译器GCC 242
13.2.1 GCC的编译流程 242
13.2.2 GCC的常用编译选项 245
13.2.3 实例分析 248
13.3 调试器GDB 250
13.3.1 GDB使用概述 250
13.3.2 GDB的使用流程 251
13.3.3 GdbServer远程调试 253
13.4 工程管理Make 255
13.4.1 Makefile档案介绍 255
13.4.2 Makefile的规则 256
13.4.3 Makefile的变数 258
13.4.4 Make命令的使用 260
13.4.5 使用自动工具生成Makefile 261
13.5 集成开发环境Eclipse 263
13.5.1 Eclipse的安装 263
13.5.2 Eclipse的界面简介 264
13.5.3 创建Hello项目 265
13.5.4 调试Hello项目 267
13.5.5 使用CVS进行版本管理 267
13.6 本章小结 271
第14章 快速体验——嵌入式C语言开发流程 272
本章分别介绍了命令行模式下和集成开发环境下开发嵌入式程式的基本流程。首先介绍了在命令行下如何通过VI编辑一个代码档案,如何在PC上和在开发板上运行编译好的程式和如何通过编写Makefile档案提高编译和档案管理的效率。然后介绍了在Eclipse下创建工程、编写代码、编译工程和运行最终程式的过程。
14.1 命令行下的开发流程 272
14.1.1 编写代码 272
14.1.2 编译程式 274
14.1.3 运行程式 275
14.1.4 交叉编译 275
14.1.5 编写Makefile 276
14.2 基于Eclipse的开发流程 277
14.2.1 下载和安装Eclipse 277
14.2.2 新建工程 278
14.2.3 编写代码 279
14.2.4 编译工程 280
14.2.5 运行程式 281
14.3 本章小结 281
第15章 嵌入式Linux C语言基础 282
本章一起学习和回顾了C语言的基础知识,主体内容包括:C语言概述、数据类型、运算符、表达式、流程、函式、数组和指针、複杂数据结构。本章的目的在于将C语言的语法精华浓缩成一章的内容,便于读者随时翻阅和查找。通过本章的学习,读者可以立即进入编程的实战阶段。
15.1 C语言概述 282
15.1.1 C语言的特点 282
15.1.2 C语言程式的总体结构 282
15.1.3 C语言的语句 283
15.1.4 C语言的关键字 284
15.1.5 C语言程式设计步骤 284
15.2 数据类型 284
15.2.1 基本数据类型 284
15.2.2 常量与变数 285
15.2.3 整型数据、实型数据 285
15.2.4 字元型数据 286
15.3 运算符 287
15.3.1 算术运算符 287
15.3.2 关係和逻辑运算符 287
15.3.3 位操作符 288
15.3.4 ?操作符 288
15.3.5 表达式的优先权 288
15.4 表达式 289
15.4.1 类型转换 289
15.4.2 构成符cast和可读性 289
15.5 流程控制 289
15.5.1 格式输入输出 289
15.5.2 顺序程式设计 292
15.5.3 选择结构设计 293
15.5.4 循环结构设计 294
15.6 函式 296
15.6.1 概述 296
15.6.2 函式定义的一般形式 297
15.6.3 函式的参数和函式的值 297
15.6.4 函式的调用 298
15.6.5 局部变数和全局变数 299
15.7 数组、指针 300
15.7.1 数组 300
15.7.2 指针的基本概念 302
15.7.3 指针与数组 304
15.7.4 指针与字元串 306
15.7.5 指针与函式 307
15.7.6 指针其他用法 308
15.7.7 动态记忆体管理 308
15.8 複杂数据结构 309
15.8.1 结构体定义 309
15.8.2 结构体使用 310
15.8.3 鍊表 312
15.8.4 枚举类型 313
15.8.5 共用体类型 313
15.9 本章小结 313
第16章 嵌入式Linux C语言标準库 314
本章介绍了在Linux下编程时常用的标準库函式,包括字元测试、数据转换、基本I/O、标準I/O、记忆体配置、字元串处理、日期时间、错误处理、系统日誌和环境管理等函式。介绍了这些函式的基本格式和用法,并对主要的函式进行了举例说明。灵活使用这些函式,将给程式设计带来很大的便利。
16.1 Glibc简介 314
16.2 字元测试和数据转换函式 316
16.2.1 字元测试函式 316
16.2.2 数据转换函式 317
16.3 基本I/O函式 318
16.3.1 open()函式 319
16.3.2 close()函式 320
16.3.3 read()函式和write()函式 320
16.3.4 其他函式 321
16.4 标準I/O函式 322
16.4.1 fopen()函式 322
16.4.2 fclose()函式 323
16.4.3 fread()函式和fwrite()函式 324
16.4.4 printf()函式和scanf()函式 325
16.4.5 其他函式 326
16.5 记忆体配置及字元串处理函式 326
16.5.1 记忆体分配函式 327
16.5.2 memXXX函式 327
16.5.3 strXXX函式 330
16.5.4 释放记忆体的函式 331
16.5.5 动态记忆体分配的实例 332
16.6 日期时间函式 334
16.6.1 时间的定义 334
16.6.2 日曆时间 334
16.6.3 时钟计时单元 336
16.6.4 格式化日期和时间 337
16.6.5 自定义时间格式 337
16.7 其他函式 339
16.7.1 错误处理函式 339
16.7.2 系统日誌函式 342
16.7.3 环境管理函式 344
16.8 本章小结 345
第17章 嵌入式Linux的多任务编程 346
本章介绍了多任务处理的基本知识,主要介绍了基于进程和执行绪实现多任务处理的不同特点及区别。分别介绍了进程和执行绪的概念、数据结构,介绍了创建和终止一个进程或执行绪的基本方法,同时对于一些较为深入的内容,如殭尸(Zombie)进程、执行绪属性等,本章也做了基本的介绍。最后,介绍了一种多任务处理的解决方案:执行绪池,并给出了全部的实现代码,具有很好的参考价值。
17.1 什幺是多任务 346
17.1.1 对话级多任务 346
17.1.2 进程级多任务 347
17.1.3 执行绪级多任务 347
17.1.4 多任务处理的特点 348
17.2 进程 349
17.2.1 进程的概念 350
17.2.2 进程的数据结构 351
17.2.3 进程的创建 353
17.2.4 档案描述符共享 355
17.2.5 vfork()函式 357
17.2.6 exec()函式族 357
17.2.7 执行新程式 359
17.2.8 进程的终止 361
17.2.9 进程的退出状态 363
17.2.10 Zombie进程 365
17.3 执行绪 366
17.3.1 执行绪的概念 366
17.3.2 执行绪的创建 367
17.3.3 执行绪的终止 368
17.3.4 执行绪的基本属性 370
17.3.5 执行绪属性的修改 371
17.3.6 执行绪的扩展属性 374
17.4 执行绪池 377
17.4.1 执行绪池的工作原理 377
17.4.2 执行绪池的实现 378
17.4.3 工作状态的记录 383
17.4.4 执行绪池的测试 386
17.5 本章小结 387
第18章 多任务间通信和同步 388
本章介绍了在嵌入式Linux下进行多任务处理时,任务间通信和同步的方法。主要介绍了信号、信号集、管道、FIFO、共享记忆体(mmap()方式和semget()方式)等数据通信方式,以及信号量(SystemV方式和POSIX方式)、互斥锁、条件变数等同步方式。这些内容都是编制多任务处理程式时所必备的,而且不同的方式有它不同的特点和适用的场合,因此在实际套用中应该在对任务有充分理解和测试后进行最佳化选择。
18.1 信号 388
18.1.1 信号的概念 388
18.1.2 信号的产生 390
18.1.3 kill()函式和raise()函式 390
18.1.4 alarm()函式和pause()函式 391
18.1.5 about()函式 392
18.1.6 信号的处理 392
18.1.7 signal()函式 392
18.1.8 sigaction()函式 393
18.1.9 信号集 395
18.1.10 sigprocmask()函式 396
18.1.11 sigpending()函式 396
18.1.12 sigsuspend()函式 396
18.2 管道 398
18.2.1 管道的相关概念 398
18.2.2 管道的创建 398
18.2.3 多进程中的管道通信 400
18.2.4 管道的套用实例 401
18.2.5 FIFO的相关概念 402
18.2.6 FIFO的创建 403
18.2.7 FIFO的读写规则 404
18.2.8 FIFO的套用实例 405
18.3 共享记忆体 407
18.3.1 系统调用mmap() 408
18.3.2 系统调用munmap() 408
18.3.3 系统调用msync() 409
18.3.4 mmap()的套用实例 409
18.4 System V共享记忆体 411
18.4.1 系统调用shmget() 411
18.4.2 系统调用shmat() 412
18.4.3 系统调用shmdt() 412
18.4.4 System V共享记忆体的套用实例 412
18.5 讯息伫列 413
18.5.1 系统调用msgget() 413
18.5.2 系统调用msgsnd() 414
18.5.3 系统调用msgrcv() 414
18.5.4 系统调用msgctl() 415
18.5.5 讯息伫列的套用实例 415
18.6 System V信号量 417
18.6.1 系统调用semget() 417
18.6.2 系统调用semop() 418
18.6.3 系统调用semctl() 419
18.6.4 System V信号量的套用实例 419
18.7 POSIX信号量 421
18.7.1 系统调用sem_init() 422
18.7.2 系统调用sem_wait() 422
18.7.3 系统调用sem_post() 422
18.7.4 系统调用sem_destory()函式 422
18.7.5 POSIX信号量的套用实例 422
18.8 互斥锁 424
18.8.1 系统调用pthread_mutex_init() 424
18.8.2 系统调用pthread_mutex_lock() 424
18.8.3 系统调用pthread_mutex_trylock() 424
18.8.4 系统调用pthread_mutex_unlock () 425
18.8.5 系统调用pthread_mutex_destory () 425
18.8.6 互斥锁的套用实例 425
18.9 条件变数 427
18.9.1 系统调用pthread_cond_init() 428
18.9.2 系统调用pthread_cond_wait () 428
18.9.3 系统调用pthread_cond_timedwait () 428
18.9.4 系统调用pthread_cond_signal() 428
18.9.5 系统调用pthread_cond_
18.9.5 broadsignal() 428
18.9.6 系统调用pthread_cond_destroy() 428
18.9.7 条件变数的套用实例 429
18.10 本章小结 430
第19章 设备驱动开发基础 431
本章主要内容介绍了Linux驱动开发的基础知识,包括字元设备和块设备驱动。其中字元设备知识主要包括:核心与模组、并发控制、阻塞、中断、记忆体操作。
作为初学者,大多数读者并不需要在实际工作中接触到块设备的驱动编写,因此建议读者将主要精力放在学习字元设备驱动之上,而这也足可以满足大多数情况下的实际需要。
19.1 Linux设备管理和驱动概述 431
19.1.1 Linux设备的分类 431
19.1.2 设备驱动程式的作用 431
19.1.3 访问设备的实现 432
19.1.4 Linux设备控制方式 432
19.2 Linux设备驱动开发流程 434
19.2.1 构造和运行模组 434
19.2.2 字元设备驱动编写 435
19.2.3 字元设备驱动示例 437
19.2.4 并发控制 440
19.2.5 阻塞与非阻塞 445
19.2.6 select和poll 449
19.2.7 中断处理 451
19.2.8 记忆体与I/O操作 452
19.3 块设备驱动编写 457
19.3.1 块设备的I/O操作特点 457
19.3.2 block_device_operations结构体 457
19.3.3 gendisk结构体 458
19.3.4 request结构体 459
19.3.5 request操作函式 462
19.3.6 bio结构体 464
19.3.7 注册与注销 466
19.3.8 载入与卸载 466
19.3.9 打开与释放 468
19.3.10 ioctl函式 469
19.3.11 I/O请求处理 469
19.4 本章小结 472
第20章 嵌入式Linux的网路编程 473
本章介绍了开发嵌入式Linux网路程式的基本流程,先后分析了TCP Sever程式、TCP Client程式、UDP通信程式、多执行绪档案伺服器程式和PROXY程式。针对网路程式涉及的函式多、内容複杂等特点,本章採取了在实际的网路程式代码中学习编程的方法,在阅读代码的同时进行讲解,将在进行网路编程中常用的函式和知识做了详细的阐述,希望对读者理解网路程式的编写能有所帮助。
20.1 TCP/IP协定 473
20.2 TCP协定 474
20.2.1 TCP连线建立的过程 474
20.2.2 TCP连线的标识 474
20.2.3 关闭TCP连线 475
20.3 UDP协定 475
20.4 socket简介 475
20.4.1 socket的定义 476
20.4.2 socket的类型 476
20.5 TCP Server程式设计 476
20.5.1 TCP的通信过程 476
20.5.2 TCP Server程式 477
20.5.3 网路地址的表示 478
20.5.4 建立socket 479
20.5.5 绑定本地地址 479
20.5.6 位元组顺序转换 480
20.5.7 IP位址转换 481
20.5.8 Listen()函式 481
20.5.9 等待连线 482
20.5.10 数据通信 483
20.5.11 关闭套接字 484
20.6 TCP Client程式设计 485
20.6.1 DNS操作 486
20.6.2 连线伺服器 487
20.6.3 测试实例 488
20.7 UDP通信的程式设计 489
20.7.1 UDP的通信过程 489
20.7.2 UDP通信伺服器端 490
20.7.3 UDP通信客户端 491
20.8 多执行绪档案伺服器 493
20.8.1 档案伺服器主程式 493
20.8.2 动态分配监听连线埠 495
20.8.3 多执行绪伺服器的实现 495
20.8.4 大数据量的读写函式 496
20.8.5 客户端测试例程 499
20.8.6 编译和测试 501
20.9 PROXY原始码分析 501
20.9.1 主函式main() 502
20.9.2 参数处理函式parse_args() 504
20.9.3 守护进程函式daemonize() 505
20.9.4 代理服务函式do_proxy() 507
20.9.5 错误信息函式errorout() 510
20.10 本章小结 510
第21章 MiniGUI图形界面设计 511
本章主要介绍了嵌入式图形界面库MiniGUI的程式设计。首先介绍了MiniGUI的安装、配置以及使用Eclipse进行MiniGUI套用开发的配置方式。然后对开发MiniGUI程式的基本函式进行解释,包括讯息和讯息传递、视窗过程、对话框、控制项、图形设备和配置档案等方面。最后列举了一个利用MiniGUI编成的图形界面程式MiniQQ,对这个例程的三个主要视窗的设计与编写做了详细的介绍。
21.1 MiniGUI概述 511
21.1.1 MiniGUI的特点 511
21.1.2 MiniGUI v1.3.3软体包 512
21.1.3 MiniGUI运行模式 512
21.2 MiniGUI的安装和使用 514
21.2.1 安装MiniGUI库 514
21.2.2 安装MiniGUI的资源 515
21.2.3 配置MiniGUI 515
21.2.4 编译应用程式例子 516
21.2.5 交叉编译MiniGUI库 516
21.2.6 交叉编译例程 517
21.2.7 QVFB图形引擎 518
21.2.8 FrameBuffer图形引擎 519
21.3 利用Eclipse编写MiniGUI程式 520
21.3.1 建立vacs工程 520
21.3.2 配置编译选项 521
21.3.3 配置外部工具QVFB 522
21.3.4 运行vacs 523
21.3.5 调试vacs 523
21.4 MiniGUI的编程基础 524
21.4.1 头档案 525
21.4.2 程式入口 525
21.4.3 创建和显示主视窗 526
21.4.4 进入讯息循环 526
21.4.5 视窗过程函式 528
21.4.6 萤幕输出 528
21.4.7 程式的退出 528
21.5 讯息循环和视窗过程 529
21.5.1 讯息处理函式 529
21.5.2 重要的讯息 530
21.5.3 视窗及视窗过程 530
21.6 对话框和控制项编程 531
21.6.1 控制项的概念 531
21.6.2 预定义控制项 532
21.6.3 自定义控制项 534
21.6.4 控制项子类化 535
21.6.5 对话框和对话框模板 536
21.6.6 模态和非模态对话框 538
21.7 图形设备接口 539
21.7.1 图形设备上下文 539
21.7.2 矩形操作和区域操作 540
21.7.3 像素值和调色板 542
21.7.4 点阵图操作函式 543
21.7.5 字型和文本输出 544
21.7.6 绘製图形 546
21.8 其他功能 547
21.8.1 读写配置档案 548
21.8.2 定点数运算 548
21.9 MiniQQ界面设计 549
21.9.1 登录视窗 551
21.9.2 好友列表视窗 554
21.9.3 聊天视窗 558
21.9.4 其他 559
21.10 本章小结 560
第22章 CAN汇流排驱动设计 561
随着需求的发展,许多工业控制场合需要嵌入式设备,需要提供CAN汇流排接口,来连线CAN设备,以满足套用的需要。本章详细介绍了CAN汇流排的基础知识,对Linux系统下的CAN驱动程式进行了详细的分析。最后结合本书使用的ARM9平台,介绍了移植CAN驱动程式的要点。
22.1 CAN汇流排介绍 561
22.2 SJA1000介绍 561
22.2.1 SJA1000的特性 561
22.2.2 SJA1000内部原理 562
22.2.3 SJA1000管脚说明 563
22.3 SJA1000暂存器介绍 564
22.3.1 控制暂存器CR 564
22.3.2 命令暂存器CMR 565
22.3.3 状态暂存器SR 566
22.3.4 中断暂存器IR 567
22.3.5 传送缓冲器 568
22.3.6 接收缓冲器 568
22.3.7 验收滤波器 569
22.4 SJA1000与S3C2440连线 569
22.5 SJA1000的驱动程式 571
22.5.1 驱动程式原始码 571
22.5.2 测试的操作方法 579
22.6 本章小结 580
第23章 SD卡驱动设计 581
SD卡在嵌入式设备中使用越来越多,本章首先介绍了SD卡的基本知识和协定内容,然后结合S3C2440的SD卡控制器,详细分析了Linux下SD卡的驱动程式,并给出了实现过程。驱动程式的编写对程式设计师要求很高,不仅代码要求完全正确,效率低下的驱动程式也是不合格的。因此如果要编写出好的驱动程式,经验非常重要。
23.1 SD卡概述及协定 581
23.1.1 SD卡概述 581
23.1.2 SD卡协定 582
23.2 SD卡驱动设计 583
23.2.1 块设备驱动设计 583
23.2.2 SD卡驱动程式分析 584
23.2.3 SD卡驱动程式设计 585
23.3 本章小结 588
第24章 网路驱动设计 589
进入21世纪,Internet获得了突飞猛进的发展。嵌入式系统接入Internet后将使得远程监测、远程维护变得非常容易,因此嵌入式系统的网路也是非常重要的。嵌入式系统实现Internet接入的前提条件是系统的软体中有TCP/IP协定支持。幸运的是,Linux核心提供了包括TCP/IP在内的多种协定的支持。本章以DM9000网路晶片为例,分析了Linux核心中网路设备驱动程式的运行机理,并介绍了实现Linux网路驱动程式的关键过程。
24.1 Linux网路设备概述 589
24.2 DM9000晶片介绍 590
24.3 重要数据结构 591
24.3.1 通用部分 591
24.3.2 硬体相关部分 591
24.3.3 物理层相关数据 592
24.3.4 网路层协定相关部分 592
24.3.5 服务处理部分 593
24.4 网路设备初始化 593
24.5 激活和关闭网路设备 595
24.6 中断控制的实现 596
24.7 传送过程的实现 598
24.8 接收过程的实现 599
24.8.1 sk_buff结构 599
24.8.2 接收函式的实现 601
24.9 其他接口函式 602
24.10 本章小结 602
第25章 综合案例——嵌入式B超 603
本章针对某一具体实例,向读者展示了嵌入式开发的基本内容和步骤。相信读者读完本章内容以后对嵌入式系统开发会有一个更全面的认识。读者自己在开发项目的时候,可以参考本章内容,同时更要关注最新的技术发展,以便更好地完成和实现自己的项目设计。
25.1 系统终端的结构设计 603
25.1.1 总体结构 603
25.1.2 显示控制晶片选型 604
25.2 系统终端的软体设计 604
25.2.1 U-Boot 604
25.2.2 嵌入式Linux移植 605
25.2.3 MiniGUI移植 605
25.3 FPGA与ARM接口设计 608
25.3.1 硬体连线 608
25.3.2 FPGA驱动程式设计 608
25.4 显示晶片的连线与控制 610
25.4.1 选择SM501的原因 610
25.4.2 SM501驱动程式设计 610
25.5 超声动态图像的实时显示 612
25.5.1 图像动态显示 612
25.5.2 坐标转换和灰度插值 612
25.6 图形界面的结构 614
25.6.1 需求分析 614
25.6.2 总体结构 614
25.6.3 网路通信 615
25.6.4 多执行绪编程 615
25.7 操作界面设计 616
25.7.1 区域分配 616
25.7.2 键盘回响 616
25.7.3 控制项设计 617
25.8 测量模组设计 618
25.8.1 椭圆的画法 619
25.8.2 椭圆测量周长和面积 620
25.8.3 轨迹法测量面积 620
25.9 本章小结 620