(This page has no text content)
O'Reilly精品图书系列 嵌入式系统设计与实践 Making Embedded Systems (美)怀特(White,E.) 著 余水清 译 ISBN:978-7-111-41584-8 本书纸版由机械工业出版社于2013年出版,电子版由华章分社(北京 华章图文信息有限公司)全球范围内制作与发行。 版权所有,侵权必究 客服热线:+ 86-10-68995265 客服信箱:service@bbbvip.com 官方网址:www.hzmedia.com.cn 新浪微博 @研发书局 腾讯微博 @yanfabook
目 录 O'Reilly Media,Inc.介绍 译者序 前言 关于这本书 关于作者 致谢 本书的组织结构 本书约定 排版 术语 例子代码的使用 Safari联机丛书 联系我们 第1章 导论 1.1 编译器、编程语言以及面向对象编程 1.2 嵌入式系统开发 1.2.1 调试 1.2.2 更多挑战 1.2.3 解决问题的原则
1.3 延伸阅读 第2章 创建系统架构 2.1 构建系统框图 2.1.1 架构框图 2.1.2 控制层级图 2.1.3 层次图 2.2 从框图到架构 2.2.1 封装模块 2.2.2 分派任务 2.2.3 驱动程序接口:打开(Open)、关闭(Close)、读 (Read)、写(Write)和输入输出控制(IOCTL) 2.2.4 适配器模式 2.2.5 开始设计其他接口 2.2.6 例子:一个日志接口 2.3 一个可以实践的沙盒 2.4 延伸阅读 第3章 检视硬件 3.1 硬件/软件集成 3.1.1 理想的项目流程 3.1.2 电路板调试 3.2 阅读数据表
3.2.1 遇到问题时需要查找的数据表部分 3.2.2 对软件开发者比较重要的内容 3.2.3 用数据表评估元器件 3.3 处理器是一门语言 3.4 阅读原理图 3.5 调试工具箱(和灭火器) 3.5.1 保管好电路板 3.5.2 工具箱 3.5.3 数字万用表 3.5.4 示波器和逻辑分析仪 3.6 测试硬件(和软件) 3.6.1 构建测试 3.6.2 闪存测试范例 3.6.3 命令和响应 3.6.4 命令模式 3.7 处理错误 3.7.1 一致的方法 3.7.2 错误处理库 3.7.3 调试时序错误 3.8 延伸阅读 第4章 输入、输出和定时器
4.1 触发输出 4.1.1 从寄存器开始 4.1.2 将引脚设置为输出 4.1.3 点亮LED 4.1.4 LED闪烁 4.1.5 故障诊断 4.2 将硬件和动作分离 4.2.1 特定于电路板的头文件 4.2.2 I/O处理代码 4.2.3 主循环 4.2.4 门面模式 4.3 I/O中的输入 4.3.1 按钮的简单接口 4.4 瞬间按钮动作 4.4.1 按钮按下时的中断 4.4.2 配置中断 4.4.3 去抖动开关 4.5 运行时不确定性 4.5.1 依赖注入 4.6 使用定时器 4.6.1 时间片
4.6.2 数学计算 4.6.3 定时器节拍之间的漫长等待 4.6.4 使用定时器 4.7 使用脉冲宽度调制 4.8 产品发货 4.9 延伸阅读 第5章 任务管理 5.1 调度和操作系统基础 5.1.1 任务 5.1.2 任务间通信 5.1.3 避免竞争条件 5.1.4 优先级倒置 5.2 状态机 5.2.1 状态机范例:信号灯控制器 5.2.2 以状态为中心的状态机 5.2.3 具有隐式迁移的以状态为中心的状态机 5.2.4 以事件为中心的状态机 5.2.5 状态模式 5.2.6 表格驱动的状态机 5.2.7 选择状态机的实现 5.3 中断
5.3.1 中断请求 5.3.2 保存上下文 5.3.3 从向量表中获得ISR 5.3.4 调用ISR 5.3.5 恢复上下文 5.3.6 何时使用中断 5.4 怎样不使用中断 5.4.1 轮询 5.4.2 系统节拍 5.4.3 基于时间的事件 5.4.4 一个极小型调度器 5.5 监控程序(看门狗) 5.6 延伸阅读 第6章 外设通信 6.1 应用广泛的外设 6.1.1 外部存储器 6.1.2 按钮和按键矩阵 6.1.3 传感器 6.1.4 执行器 6.1.5 显示器 6.2 种类繁多的通信方式
6.2.1 串行通信 6.2.2 并行 6.2.3 以太网和WiFi 6.3 将外设和通信结合 6.3.1 数据处理 6.3.2 增强通信的健壮性 6.3.3 修改数据 6.3.4 修改算法 6.4 延伸阅读 第7章 更新代码 7.1 板载启动装载器 7.2 构建自己的更新程序 7.2.1 修改驻留的更新程序 7.3 砖块装载器 7.3.1 将装载器复制到内存 7.3.2 运行装载器 7.3.3 复制新代码到暂存空间 7.3.4 危险时刻:擦除和编程 7.3.5 重置到新代码 7.4 安全 7.5 链接器脚本
7.6 总结 第8章 事半功倍 8.1 代码空间 8.1.1 读映射文件(第1部分) 8.1.2 简化的过程 8.1.3 库 8.1.4 函数和宏 8.1.5 常量和字符串 8.2 RAM 8.2.1 释放和分配 8.2.2 读映射文件(第2部分) 8.2.3 寄存器和局部变量 8.2.4 函数链 8.2.5 全局变量的优点和缺点 8.2.6 内存覆盖 8.3 速度 8.3.1 程序性能分析 8.3.2 优化 8.4 总结 8.5 延伸阅读 第9章 数学运算
9.1 区别快、慢运算 9.1.1 求平均值 9.2 使用已知的算法 9.3 设计与修改算法 9.3.1 多项式因式分解 9.3.2 泰勒级数 9.3.3 除以常数 9.3.4 放大输入 9.3.5 查找表 9.4 伪浮点数 9.4.1 有理数 9.4.2 精度 9.4.3 加法(和减法) 9.4.4 乘法(和除法) 9.4.5 决定误差 9.5 延伸阅读 第10章 降低功耗 10.1 理解功耗 10.2 离开房间的时候请关灯 10.2.1 关掉外围设备 10.2.2 关掉不用的I/O设备
10.2.3 关掉处理器子系统 10.2.4 降速节能 10.3 让处理器休眠 10.3.1 基于中断的代码流模型 10.3.2 深度研究主循环 10.3.3 处理器看门狗 10.3.4 避免频繁唤醒 10.3.5 处理器链 10.4 延伸阅读
O'Reilly Media,Inc.介绍 O'Reilly Media通过图书、杂志、在线服务、调查研究和会议等 方式传播创新知识。自1978年开始,O'Reilly一直都是前沿发展的见 证者和推动者。超级极客们正在开创着未来,而我们关注真正重要的 技术趋势——通过放大那些“细微的信号”来刺激社会对新科技的应 用。作为技术社区中活跃的参与者,O'Reilly的发展充满了对创新的 倡导、创造和发扬光大。 O'Reilly为软件开发人员带来革命性的“动物书”;创建第一个 商业网站(GNN);组织了影响深远的开放源代码峰会,以至于开源软 件运动以此命名;创立了Make杂志,从而成为DIY革命的主要先锋;公 司一如既往地通过多种形式缔结信息与人的纽带。O'Reilly的会议和 峰会集聚了众多超级极客和高瞻远瞩的商业领袖,共同描绘出开创新 产业的革命性思想。作为技术人士获取信息的选择,O'Reilly现在还 将先锋专家的知识传递给普通的计算机用户。无论是通过书籍出版, 在线服务或者面授课程,每一项O'Reilly的产品都反映了公司不可动 摇的理念——信息是激发创新的力量。 业界评论 “O'Reilly Radar博客有口皆碑。”
——Wired “O'Reilly凭借一系列(真希望当初我也想到了)非凡想法建立了 数百万美元的业务。” ——Business 2.0 “O'Reilly Conference是聚集关键思想领袖的绝对典范。” ——CRN “一本O'Reilly的书就代表一个有用、有前途、需要学习的主 题。” ——Irish Times “Tim是位特立独行的商人,他不光放眼于最长远、最广阔的视 野并且切实地按照Yogi Berra的建议去做了:‘如果你在路上遇到岔路 口,走小路(岔路)。’回顾过去Tim似乎每一次都选择了小路,而 且有几次都是一闪即逝的机会,尽管大路也不错。” ——Linux Journal
译者序 谈到设计模式,不得不提“四人帮”所著的《设计模式:可复用 面向对象软件的基础》,在那本经典著作中,作者总结了设计灵活、 易扩展的面向对象软件的23种设计模式,使软件开发人员在面对类似 应用场景、要解决类似问题的时候可以应用这些优秀的解决方案。 在此之后,“设计模式”称为软件开发领域的研究热点之一,诞 生了一系列著作,涵盖了从需求到分析,再到设计、实现、测试,甚 至软件界面设计等主题。然而,在嵌入式系统开发领域里是否可以应 用设计模式,如果可以的话,又该如何应用?作为热衷软件开发以及 模式应用的我来说,一直在思考和探索这个问题。直到看到White的这 本书,这个问题才算有了一个比较完美的解答。 作者以高屋建瓴的方式,从嵌入式系统设计的重中之重——架构 设计入手,介绍了嵌入式系统的架构设计步骤以及架构设计模式,在 此基础上转向如何运行代码,如何与外设通信,如何进行代码更新, 如何使用定时器和中断,以及如何在小型处理器上实现复杂的数学运 算,同时也介绍了如何降低系统功耗的一些有效方法。对本书内容的 组织,也是一个非常优秀的架构设计示例,体现了作者构思的巧妙。
本书中,作者不仅结合具体的例子讨论了如何在嵌入式软件中使 用经典的设计模式,如门面模式、命令模式等,而且也深入讨论了在 嵌入式系统中独有的设计模式,如环形缓冲区、中断和定时器、硬件 调试、PID控制、系统优化等。 也许很多人会质疑,用C语言很难实现C++的面向对象设计方法。 但在本书中,可以看到,用C语言的指针很容易就可以做到。而且,掌 握了这点之后,就可以发现面向对象设计思想在嵌入式系统开发中也 可以得心应手地运用,与语言没有关系。 从事过嵌入式开发的技术人员,对如何调试电路板可能都非常熟 悉,这其中不仅仅是技术,更多的是要面对交付的压力。要学会如何 沟通,遇到问题时如何寻求帮助。在本书中,作者给出了具体的例 子,读完之后,就会发现其中某些部分也许就是自己开发过程中的某 段过程的缩影,让人回味良久。 本书主要介绍没有使用操作系统的嵌入式系统的开发,因此必然 涉及实现一些简单操作系统的功能,比如任务调度、状态机等。本书 也给出了非常简明的例子,讨论了状态机的不同实现机制以及在什么 情况下使用中断,如何不使用中断实现相应的功能。 不夸张地说,软件模式的介绍只是本书的一小部分,但本书将模 式的思想发挥得更加自如,任何部分都可以称为一个模式。贯穿这些
软件设计、硬件设计、调试模式中的一个核心思想就是权衡,而这一 点恰恰是最难掌握的设计艺术之一,值得用心去体会。 本书字字珠玑,行文生动有趣,每章还附上了一个面试问题,并 且给出了回答这个面试问题的独到思路。这也是本书与众不同的地 方,作者将面试也“模式”化了。同时这也体现了作者写作本书的目 的之一,帮大家解决问题。 有些书教给人们某个工具的使用,有些书教给人们某个方法,而 本书则既教给人们工具、方法,又启发大家如何去思考和权衡。通读 本书,就像经历过一个完整的嵌入式开发项目,让人难以忘怀。 在本书的翻译过程,得到了机械工业出版社吴怡编辑的精心指导 和帮助,华章公司的编辑们对技术的熟练掌握以及对语言的精准把握 让人受益匪浅。 同时,感谢好友韩丽萍的热心帮助,感谢妻子和家人的宽容和耐 心,你们的关心和鼓励让我可以安心地专注于技术、翻译和文字所带 来的乐趣。 时间有限,错误之处在所难免。因此,怀着忐忑的心情,向广大 读者呈上这本译著,希望大家不吝指正。 译者介绍
余水清 国家认证系统分析师,信息系统项目管理师,系统架构 师,中国系统分析员协会(CSAI)专业顾问。曾参与过多项大型软件 开发项目,担任软件设计师、系统架构设计师、项目经理等职位,涉 及多个行业,包括银行、医疗、制造业、国家单位等。热衷于软件设 计模式和架构模式的研究和应用。
前言 我热爱嵌入式系统。当我第一次让马达转动时,我着迷了。我很 快从单纯软件开发进入到我可以触摸真实物体的一个领域。在我离开 软件开发的时候,设计模式 [1] 开创性的工作已经完成。我和我的团 队通读了这本书,讨论这些模式以及可以在哪儿应用这些模式。随着 我进一步深入研究嵌入式系统,我发现不能处理C++继承的编译器,在 处理器极其有限的内存中去实现模式,以及一系列新的问题使设计模 式看起来难以应用。但是我从来没有忘记在工程化方法中存在着模 式。通过学习识别模式,我们可以反复地使用这些健壮的解决方案。 本书大部分内容着重于阐述在嵌入式系统开发中的标准设计模式,同 时也给出了一些新的模式。而且,我还增加了一些章节,这些内容在 绝大部分书里都找不到。 关于这本书 在研究了医疗设备、赛车、飞机、儿童玩具以及射击瞄准系统中 的嵌入式系统之后,我发现了很多共性。如何为嵌入式系统设计和实 现软件,要是那时候懂得很多就好了。本书包含了我所学到的知识。 这是一本教授大家如何在资源受限的环境下设计优秀软件的书。
本书告诉你在应聘嵌入式系统开发工作时,了解面试官希望从你 身上看到什么。每章的最后都会有一道面试题。这些题通常与具体的 语言不相关,而是希望能启发你的思路。好的面试题一般都没有唯一 正确的答案,因此我在每道面试题下面给出了提示,没有列举所有可 能的答案,而是给出了面试官期望从你的回答中看到什么的一些提 示。毕竟,你得凭借你自身的优势去获得工作(和答案)。 有一点需要说明,这里提到的嵌入式系统是没有操作系统的、运 行在裸机上的软件。当软件发出打开灯的指令时,它直接向处理器发 出而没有经过任何中间层。本书不讨论嵌入式操作系统,但是相关概 念可以运用到运行操作系统的处理机上。因此,如果你深入研究,就 可以了解操作系统底层的原理。运行在没有操作系统的环境下会让人 真正体会并感谢操作系统为我们所做的一切。 本书给出了在设计嵌入式软件时通用的原型和原则。我并没有基 于任何特定的平台、处理器、编译器或者编程语言,因为通过本书打 下扎实的基础之后,转向特定的平台自然水到渠成。 关于作者 在嵌入式系统领域中,我设计过DNA扫描器、飞机惯性测量单元、 赛车、儿童玩具、抓捕罪犯的射击瞄准系统以及各种医疗和消费类设 备。
Loading comments...
Reply to Comment
Edit Comment