标题：硬件/固件接口设计
基本信息
作者： (美) Gary Stringham  [1]译者： 张鼎 贺小川 
丛书名： 移动与嵌入式开发技术 
出版社：清华大学出版社 
ISBN：9787302267010
上架时间：2011-11-15
出版日期：2011 年11月
开本：16开
页码：1
版次：1-1
目录
《硬件/固件接口设计—提高嵌入式系统开发效率的最佳实践》 
第1章 引言 1 
1.1 硬件/固件接口 2 
1.1.1 硬件、芯片及组件 2 
1.1.2 固件和设备驱动程序 5 
1.2 最佳实践 6 
1.2.1 原则 7 
1.2.2 原则和实践带来的好处 8 
1.3 “一次成功”还意味着…… 8 
1.3.1 更易于编程 9 
1.3.2 更易于调试 9 
1.3.3 更易于变通地解决缺陷 9 
1.4 目标读者 10 
1.4.1 硬件工程师 10 
1.4.2 固件工程师 10 
1.4.3 本书在大学环境中的应用 11 
1.5 项目的生命周期 11 
1.6 案例研究 12 
1.6.1 unity asic中的单色 
视频组件 12 
.1.6.2 优秀示例的案例研究 13 
1.7 小结 14 
1.8 参考文献 14 
第2章 原则 15 
2.1 硬件/固件接口设计的七项 
原则 15 
2.1.1 协同设计 15 
2.1.2 确定并遵循标准 17 
2.1.3 均衡负载 18 
2.1.4 设计要考虑兼容性 20 
2.1.5 预测影响 20 
2.1.6 设计要考虑意外 21 
2.1.7 事先计划 23 
2.2 小结 23 
第3章 合作 25 
3.1 第一步 25 
3.1.1 角色 25 
3.1.2 启动会议 27 
3.2 正式合作 28 
3.2.1 例会 28 
3.2.2 初期的固件支持 29 
3.2.3 联合开发技巧 30 
3.2.4 后期的硬件支持 32 
3.2.5 文档 33 
3.3 非正式合作 34 
3.3.1 正式的组织结构 35 
3.3.2 硬件工程师的主动性 35 
3.3.3 固件工程师的主动性 36 
3.3.4 合作解决问题 37 
3.4 小结 38 
3.5 参考文献 38 
第4章 计划 39 
4.1 行业标准 39 
4.1.1 既有标准 39 
4.1.2 实现标准 40 
4.1.3 标准的扩展与创建 42 
4.2 通用版本 43 
4.3 兼容性 44 
4.3.1 向后及向前兼容的范围 44 
4.3.2 新旧版本的组合 45 
4.4 缺陷 46 
4.4.1 归档缺陷 46 
4.4.2 修复缺陷 47 
4.4.3 查找缺陷的测试计划 49 
4.5 分析 49 
4.5.1 共用引脚 49 
4.5.2 缓冲区管理 50 
4.5.3 硬件/固件交互 51 
4.5.4 分析第三方的ip 52 
4.6 事后检查 53 
4.7 小结 53 
第5章 文档 55 
5.1 类型 55 
5.1.1 文档的级别和类型 56 
5.1.2 芯片级文档与组件级文档 56 
5.1.3 支持与不支持文档 58 
5.2 文档管理 60 
5.2.1 文档标准 60 
5.2.2 何时编写文档 60 
5.2.3 准确性 61 
5.3 审阅 62 
5.3.1 何时审阅 62 
5.3.2 跟踪文档变化 63 
5.3.3 固件工程师应承担的 
审阅责任 64 
5.4 内容 65 
5.4.1 大体内容 65 
5.4.2 模板文档示例 66 
5.4.3 历史 66 
5.4.4 功能与假设 68 
5.4.5 参考和教程 69 
5.4.6 术语表和勘误表 70 
5.5 寄存器 71 
5.5.1 寄存器文档 71 
5.5.2 寄存器设计工具 72 
5.5.3 寄存器表 75 
5.5.4 寄存器的细节和描述 75 
5.6 数据位 77 
5.6.1 寄存器映射格式 77 
5.6.2 数据位的位置、 
类型及默认值 78 
5.6.3 数据位的描述 80 
5.6.4 中止的影响 80 
5.6.5 测试及调试数据位 81 
5.7 中断 81 
5.7.1 边沿触发型中断和电平触 
发型中断 81 
5.7.2 中断的使能与应答 82 
5.7.3 中断尚未完全完成 83 
5.7.4 无介入的重复中断 83 
5.8 时间 84 
5.8.1 时间范围 84 
5.8.2 时间单位 85 
5.9 错误 86 
5.9.1 两种类型的错误 87 
5.9.2 有关错误的丰富信息 87 
5.9.3 发生错误后组件的状态 88 
5.9.4 固件恢复的步骤 89 
5.10 信息 89 
5.10.1 非法配置 89 
5.10.2 状态机 90 
5.10.3 如何中止 90 
5.11 小结 91 
第6章 超级组件 93 
6.1 超级组件的优点 93 
6.1.1 组件的附属资源 94 
6.1.2 包含未使用逻辑的理由 94 
6.1.3 反对包含未使用逻辑的 
理由 97 
6.2 联合 99 
6.2.1 设计超级组件 99 
6.2.2 制作超级模块 100 
6.2.3 改进设计 101 
6.2.4 添加未来的功能 102 
6.2.5 超级组件的版本号 103 
6.3 i/o信号 103 
6.4 参数化 105 
6.4.1 减少硅片空间 105 
6.4.2 参数化风险的最小化 106 
6.4.3 固件的参数化信息 107 
6.4.4 可选的与固定的寄存器及 
数据位 109 
6.5 小结 110 
6.6 参考文献 111 
第7章 设计 113 
7.1 事件通知 113 
7.1.1 无指示 114 
7.1.2 延时 114 
7.1.3 状态位 116 
7.1.4 中断 118 
7.2 性能 120 
7.2.1 增大缓冲区 120 
7.2.2 提前工作 121 
7.2.3 调整 122 
7.2.4 裕度 122 
7.3 上电 122 
7.3.1 上电时的交互 122 
7.3.2 i/o线路的上电状态 123 
7.3.3 组件级的电源控制 124 
7.4 通信与控制 124 
7.4.1 错误信息 124 
7.4.2 dma功能 125 
7.4.3 i/o引脚共享 126 
7.4.4 隐藏实现细节 127 
7.5 小结 128 
第8章 寄存器 131 
8.1 寻址 132 
8.1.1 处理器访问 132 
8.1.2 芯片的基址 134 
8.1.3 组件的偏移量和基址 135 
8.1.4 寄存器的偏移量 137 
8.1.5 子组件 137 
8.1.6 迸发 138 
8.1.7 未使用的地址单元 138 
8.1.8 下一代芯片的变化 139 
8.2 位分配 141 
8.2.1 分配数据位的位置 141 
8.2.2 多位字段 142 
8.2.3 多寄存器字段 144 
8.2.4 未使用的数据位单元 145 
8.2.5 下一版本的变化 146 
8.2.6 数据位类型 148 
8.2.7 寄存器中的数据位类型 151 
8.2.8 根据操作模式编组 152 
8.2.9 组件的多次例化 153 
8.3 数据类型 154 
8.3.1 整数 154 
8.3.2 实数 156 
8.3.3 指针 159 
8.3.4 常数 160 
8.4 硬件标识 161 
8.4.1 芯片id和版本 161 
8.4.2 组件id和版本 162 
8.5 通信与控制 163 
8.5.1 必要的信息 163 
8.5.2 组件中的排队任务 164 
8.5.3 一致的寄存器内容 167 
8.5.4 访问原子寄存器 168 
8.6 小结 172 
第9章 中断 173 
9.1 设计 173 
9.1.1 中断超级模块 174 
9.1.2 分级的中断结构 176 
9.1.3 中断共享 177 
9.1.4 中断源信号的完整性 178 
9.1.5 中断触发的类型 179 
9.2 待决寄存器 183 
9.2.1 应答中断 183 
9.2.2 中断位置的次序 185 
9.3 使能寄存器 186 
9.3.1 1使能中断 187 
9.3.2 使能控制中断 187 
9.3.3 使能的默认设置 188 
9.4 可选的寄存器 188 
9.4.1 中断源状态寄存器 189 
9.4.2 抢占寄存器 190 
9.4.3 原子使能寄存器/原子关闭 
寄存器 190 
9.4.4 屏蔽寄存器 190 
9.4.5 例化寄存器 191 
9.4.6 可选寄存器的地址 191 
9.5 中断模块回顾 192 
9.5.1 中断通道 193 
9.5.2 中断模块 195 
9.5.3 外部连接 196 
9.6 双边沿触发 196 
9.6.1 利用两个中断通道 197 
9.6.2 头边沿和尾边沿中断的 
通道位置 198 
9.7 使用中断模块 200 
9.7.1 何时分配中断通道 200 
9.7.2 重复中断 201 
9.7.3 地址映射 201 
9.8 小结 202 
第10章 中止等 205 
10.1 定义 205 
10.2 停止 206 
10.3 复位 207 
10.4 中止 208 
10.4.1 中止的必要性 208 
10.4.2 固件与中止的交互 210 
10.4.3 中止的行为 212 
10.4.4 中止组件间的交互 213 
10.5 小结 214 
第11章 钩子 217 
11.1 针对钩子的设计 218 
11.1.1 增加哪些钩子 218 
11.1.2 增加寄存器 219 
11.1.3 查找潜在问题区域 219 
11.1.4 删除变通措施 220 
11.2 查看 220 
11.2.1 内部寄存器 220 
11.2.2 信号 221 
11.2.3 存储器 222 
11.2.4 状态机 223 
11.3 打探 225 
11.3.1 破坏性的读写 225 
11.3.2 输入和输出信号 226 
11.3.3 重写寄存器 226 
11.4 监视 227 
11.4.1 事件跟踪 227 
11.4.2 定时器 228 
11.4.3 数据观察 229 
11.5 其他钩子 229 
11.5.1 旁路 230 
11.5.2 测试和调试所需的 
附加资源 231 
11.5.3 专用处理器 233 
11.6 小结 233 
第12章 结束语 235 
12.1 要点 235 
12.2 受益 235 
12.3 硬件/固件接口设计的七项 
原则 236 
12.4 产品终于可以运转了！ 
开始发货吧！ 236 
附录a 最佳实践 239 
附录b 电动车控制器的规范 251 
附录c 将本书作为大学教材 265 
附录d 术语表 271
译者序
如今，嵌入式产品已经渗入日常生活和工业生产的各个领域。数码产品、家用电器、工业设备、交通及通信工具中都随处可见嵌入式产品的身影。嵌入式产品与传统电气产品的关键区别就在于包含了可编程逻辑器件，因此其开发通常包含硬件电路设计以及针对可编程逻辑器件的软件设计。这种软件设计与传统的软件设计类似，但是与硬件的相关性更大，通常称为固件设计。嵌入式产品需要固件与硬件的配合才能工作，因此，二者间的接口设计至关重要。 
尽管硬件与固件接口的重要性已经是业内公认的关键技术，但是有关这方面的技术资料大都是针对某个系统的详细设计，或者是个人经验，尚缺乏系统的讨论，特别是缺乏通用性的设计方法。本书在这方面做出了开创性工作，提出了硬件和固件设计的七项原则，并从工程实际中提炼出300多个最佳实践。由于本书作者的技术背景和宝贵的工作经历，使得这些原则和实践的可用性极高，是难得的技术财富。相信本书必能使广大硬件和固件设计人员获益匪浅。 
本书主要由张鼎翻译，贺小川翻译了部分内容。译文虽然经过多次修改和校正，但是由于译者水平有限，加之时间仓促，疏漏和错误在所难免，真诚地希望同行和读者不吝赐教，不胜感激。 
前言回到顶部↑　　您既可以找到由硬件工程师编写的向硬件工程师们讲授如何设计硬件的书籍，也可以找到由固件工程师编写的向固件工程师们讲授如何设计固件的书籍。本书由固件工程师编写，但是主要面向硬件工程师。 
很多工程师在硬件上运行固件时遇到过问题。硬件和固件通常是分别独立设计而成并期望在集成时能够一起工作。但是，这会出现一些问题和缺陷。有时甚至不知道缺陷在何处—— 是硬件还是固件的问题，或者是文档的问题。 
有关如何使硬件和固件在一起协同工作的书籍非常少。本书试图填补这一空白。本书阐述了硬件领域和固件领域之间的接口，并提供实践以减少生产嵌入式系统产品所需的时间和工作量。它涵盖了开发硬件/固件接口相关的所有方面，包括开发的过程、顶层设计以及详细设计等。 
本书的主要特色是包含300多个最佳实践，可为开发过程及设计的各个方面提供详细的指导。这些最佳实践的应用效果极佳，但是它们只适用于特定的情况。应当根据实际情况详细地对照检查它们。全书处处强调让工程师形成他们自己的最佳实践集。尽管工程师是以这300多个最佳实践作为起点的，但是应当以此为基础不断发展，逐渐形成他们自己的最佳实践集，因为这样做可以增加其所在组织的项目获得成功的几率。 
为了帮助工程师理解这300多个最佳实践，同时为了帮助他们创建自己的最佳实践集，本书列出了七项原则作为纲领性指导。即使在某些情况下没有特别合适的最佳实践，这些原则也能帮助工程师遵循正确的方向工作。依靠这七项原则和300多个最佳实践，将提高设计小组成功生产嵌入式系统产品的能力。 
本书概述 
下面的各章概述提供本书内容的概述，可以帮助读者浏览全书。 
第1章：该章为全书打下基础。讨论各种类型的硬件以及它们对硬件/固件接口的影响。该章定义了原则和最佳实践、目标读者以及产品生命周期。此外，还展示了一个贯穿全书的案例研究。 
第2章：该章介绍了七项原则并高度概括了本书的讲述方向，以及本书按照这个方向来讲述的原因。理解这些原则是理解列出的实践为什么是最佳实践的关键。 
第3章：硬件工程师和固件工程师之间合适而充分的合作是影响嵌入式产品成功的关键因素。该章定义了在合作中的角色和过程。 
第4章：在项目开始之前，必须做计划以确定并同意新产品采取的研究方向。该章涵盖了在计划新项目时所需考虑的几个方面。 
第5章：大多数被指派去编写文档的工程师都不喜欢这项工作。同时，大多数工程师都因为阅读不完整且不正确的文档而迷糊。该章讨论文档的类型、何时编写文档、如何检查文档以及文档应包含哪些类型的内容。 
第6章：该章介绍了可以完成在其自己所在领域内所有任务的组件的概念，并且讨论了超级组件的优点以及如何建立并根据需要使用超级组件。此外，还讨论了实际实现时的局限以及处理方法。 
第7章：该章讨论设计的各个方面，例如事件、上电顺序、通信及控制。 
第8章：寄存器是硬件与固件间的基本接口。该章详细讨论寄存器，包括地址、数据位的位置以及数据位的类型。 
第9章：由于业界使用的中断设计缺乏一致性，因此该章着重于详细讨论如何管理硬件产生并传递至固件的中断。该章还将提议一种中断标准并对此展开详细讨论。 
第10章：通常，很少考虑错误以及如何修复错误。该章讨论必要的设计元素以便固件能中止硬件的操作、恢复及继续处理。 
第11章：逻辑分析仪无法探测芯片的内部，但是了解芯片内部发生的情况对于确保固件能在硬件上正常运行至关重要。在芯片内安放一些固件可访问的钩子能使固件获取信息供工程师分析。该章将介绍许多可以运用的钩子。 
第12章：该章总结全书，还包含几个卡通图画来演示书中所讲述的概念。 
附录 
.　　附录A：该附录将本书中所有的最佳实践汇聚于此。 
附录B：该附录解释和说明第5章涉及的文档模板。 
附录C：对于必须共同完成某项目的硬件和固件工程的学生该附录就如何将本书中的知识传达给他们提供了一些建议。 
附录D：由于本书涉及两个不同的工程学科：硬件工程和固件工程，因此本附录涵盖了其中一个领域不为另一个领域所理解的术语。 
本书约定 
本书正文中的大部分内容是在讨论概念，散布其中的则是下列一个或多个元素：图、程序清单、寄存器映射、最佳实践和实战故事。 
图 
图0-1是一个例图。 
图0-1 例图 
固件程序清单 
程序清单0-1是固件的C语言源代码的示例。 
程序清单0-1 C语言代码示例 
/* Read the current list of pending interrupts */ 
interrupts = *interruptRegister; 
硬件电路 
本书中列出了一些硬件电路，并给出了原理图及其等价的Verilog代码。图0-2是原理图，程序清单0-2是示例电路对应的Verilog代码。 
图0-2 示例电路的原理图 
程序清单0-2 示例电路的Verilog代码 
// A simple AND gate. 
assign c = a & b; 
寄存器映射 
本书采用图解形式讨论寄存器、如何将各种数据位映射到寄存器中以及运行模式和这些数据位的复位值。有关该格式的详细解释参见第5章。 
表0-1 寄存器表格示例 
MSB 常用寄存器—0x0004 LSB 
位 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 
R/W - - - - - - - - - - - - - - - - - - - - - - - - - - - - - C B A 
复位 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
A：本数据位的第一种含义。 
B：本数据位的第二种含义。 
C：本数据位的第三种含义。 
最佳实践 
本书包含了与所讲授概念相关的300多个最佳实践。除了在全书中展示这些最佳实践外，还将它们统一收集在附录A中，从而提供了一个简明的检查表，可在芯片项目的设计期间使用。此外，还可以在出版社网站下载到以电子表格形式给出的这些最佳实践。 
在本书正文、附录A及电子表格中的每个最佳实践都有一个形式为X.Y.Z的ID编号。 
最佳实践 
1.1.1 硬件/固件接口设计的最佳实践。 
与本书一样，Excel电子表格数据库也是有版权的材料。购买本书的读者有权(并且鼓励这么做)以这个数据库作为起点并将其修改成适合自己设计小组需要的形式，但是要遵守一些约定。有关该数据库及版权使用许可的细节内容请参见附录A。 
最佳实践 
1.1.2 Copyright ? 2009，Gary Stringham & Associates LLC.保留所有权利。不要将此分发到您所在的设计小组以外。 
实战故事 
散布在全书中的这些内容都是真实的故事，它们将有助于展示所在主题的影响。这些故事都来自于进行设计和解决问题的一线工程师(大部分是我自己)。下面就是这种故事的示例(并非真实发生的故事)。 
实战故事 
我记得从一位朋友的朋友那里听过一个故事，他听一位工程师说有一位经理告诉她的下属…… 
合作站点 
从本书的合作站点上能找到包含了300多个最佳实践的电子表格数据库的链接，第5章讨论的文档模板，以及其他相关的内容。请访问我的网站以获得相同的工具和我在这个领域的工作有关的链接，以及如何与我直接联系的细节信息。 
联系作者 
如果您有任何有关本书或有关硬件/固件接口设计方面的问题，请随时通过联系我。 
致谢 
我要感谢Jack Meador和Mike Merrell，这两位硬件工程师在我从事项目工作时忍受了我不断提出的疑问、问题和请求，这个工程也促使我写成本书。他们在各自的硬件领域内提供了有价值的看法和帮助。他们及其公司以及其他公司的硬件工程师和固件工程师，提供了大量可用于很多最佳实践的材料，以及本书中的实战故事的材料。 
我还要感谢我的直接经理Warren Johnson和Tracy Sauerwein以及他们的上级经理Sandy Lieske和Von Hansen。本书的最终出版离不开他们无私的支持，是他们伴随我从生疏到熟练的成长过程，使我受益良多。 
在我的科技文写作教练Joel Saks的耐心指导下，我糟糕的写作水平提高了很多。他具有用只言片语就超越我所及的能力。此外，他还对我提出的概念进行了严格分析，并促使我进行清楚而准确的表达，从而使我在表达时能够证明对我自己而言是显而易见的那些概念是合理的。 
我还要感谢John Blyler、Clive “Max” Maxfiled、Jack Meador、Mike Merrell、Joel Saks以及其他三位人士(他们希望保持匿名)审阅本书的全文或部分内容。他们的建议都极具价值，促使本书愈加完善。感谢Mike Merrell帮助完成Verilog代码，感谢Kevin Falk绘制了汽车插图。还要感谢5年来向我提出建议并给予热情鼓励的很多朋友，是他们的鼓励促使我完成本书的撰写。 
最重要的，我要感谢我的妻子和孩子们 ，感谢他们的宽容和长期忍受我花费许多夜晚及周末的时间来撰写本书，却从未修理房子、带孩子参加活动或者和全家旅游。