
基本信息出版社:电子工业出版社
页码:451 页
出版日期:2009年04月
ISBN:7121084449/9787121084447
条形码:9787121084447
版本:第1版
装帧:平装
开本:16
正文语种:中文
丛书名:嵌入式技术与应用丛书
内容简介 《嵌入式软件》涵盖了当前嵌入式软件领域的基本理论、研究动态、开发技巧和工具。为加深读者对内容的理解,书中还配备了大量的实例证明、分析及指导。通过对《嵌入式软件》的学习,读者不仅可以学会如何选择适当的技术和方法开发嵌入式软件,而且可以掌握如何从总体的角度,来全面规划和设计嵌入式软件系统。《嵌入式软件》体系完整、内容翔实,注重实用经验和技巧的分析、讨论,各章各有侧重又相辅相成,主要面向具有嵌入式系统基础知识的、从事嵌入式软件设计与开发的专业技术人员,对其他嵌入式技术领域的从业人员也颇具参考价值,也可供高等院校相关专业的师生学习。
编辑推荐 《嵌入式软件》为电子工业出版社出版发行。
目录
第1章 嵌入式编程的基本概念
1.1 数字系统
1.2 符号二进制数
1.2.1 定点二进制数
1.2.2 浮点二进制数
1.2.3 交互数字系统
1.2.4 二-十进制编码
1.2.5 ASCII
1.2.6 错误检测
1.3 数据结构
1.3.1 简单数据类型
1.3.2 复杂数据类型
1.4 通信协议
1.4.1 简单数据广播
1.4.2 事件驱动简单传输
1.4.3 事件驱动多元传输
1.5 数学
1.5.1 二进制加法和减法
1.5.2 二进制乘法
1.5.3 二进制除法
1.6 数值比较
1.6.1 条件语句
1.6.2 循环
1.6.3 其他流控制语句
1.7 状态机
1.7.1 数据索引状态机
1.7.2 执行索引状态机
1.7.3 混合状态机
1.8 多任务
第2章 设备驱动
2.1 本章梗概
2.2 实例1:中断处理的设备驱动程序
2.2.1 中断优先级
2.2.2 上下文切换
2.2.3 中断设备驱动程序的伪代码实例
2.2.4 中断处理和性能
2.3 实例2:存储器设备驱动程序
2.4 实例3:板级总线设备驱动程序
2.5 板级I/O驱动程序实例
2.5.1 实例4:初始化一个以太网驱动程序
2.5.2 实例5:初始化一个RS?驱动程序
2.6 本章小结
第3章 嵌入式操作系统
3.1 本章梗概
3.2 什么是进程
3.3 多任务和进程管理
3.3.1 进程执行
3.3.2 进程调度
3.3.3 任务间通信和同步
3.4 内存管理
3.4.1 用户内存空间
3.4.2 内核内存空间
3.5 I/O和文件系统管理
3.6 操作系统标准实例:POSIX(可移植操作系统接口)
3.7 操作系统性能指南
3.8 操作系统和板级支持包(BSP)
3.9 本章小结
第4章 组网
4.1 RCM3200 Rabbit Core的介绍
4.2 Dynamic C开发环境介绍
4.2.1 开发
4.2.2 调试
4.3 Dynamic C库简介
4.4 Dynamic C的内存空间
4.4.1 Rabbit的内存分段
4.4.2 Dynamic C中无独立的指令和数据空间时的内存使用
4.4.3 把函数放入XMEM
4.4.4 独立的指令和数据内存
4.4.5 综合所有内容
4.5 代码是如何编译和运行的
4.5.1 在传统开发环境下代码是如何被构建的
4.5.2 代码是如何在Dynamic C下构建的
4.6 将一台电脑设置为RCM开发系统
4.7 开始编写代码
4.7.1 项目:第一个Rabbit程序
4.7.2 Dynamic C的调试特性
4.7.3 Dynamic C帮助
4.7.4 单步调试
4.7.5 增加断点
4.7.6 监视表达式
4.7.7 Dynamic C不是ANSI C
4.7.8 Dynamic C存储空间
4.8 嵌入式网络
4.9 Dynamic C对于网络协议的支持
4.9.1 通用网络协议
4.9.2 Dynamic C库的可选模块
4.10 典型的网络设置
4.10.1 典型的企业网络
4.10.2 典型的家庭网络
4.11 建立核心模块的网络设置
4.11.1 设置IP地址
4.11.2 链路层的选择
4.11.3 在编译时定义TCP/IP
4.11.4 程序运行时的TCP/IP定义
4.11.5 调试网络宏命令
4.12 项目1:建立用于网络的Rabbit核心模块
4.12.1 静态地址的配置
4.12.2 配置动态地址
4.12.3 动态地址分配的特殊情况
4.13 客户端/服务器范例
4.14 Berkeley Sockets接口
4.15 嵌入式应用程序中TCP和UDP的比较
4.16 Socket编程中重要的Dynamic C库函数
4.16.1 用于通信初始化或通信终止的函数
4.16.2 用于确定Socket状态的函数
4.16.3 用于发送和接收数据的函数
4.16.4 阻塞函数和非阻塞函数
4.17 项目2:实现Rabbit TCP/IP服务器
4.17.1 服务器的TCP/IP状态机
4.17.2 和通用TCP工具一起工作
4.17.3 和Java TCP/IP客户端一起工作
4.17.4 和C++ TCP/IP客户端一起工作
4.18 项目3:实现一个Rabbit TCP/IP客户端
4.18.1 关闭Windows XP防火墙
4.18.2 检查客户端代码
4.18.3 与Java TCP/IP服务器一起工作
4.18.4 与使用C#实现的TCP/IP服务器一起工作
4.19 项目4:实现一个Rabbit UDP服务器
4.19.1 与Java UDP客户端一起工作
4.19.2 与C++ UDP客户端一起工作
4.20 一些有用(并免费)的网络工具
4.20.1 Ping
4.20.2 Traceroute
4.20.3 Ethereal
4.20.4 Netcat
4.20.5 在线工具
4.21 最后的思考
第5章 错误处理和调试
5.1 嵌入式系统开发和故障排除之道
5.1.1 开发者
5.1.2 回归测试——早测试、常测试
5.1.3 案例分析——一次性集成和无回归测试套件
5.1.4 发现者
5.1.5 修复者
5.2 避免集中调试——灵巧地编码
5.2.1 准则#1:使用小函数
5.2.2 准则#2:使用指针格外小心
5.2.3 准则#3:良好的注释代码
5.2.4 准则#4:避免“幻数”
5.3 主动调试
5.4 栈和堆
5.5 植入内存
5.6 逃逸代码
5.7 专用解码器
5.8 MMU
5.9 小结
5.10 用闪存实现可下载固件
5.11 微程序器
5.12 微程序器的优点
5.13 微程序器的不足
5.14 接收一个微程序器
5.15 基本的微程序器
5.16 常见问题及其解决方案
5.16.1 调试者不喜欢可写的代码空间
5.16.2 调试者不喜欢自我重定位的代码
5.16.3 无法生成位置独立的代码
5.16.4 启动时无固件
5.16.5 无限的看门狗超时
5.16.6 意外断电
5.17 硬件上的选择
5.17.1 隔离代码和数据
5.17.2 灵活安全
5.18 内存诊断
5.19 ROM测试
5.20 RAM测试
5.21 非易失性存储器
5.22 监督电路
5.23 多字节写
5.24 测试
5.25 小结
5.26 构建一个强大的看门狗
5.27 内部WDT
5.28 外部WDT
5.29 强大WDT的特征
5.30 使用内部WDT
5.31 使用外部WDT
5.32 用于多任务的WDT
5.33 总结和其他思路
第6章 软/硬件协同验证
6.1 嵌入式系统设计过程
6.1.1 需求
6.1.2 系统架构
6.1.3 选择微处理器
6.1.4 硬件设计
6.1.5 软件设计
6.1.6 软/硬件的整合
6.2 验证和确认
6.2.1 验证
6.2.2 确认
6.3 人际交互
6.4 协同验证
6.4.1 软/硬件协同验证的历史
6.4.2 协同验证的定义
6.4.3 协同验证方法
6.4.4 协同验证法样例
6.4.5 协同验证指标(协同验证参数)
第7章 嵌入式媒体处理技术
7.1 媒体处理系统简介
7.1.1 核心处理过程
7.1.2 输入/输出子系统——外设接口
7.1.3 存储子系统
7.2 系统资源的划分和代码优化
7.3 事件产生和处理
7.4 编程方法
7.5 高效编程的结构特点
7.5.1 单周期多重操作
7.5.2 硬件循环结构
7.5.3 专用寻址模式
7.5.4 联锁指令流水线
7.6 为达到有效编程,编译器的考虑因素
7.7 系统和内核同步
7.7.1 存取同步
7.7.2 排序
7.7.3 原子操作
7.8 存储结构——管理所需
7.8.1 存储器访问权衡
7.8.2 指令存储管理——高速缓存或DMA
7.8.3 数据存储管理
7.8.4 选择DMA和cache的系统方针
7.8.5 内存管理单元(MMU)
7.9 物理数据传输
7.9.1 分组转换到最小化内存总线翻转
7.9.2 了解内核和DMA SDRM的存取
7.9.3 保持SDRAM行开放,实现数据的多通路
7.9.4 优化系统时钟设置,确保刷新率,调整SDRAM运行时的速率
7.9.5 利用系统资源之间的优先权和仲裁策略
7.10 媒体处理框架
7.11 定义框架
7.12 非对称和对称的双核处理器
7.13 编程模型
7.13.1 非对称编程模型
7.13.2 均匀的编程模型
7.14 构建框架的策略
7.14.1 实时处理数据
7.14.2 编程轻便型胜过性能
7.14.3 基于性能的框架
7.14.4 框架提示
7.15 关于媒体框架的其他问题
7.15.1 音频、视频同步
7.15.2 管理系统流
7.15.3 框架和算法的复杂性
第8章 嵌入式系统中的DSP
8.1 嵌入式系统及实时系统概述
8.2 实时系统
8.3 硬件实时系统和软件实时系统
8.3.1 简介
8.3.2 实时系统和分时系统的区别
8.3.3 DSP系统是硬实时系统
8.3.4 实时事件的特点——实时事件的分类
8.4 有效执行和执行环境
8.4.1 效率概述
8.4.2 资源管理
8.5 实时系统设计挑战
8.5.1 响应时间
8.5.2 从故障中恢复
8.5.3 分布式和多处理器的体系结构
8.5.4 嵌入式系统
8.6 总结
8.7 运用DSP的嵌入式系统研发周期概述
8.8 使用DSP的嵌入式系统研发周期
8.8.1 步骤1:研究系统所有的功能需要
8.8.2 步骤2:选择系统需要的硬件组件
8.8.3 硬件门
8.8.4 软件可编程化
8.8.5 通用处理器
8.8.6 微控制器
8.8.7 FPGA解决方案
8.8.8 数字信号处理器
8.8.9 通用信号处理解决方案
8.8.10 DSP加速上的选择
8.8.11 步骤3:了解DSP的基础和体系结构
8.8.12 DSP处理模式
8.8.13 输入/输出选择
8.8.14 计算DSP性能
8.8.15 DSP软件
8.8.16 DSP构架
8.9 优化数字信号处理—SP)软件
8.10 什么是优化
8.11 处理过程
8.12 加快经常性事件的速度
8.13 加快经常性事件的速度——DSP体系架构
8.14 加快经常性事件的速度——DSP算法
8.15 加快经常性事件的速度——DSP编译器
8.16 DSP优化的深入讨论
8.17 直接存储器访问
8.18 使用DMA
8.18.1 将数据分段
8.18.2 挂起和轮询
8.18.3 管理内部存储器
8.19 循环展开
8.19.1 填充执行单元
8.19.2 减少循环开销
8.19.3 让循环适合寄存器的空间
8.19.4 折中
8.20 软件流水线化
8.20.1 一个例子
8.20.2 使软件流水线化
8.20.3 中断和流水线代码
8.21 更多的关于DSP的编译器和优化
技术
8.21.1 编译器架构和流
8.21.2 编译器优化
8.21.3 编译进行时的选项
8.22 程序员协助编译器
8.22.1 附注
8.22.2 内联函数
8.22.3 关键字
8.22.4 函数内嵌
8.22.5 减少堆栈存取时间
8.22.6 程序员协助编译器
8.22.7 编码建议总结
8.23 基于剖面的编译
8.23.1 优点
8.23.2 调试优化代码的问题
8.23.3 代码优化过程总结
8.23.4 总结
第9章 实用嵌入式编码技术
9.1 重入
9.2 原子变量
9.3 另两个规则
9.4 保持代码为重入
9.5 递归
9.6 异步硬件/固件
9.7 竞争条件
9.8 选项
9.9 其他RTOS
9.10 亚稳态
9.11 固件,非硬件
9.12 中断延迟
9.13 取数据
9.14 理解C编译器:如何最小化代码大小
9.15 现代的C编译器
9.15.1 编译器的结构
9.15.2 程序的含义
9.15.3 基本转换
9.15.4 寄存器分配
9.15.5 函数调用
9.15.6 函数内联
9.15.7 低级代码压缩
9.15.8 链接器
9.15.9 编译器优化控制
9.15.10 内存模型
9.16 编程建议
9.16.1 使用正确的数据尺寸
9.16.2 使用最好的指针类型
9.16.3 结构和填充
9.16.4 使用函数原型
9.16.5 使用参数
9.16.6 不要取地址
9.16.7 不要使用内联汇编语言
9.16.8 不要写聪明的代码
9.16.9 为跳转表使用switch
9.16.10 在使用位域前先检查
9.16.11 当心库函数
9.16.12 使用额外的提示
9.17 最后说明
9.18 致谢
第10章 开发技术及趋势
10.1 如何为片上系统设计选择CPU
10.1.1 设计复杂度
10.1.2 设计重用
10.1.3 内存架构和保护
10.1.4 CPU性能
10.1.5 功耗
10.1.6 成本
10.1.7 软件因素
10.1.8 多核SoC
10.1.9 小结
10.2 嵌入式系统软件开发的新兴技术
10.2.1 微处理器设备技术
10.2.2 系统架构
10.2.3 设计构成
10.2.4 软件内容
10.2.5 编程语言
10.2.6 软件团队规模和分布
10.2.7 UML和建模
10.2.8 关键技术
10.2.9 小结
10.3 选择开发工具
10.3.1 开发工具链
10.3.2 编译特性
10.3.3 嵌入式系统的扩展
10.3.4 优化
10.3.5 构建工具:关键点重述
10.3.6 调试
10.3.7 调试工具:关键点重述
10.3.8 标准和开发工具的集成
10.3.9 选择建议
10.3.10 小结
10.4 Eclipse——将嵌入式工具集中
10.4.1 Eclipse平台的理念
10.4.2 平台
10.4.3 Eclipse如何变成嵌入式的
10.4.4 小结
10.5 嵌入式软件和UML
10.5.1 为什么使用UML建模
10.5.2 将应用程序和体系结构分离
10.5.3 xtUML代码生成
10.5.4 小结
10.6 用xtUML进行基于模型的系统开发
10.6.1 为什么构建嵌入式系统如此困难
10.6.2 更好的解决方案
10.6.3 经验到此为止
10.7 展望未来
……
序言 计算机技术、网络技术、微电子技术和软件技术等信息技术的快速发展,使得嵌入式技术已经不再局限于航空航天、工业控制等专业应用领域内,而是越来越多地深入到我们的日常生活中,从智能家电、个人通信产品、数码消费电子产品到汽车等,随处可见嵌入式技术的身影。
与此同时,用户需求的多样化、复杂化和个性化趋势,导致上述电子产品的功能日趋复杂、研发难度加大;而激烈的市场竞争又要求厂商能够以最快的速度将产品投放市场并尽量降低研发成本。为了应对上述矛盾带来的挑战,建立具有良好可移植性和可扩充性的嵌入式系统平台势在必行,而在这一过程当中,除了以强大的硬件平台为基础以外,嵌入式软件扮演着越来越重要甚至是核心的角色。因为在硬件平台越来越同质化的今天,能够给产品带来核心竞争力的用户体验部分,很大程度上是由软件决定的。
《嵌入式软件》一书的写作目的正是为了向读者提供解决上述问题的知识、策略、技巧和工具。目前,虽然已经有大量的嵌入式系统相关书籍出版,但大多侧重于介绍特定嵌入式处理器、特定操作系统或开发工具的原理及应用。而《嵌入式软件》一书深入而详细地阐述了嵌入式软件领域涉及的原理、技术和实现方法,从设备驱动、嵌入式操作系统、多媒体处理、数字信号处理,到网络技术、编码技术、错误处理和调试以及软/硬件协同验证,并配以源于实践的经典实例。
本书的11名作者都是在嵌入式技术领域内耕耘多年的专家,他们不仅著述颇丰,有着深厚的理论知识基础;更难能可贵的是,他们都在ADI、Cisco、Freescale、Sony和NASA等公司或机构从事过嵌入式系统的研发,有着丰富的实践经验。本书的内容是作者们理论和实践两方面积累、结合的结晶,具有极高的参考价值。
本书的翻译力求忠于作者原意,我们在许多嵌入式软件系统专业术语后面注上了英文名称。这一方面是为了能够方便读者对照理解,为以后的学习打下基础;另一方面也是为了避免以往就存在的不同中文译法带来的歧义。在翻译过程中,译者还发现了原著中的一些错误,均采用译者注的形式给出了修订说明。
本书第2、3、4章由陈慧翻译,第1、6、7、8章由琚小明翻译,第5、9、10章由章翻译。参加翻译和审校的还有蔡海滨和陈章龙老师,先后参与本书翻译工作的还有龚秋艳、王政、蒋秀峰、薛知深、尉晓蕾、杜静怡、漆文飞、乔治龙、刘聚富等同学,在此一并表示感谢。译者还要特别感谢电子工业出版社有关编辑对本书出版工作的支持。
为了让本书能够尽快与读者见面,又限于时间和水平,错误和不妥之处在所难免,敬请读者批评指正。
文摘 插图:

第1章 嵌入式编程的蒸本概念
Keith Curtis
本章的目的是为软件设计者介绍
中出现的一些基本概念和术语,包括二进制数字系统、数据存储、基本通信协议、数学运算、条件语句、状态机和基本掩码等。这些概念不仅为了让设计者理解它们的操作,而且为设计者提供了充分的知识,在必要的情况下,设计者可以自己实现这些操作。尽管本章对理解全书并非必须的,但是仍然建议阅读。
很容易理解为什么需要回顾状态机和掩码,而为什么不包含其他内容呢?为什么一个设计者会用“自己动手”的例程呢?这是一个高级语言应该做的事情。这是因为,在一个嵌入式系统中,运行速度、内存规模都是需要考虑的关键问题。了解一条指令是如何工作的,有助于设计者创建比语言内置的函数更小和/或更快更优化的函数。它也为设计者判定一条指令的实现是否高效提供了一个判断依据。因此,尽管为了编写一段掩码代码并不需要了解一条指令是怎样工作的,但是在嵌入式环境下编程时,这还是有价值的。