新書推薦:
《
UE5虚幻引擎必修课(视频教学版)
》
售價:HK$
110.9
《
真需求
》
售價:HK$
110.9
《
阿勒泰的春天
》
售價:HK$
50.4
《
如见你
》
售價:HK$
51.3
《
人格阴影 全新修订版,更正旧版多处问题。国际分析心理学协会(IAAP)主席力作
》
售價:HK$
67.0
《
560种野菜野果鉴别与食用手册
》
售價:HK$
67.1
《
中国官僚政治研究(一部洞悉中国政治制度演变的经典之作)
》
售價:HK$
62.7
《
锂电储能产品设计及案例详解
》
售價:HK$
110.9
|
編輯推薦: |
《Linux嵌入式实时应用开发实战》
这是一本实用、全面、系统的嵌入式Linux入门书籍。
围绕实时应用逐章分模块,从基本概念、原理、配置到实战案例全面解构嵌入式Linux。
以ARM单板机为平台,涵盖Linux基础、交叉编译、Linux组件和工具三大部分内容。
本书不拘泥于形式,立足实战,为读者提供详细的操作指南。
|
內容簡介: |
这本新版的《Linux嵌入式实时应用开发实战》(原书第3版)从实战的角度介绍了正在快速发展的嵌入式Linux技术,内容包含了基础和最新开发技术。本书是新手在嵌入式环境中使用Linux的理想入门读物,不但包含了重要的概念和具体的应用,还收录了作者在此领域的切身经历和实践方法。
本书特点
以基于ARM的单板机(SBC)为目标板讲解嵌入式开发
开源、Linux和嵌入式技术的基础
网络、图形界面和Android编程
教会读者搭建简单的系统环境和工具链
告诉读者如何使用模拟器进行早期应用程序测试
教会读者使用一些Linux的组件和工具
教会读者配置和生成Linux内核、BusyBox和U-Boot bootloader
|
關於作者: |
Doug Abbott 是一位在嵌入式领域拥有30多年经验的顾问,他在面向工业和科研领域的数据采集产品方面拥有非常丰富的软硬件开发经验。Doug在加州大学伯克利分校讲授PC技术和实时编程课程,是一位颇受学生爱戴的导师,由他发起和组织的研讨在学校非常受欢迎。有数百位资深工程师接受过他的实时编程技术和多任务操作系统培训。
|
目錄:
|
译者序
前言
第一部分 入 门 指 导
第1章 嵌入式和实时空间 2
1.1 什么是嵌入式 2
1.2 什么是实时 3
1.3 为什么Linux适用 3
1.3.1 开源 4
1.3.2 移植和定制 5
1.4 哪里用嵌入式Linux 5
1.5 开源协议 6
1.6 资源 8
第2章 安装Linux 9
2.1 发行版 9
2.1.1 Debian GNULinux 10
2.1.2 Fedora 10
2.1.3 Red Hat企业版Linux 11
2.1.4 SUSE 11
2.1.5 Ubuntu 11
2.2 硬件需求 12
2.3 安装方案 12
2.3.1 单机版 12
2.3.2 双启动 12
2.3.3 虚拟化 15
2.4 DVD 还是激活CD 15
2.5 安装过程 15
2.5.1 磁盘分区 16
2.5.2 包的选择 17
2.6 资源 18
第3章 Linux入门 19
3.1 运行Linux——KDE 19
3.1.1 文件管理器 20
3.1.2 shell 窗口 20
3.2 Linux属性 21
3.3 保护模式架构 22
3.3.1 实模式 22
3.3.2 保护模式 23
3.3.3 平面与分段的存储器模型 24
3.3.4 分页 24
3.4 Linux进程模型 25
3.4.1 fork函数 25
3.4.2 execve函数 27
3.5 Linux文件系统 27
3.5.1 文件权限 28
3.5.2 “根”用户 29
3.5.3 proc文件系统 29
3.5.4 文件系统等级标准 30
3.5.5 挂载文件系统 32
3.6 系统配置 33
3.7 shell 33
3.8 获得帮助 36
3.9 资源 37
第4章 主机开发环境 38
4.1 交叉开发工具——GNU工具链 38
4.1.1 GCC 38
4.1.2 make 39
4.1.3 GDB 40
4.2 安装软件 40
4.2.1 DVD上有什么 40
4.2.2 安装交叉工具链 41
4.2.3 安装根文件系统 42
4.3 终端仿真器minicom 42
4.4 网络 44
4.4.1 网络地址 44
4.4.2 无线怎么样 46
4.4.3 网络文件系统 47
4.4.4 普通文件传输协议 48
4.5 资源 49
第5章 硬件 50
5.1 嵌入式硬件 50
5.2 ARM单板计算机 50
5.3 其他的板怎么样 51
5.3.1 BeagleBoard 51
5.3.2 Gumstix 52
5.3.3 Raspberry Pi 53
5.4 设置Mini2440 53
5.5 Flash存储器和文件系统 54
5.5.1 Flash存储器——NAND
和NOR 54
5.5.2 Flash中的根文件系统 55
5.6 板的准备工作 56
5.6.1 例程 56
5.6.2 factory_images 57
5.6.3 脚本文件 57
5.6.4 过程 58
5.6.5 最后几步 60
5.6.6 哪里会出错 61
5.7 boot loader 61
5.8 资源 62
第6章 Eclipse 集成开发环境 63
6.1 概述 63
6.1.1 插件 65
6.1.2 工作台 66
6.2 安装 67
6.3 使用Eclipse 67
6.4 C开发环境——CDT 68
6.4.1 创建一个新工程 68
6.4.2 给工程添加源代码 69
6.4.3 编程助手 70
6.4.4 代码模板 71
6.4.5 自动补齐 71
6.5 程序 71
6.6 生成工程 72
6.7 使用CDT调试 72
6.7.1 调试视图 74
6.7.2 变量视图 75
6.7.3 断点视图 75
6.7.4 存储器视图 75
6.8 完成调试 76
6.9 总结 76
6.10 资源 76
第二部分 交叉开发环境中的应用编程
第7章 从用户空间访问硬件 78
7.1 回顾 78
7.2 ARM IO架构 78
7.3 我们的第一个程序——
从Linux访问IO 80
7.3.1 创建一个工程 80
7.3.2 目标执行环境 81
7.4 led 程序 82
7.5 一个数据采集的例子 84
7.6 资源 86
第8章 调试嵌入式软件 87
8.1 使用Eclipse进行远程调试 87
8.2 thermostat 91
8.3 主机工作站作为调试环境 92
8.4 调试器服务框架(DSF) 96
8.4.1 安装SSH 96
8.4.2 为根添加一个口令 98
8.4.3 配置RSE 98
8.4.4 使用RSE调试 100
8.5 资源 101
第9章 Posix 线程 102
9.1 线程 103
9.2 同步——互斥量 105
9.2.1 互斥量属性 106
9.2.2 解决资源共享问题而引入的
问题——优先级倒置 107
9.3 通信——条件变量 109
9.4 线程终止和取消 109
9.5 Pthread实现 111
9.6 更新thermostat 113
9.6.1 Linux设备驱动 113
9.6.2 底层IO API 114
9.6.3 thermostat.c中需要的改变 115
9.7 调试多线程程序 116
9.8 资源 116
第10章 嵌入式网络 117
10.1 Sockets 117
10.1.1 服务器进程 118
10.1.2 客户进程 118
10.1.3 socket 属性 119
10.2 一个简单的例子 119
10.2.1 服务器 119
10.2.2 客户 120
10.3 远程thermostat 121
10.4 嵌入式网络服务器 123
10.4.1 HTTP的背景 123
10.4.2 使用了网络的thermostat 124
10.4.3 动态网络内容 125
10.4.4 表单和POST方法 126
10.4.5 生成和尝试 126
10.5 一个“真正的”网络服务器
——boa 127
10.6 嵌入式E-mail 128
10.7 其他应用级协议 131
10.8 资源 131
第11章 配置和生成内核 132
11.1 开始 132
11.1.1 内核版本编号 133
11.1.2 内核源树 133
11.2 内核makefile 135
11.3 修补内核 135
11.4 配置内核——make config、
menuconfig、xconfig 136
11.4.1 xconfig 选项 140
11.4.2 .config 文件 140
11.5 表象背后——真正发生了什么 141
11.6 生成内核 142
11.7 引导新内核 143
11.8 资源 144
第12章 内核模块和设备驱动 145
12.1 内核模块 145
12.1.1 一个模块的例子 146
12.1.2 破坏内核 147
12.1.3 内核模块和GPL 148
12.1.4 生成内核模块 148
12.1.5 模块的作用 149
12.2 什么是设备驱动 150
12.3 Linux设备驱动 151
12.3.1 dev目录 151
12.3.2 底层用户空间IO API 152
12.3.3 内部驱动结构 152
12.3.4 驱动数据结构 152
12.3.5 init和exit 153
12.3.6 open和release 154
12.3.7 read和write 154
12.3.8 生成和运行驱动 155
12.4 调试内核代码 156
12.4.1 printk 156
12.4.2 proc文件 157
12.5 处理中断 158
12.5.1 注册中断handler 159
12.5.2 探测中断 160
12.5.3 延迟处理——“bottom
half” 161
12.6 将你的驱动生成至内核 162
12.7 资源 164
第三部分 组件和工具
第13章 BusyBox和Linux初始化 166
13.1 BusyBox简介 166
13.2 配置和安装BusyBox 167
13.2.1 BusyBox设置 169
13.2.2 小程序 169
13.2.3 生成和安装 170
13.3 使用BusyBox 171
13.4 thermostat 显示示例 171
13.4.1 ANSI终端Escape 序列 172
13.4.2 thermostat 显示 172
13.4.3 ncurses库 173
13.5 用户空间初始化 173
13.5.1 第一步boot loader 173
13.5.2 u-boot 173
13.5.3 Linux内核 174
13.5.4 init进程 174
13.6 资源 175
第14章 u-boot boot loader和准备发布 176
14.1 u-boot 176
14.1.1 背景 176
14.1.2 安装和配置u-boot 177
14.1.3 测试一个新的u-boot 178
14.1.4 通过JTAG重新编程NOR 178
14.2 创建一个flash文件系统 179
14.2.1 关于flash分区的更多
考虑 180
14.2.2 扁平设备树 181
14.3 资源 182
第15章 源代码控制——git 183
15.1 背景 183
15.2 git介绍 184
15.2.1 文件状态和生命周期 186
15.2.2 分支和合并 187
15.3 配置git 188
15.4 图形化git 189
15.5 资源 192
第16章 build工具 193
16.1 Buildroot 193
16.2 开源嵌入式 195
16.2.1 开始 196
16.2.2 个人观点 197
16.3 安卓 197
16.3.1 应用开发 198
16.3.2 平台开发 199
16.4 总结 199
16.5 资源 200
附录A u-boot命令 201
附录B 为什么软件不应该有版权 207
|
內容試閱:
|
第一部分
入 门 指 导
第1章 嵌入式和实时空间
第2章 安装Linux
第3章 Linux入门
第4章 主机开发环境
第5章 硬件
第6章 Eclipse 集成开发环境
第1章
嵌入式和实时空间
如果你想周游世界并应邀去许多不同的地方演讲,那么写一个UNIX操作系统就可以了。
——Linus Torvalds
1.1 什么是嵌入式
在一个聚会上,当一个有吸引力的异性走近你,问你的工作时,你应该轻描淡写,说得越少越好,但最终谈话还是会落在你为嵌入式系统写软件这个事实上。在这位新相识开始扫视周围,找到一个律师或医生谈话前,你最好用最引人注意的解释说明到底什么是嵌入式系统。
我通常会说嵌入式系统就是一个内置计算机的设备,但是该设备的使用者不必知道或者特别在意那个计算机。它是隐蔽的。我通常以汽车里控制发动机的计算机为例来说明。你不觉得开车有什么不同,那是因为发动机是计算机控制的,而且汽车里还有很多计算机,有的控制防震刹车片,有的决定什么时候打开气囊,另外一些在交通拥堵的早晨给坐在车里的你提示信息和提供娱乐。事实上,今天普通的车都比20世纪70年代的登月飞行器有更强的处理能力。甚至你的手机也比登月飞行器处理能力强大。
你可以继续举出很多例子,嵌入式计算机的应用比个人电脑(PC)要多得多。事实上,最近的市场数据显示,个人计算机使用的微处理器芯片只占每年市场份额的2%。普通的房间即使没有个人电脑,也至少有几十个嵌入式计算机。
从编程的角度来说,嵌入式系统与传统的桌面应用有很多显著区别。比如,多数桌面应用处理的都是相对可预见的一组输入输出(IO)设备——磁盘、图形显示、键盘、鼠标、声卡和网络接口。操作系统通常都可以很好地支持这些设备,应用程序员不需要特别关注这些。
但与之相反,嵌入式系统通常比典型的桌面计算机包括种类更多的IO设备。一个典型的系统可能包括各种用户IO,如开关、按钮和增加了各种显示方法的触摸屏。它可能有一个或多个通信通道,或者是异步串口、通用串行总线(USB)或网络端口。它可能通过模数转换器(AD)和数模转换器(DA)完成数据采集和控制。这些设备几乎都没有应用程序员所熟悉的操作系统的支持。因此,嵌入式系统程序员通常都需要直接处理硬件。
嵌入式设备通常受资源的严格限制。尽管一个典型的PC目前已发展到有4GB的RAM和几百GB的磁盘,但嵌入式设备通常只有几个MB的RAM和非易失存储器。这些都对编程者的创造力有很高要求。
1.2 什么是实时
实时的概念更难解释。实时的基本含义是我们期望计算机对它的环境即时响应。但是什么是“即时”呢?有人认为实时意味着真的很快,这并不完全正确。实时仅仅意味着在系统运行的环境里足够快。如果我们谈论的是控制汽车发动机的计算机,那就是快!这个计算机需要决定每次发动机转一圈时对燃料流量、点火时间的控制。
另一方面,考虑一个或多个计算机控制的化工厂,计算机系统负责控制过程和检测潜在的破坏性故障。因为化学过程的时间常数最少在几秒到几分钟之间,所以可以假设计算机系统可以有足够的时间处理任何故障以避免造成损失。
但是假设当故障发生时,计算机正在打印一份关于上周生产情况的长篇报告或正在处理工资单,那么它对潜在的紧急情况的反应有多快呢?
实时处理的本质不仅在于计算机对它的环境有足够快速的响应,而且在于足够快的可靠响应。发动机的控制计算机必须在发动机转动的每一圈都调整燃料流量和点火时间。如果有所延迟,发动机就不能正常工作。化工厂的控制器必须有足够的时间正确检测和响应异常情况以避免事故,如果不能,这个控制器就是无效的。
我觉得下面这句话说得很恰当:
实时系统处理的正确性不仅要求处理的逻辑正确,也要求在规定时间内有结果。如果系统的时间约束不能被满足,那么可以说系统就失效了。
——Donald Gillies,实时处理常见问题
所以实时编程的艺术就是在随机的异步事件中,设计能可靠地满足时间约束的系统。的确,这说起来容易做起来难,目前有很多研究实时系统原理的文献和开发工作。
1.3 为什么Linux适用
Linux模仿UNIX的基本架构,在其基础上发展成为一个通用的操作系统。没有人认为UNIX适用于嵌入式或实时操作系统(RTOS)。它太大了,占用太多的资源,而且其调度原则是基于顺序而不是优先级。因此,简而言之,它与嵌入式操作系统的要求完全是背道而驰的。
但是Linux有UNIX系统的早期版本所欠缺的几样东西。它是免费的,而且你可以得到源代码,并且有一个拥有大量热情的Linux开发者和使用者的大社区。你在使用中所面临的问题总有人正遇到或曾经遇到过,所有这些都在网络上,窍门就是找到它们。
1.3.1 开源
Linux是在自由软件基金会(Free Software Foundation,FSF)倡导的开源软件的宗旨下发展起来的。开源的理念非常简单,即软件应该免费获取以用于使用、修改和复制。这个理念在建立了以太网和万维网的技术文化下发展了20多年,近年来开始向商业领域发展。
有许多关于开源软件的误解。也许对它是什么的最好解释就是从它不是什么开始。
? 开源不是共享。使用共享软件的前提是付给版权持有者一定的费用。共享软件通常以一定的免费形式发布,或者时间受限或者功能受限。要得到完整版,就必须付钱。但与之相反,开源代码可以免费获取,你没有任何为之付钱的义务。
? 开源不是公共。根据定义,公共代码是没有版权的。开源代码的作者拥有版权,他在开源软件协议的框架下发布软件。版权持有者授权你可以在协议的框架内使用代码,如果你不遵守协议,版权持有者有权要求你停止使用代码。
? 开源不一定免费。没有任何强制规定要求付款给开源软件代码,但不排除收取打包和发布费用。许多公司都在经营特定的打包Linux分发产品。
为什么要为免费得到的东西付钱?想必是因为任何东西只要存在,你就可以从供应商那里得到一些支持。当然,支持的质量很大程度上取决于供应商。
所以免费意味着可以自由使用代码但不意味着零花费。想想“免费演讲”和“免费啤酒”的区别你就明白了。
开源代码是:
? 服从开源协议框架。在许多案例中都是GNU通用公共协议(GPL)。
? 经过严格的同行评议。作为一个开源程序员,你的代码就放在那里,任何人都可以看到。开源社区非常严格,开源代码会经历广泛的测试和同行评议。这是一个适者生存的竞争过程,最后只有最好的代码能够存在。“最好”是一个主观的术语。它可能是最好的技术解决方案但同时也可能可读性很差。
? 高度的颠覆性。开源运动颠覆了主流模式,主流模式认为软件之类的知识产权应该受到保护,所以你可以通过这个赚钱。与之相反,开源的理念是软件应该免费提供给每个人,这样可以最大化地利于社会的发展。如果你可以通过这个赚钱,那挺好的,但这不是初衷。FSF的创始人Richard Stallman一直大力倡导软件不应该属于某个人(见附录C)。
因此当微软公司视开源为他们商业模式的一个严重威胁时,这就毫不奇怪了。微软的发言人一直将开源归为“非美式的”。而另一方面,许多开源软件的领头供应商一直让他们的程序员和工程师为开源社区添砖加瓦。这不仅仅是公益,更是一个很好的商业模式!
|
|