嵌入式软件设计基础——基于ARM Cortex-M3(原书第2版)
作者 : (美)Daniel W. Lewis 圣克拉拉大学 著
译者 : 陈文智 胡威 等译
丛书名 : 计算机科学丛书
出版日期 : 2013-11-25
ISBN : 978-7-111-44176-2
定价 : 45.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 201
开本 : 16
原书名 : Fundamentals of Embedded Software with the ARM Cortex-M3, Second Edition
原出版社: Pearson Education Asia
属性分类: 教材
包含CD :
绝版 :
图书简介

本书相比第一版使用了更常用的ARM Cortex-M3处理器介绍了嵌入式编程的基本概念,并在教学辅助专用网站上提供了使用德州仪器的EKI-LM3S811评估板和开源FreeRTOS等实施的实验作业,最终目标是为支持嵌入式软件的多线程风格编程和高可靠性需求奠定良好的基础。
本书适用于计算机科学、计算机工程或电子工程大学二年级层次的课程。

图书特色

嵌入式软件设计基础
基于ARM Cortex-M3
Fundamentals of Embedded Software with the ARM Cortex-M3 Second Edition
(美)Daniel W. Lewis 圣克拉拉大学 著 陈文智 胡威 等译

本书的最终目标是为支持多线程风格的程序设计和嵌入式软件的高可靠性需求建立坚实的基础。书中以实践中最常运用的方式讲解汇编语言——实现小型、快速或特殊目的的例程,这些例程由主程序(高级语言编写,如C)调用。通过运用嵌入式软件环境,本书介绍多线程程序设计、可抢占式系统与非可抢占式系统、共享资源和调度,帮助学生保持学习兴趣,满足他们的好奇心,并为操作系统、实时系统、计算机网络及基于多处理器的设计等后续课程做好充分准备。前版由高教社引进,新版用最新的ARM Cortex-M3 v7处理器替代了早期的Intel IA32处理器,更加符合目前越来越多的实时嵌入式应用需求。
本书适用于高等院校工科各专业本科嵌入式计算机系统程序设计、C语言程序设计及汇编语言程序设计类课程,也可供相关技术人员学习参考。

作者简介
Daniel W. Lewis 于1988年创立了圣克拉拉大学计算机工程系,并于接下来的18年担任系主任。在其任期内,他建立了独特的本科生出国交流项目和研究生学位证书项目,并开辟了网页设计和工程跨学科主修专业以及信息技术和社会跨学科辅修专业。
在1975年进入圣克拉拉大学前,Lewis曾在通用电气航空部门工作六年,为最早的三重冗余自动着陆系统的商用飞机之一设计了容错时序系统。他在一些海湾地区公司(包括Singer-Link公司)做过顾问,他设计的新算法和相应的超大规模集成电路模块阵列成为实时计算机图形系统新生产线的基础。

图书前言

如果问“你家中有多少计算机”,多数人可能都会回答说有2台或3台。如果问“你家中有多少微处理器(microprocessor)”,回答之前得认真地想一想。提示:远比两三个要多得多!实际上甚至超过10个、20个!今天微处理器几乎被嵌入到每一种你能想到的或者你想不到的电子产品当中。它们已经再普遍不过了,不仅是我们的家里,我们的工作场所、汽车、飞机、交通灯、超市、移动电话等中都有它们的身影,总之,几乎存在于我们生活的方方面面。
  嵌入式系统为学生提供了一个令他们兴奋的机会来表现他们的创新能力。学生难道没有梦想设计下一个新的小工具,能够发挥他们的想象力吗?作为教育者,我们的挑战是利用这种兴奋,释放这些年轻人的能量,激发他们掌握这个主题的兴趣。
本版中的更新内容
  实际上这是一个几乎完全重写的版本,具有以下几个显著的变化:
  1)取代了之前介绍的Intel IA32处理器,而涵盖了ARM Cortex-M3 v7处理器的体系结构和指令集。之所以选择32位的ARM处理器,是因为:2004年到2010年间设计的75%的嵌入式系统采用了32位处理器;ARM处理器的使用率快速增长,从2007年占所有嵌入式应用的19%增长到2010年的超过35%;ARM Cortex-M3 是为嵌入式实时应用专门设计的。
  2)涵盖了ARM Cortex-M3处理器能够很好地适应于嵌入式应用的主要特征,包括能够避免排空流水线的条件执行,中断“尾链”,中断的“迟到处理”以及用于内存和I/O中单个位寻址的“位段”。
  3)涵盖了ARM的过程调用标准以及针对函数参数、返回值和临时变量的寄存器的正确选择。
  4)增加了新的章“实现算术运算”(第3章),对汇编语言编程和I/O进行了重新组织和扩展,从原来的三章增加为四章。
  5)扩展了对二进制加法和减法的介绍,为以下知识点增加了新的内容:使用移位、加法和减法的方法作为常量乘法的替代方法,使用倒数乘法作为常量除法的替代方法,以及定点实数乘法的完整示例。
  6)更新了C语言有关C99标准的内容。
  7)大大扩充了第1~12章中每章结尾处的习题,并提供了部分习题的答案。
  8)教学辅助网站上包括14个新的实验程序作业,这些作业使用德州仪器的EKI-LM3S811评估板(包括LM3S811评估板)、Stellaris外设驱动程序库和IAR嵌入式测试程序集成开发环境的启动版本(Kickstart Edition)。LM3S811评估板提供了可编程定时器、指轮驱动分压计、A/D转换器、图形显示器、用户和复位按钮、用户LED、并行端口、串行UART端口、USB端口和JTAG连接器。
  9)使用开源的FreeRTOS实时内核来开发多线程实验作业,以探索调度、处理器利用率、线程饥饿、非绑定的优先级反转、死锁、互斥、信号量和队列。
  10)教学辅助网站上提供了完整的方案来组装简易的低端开发板,这个开发板用于最后的四个实验作业,从而开发基于反馈控制的小型直流电机的多线程程序。
目标
  本书的最终目标是为理解嵌入式软件的多线程风格编程和高可靠性需求奠定良好的基础。为此,确定如下的具体目标:
  1)理解在机器级别数据如何表示,并领会不同表示方法的效果及其限制。
  2)掌握在嵌入式系统中最常用的语言特定的功能,比如位操作和变量访问。
  3)学习程序员视角的处理器体系结构,以及为何有时在汇编层面进行编程是必要的或适当的。
  4)学习I/O编程的不同风格,最终了解如何利用事件驱动的方法将数据处理分离成多个相互独立的计算线程。
  5)学习抢占和非抢占的多线程编程、共享资源和临界区,以及调度是怎样管理系统响应时间的。
  6)通过重新学习作用域(scope)、参数传递(parameter passing)、递归(recursion)和内存分配(memory allocation)来强化基本的编程技能。
  7)学习与共享内存对象相关的问题,共享内存是如何受内存分配所影响的,什么样的编程实践能够用来减少共享内存的冲突。
目标读者
  本书致力于为计算机科学、计算机工程或电子工程大学二年级课程打下基础。期望这样一门课程能够替代传统的计算机组成和汇编程序设计课程。
  本书将描述实践中最常用的汇编形式——实现小而快或是特定目的的例程,以在类似C语言这样的高级语言编写的主程序中调用。本书因此将从“需要了解”的角度涵盖处理器组成和汇编语言的内容,而不是将其作为主要的目标。这种组织方式能帮助读者在学习本书和相关课程的过程中掌握嵌入式软件方面的汇编语言。因此,学生不仅需要学习仍然起到非常重要作用的汇编知识,也需要学习多线程编程、抢占和非抢占系统、共享资源和调度知识,这些知识有助于激发他们的兴趣,满足他们的好奇心并为学习后续的操作系统、实时系统、网络和基于微处理器的设计等课程打下基础。
  在大多数学校,入门编程课程(CS1和CS2)已不再用C或者Pascal这样的过程编程语言教授,流行的方法是使用面向对象程序设计语言如C++或者Java进行教学。尽管有这样一些变化,仍然不难发现在一门或多门高年级课程中仍然普遍使用过程化语言,并且在工业领域同样发现仍在使用这样的语言。在笔者的学校,我们通过围绕本书中的内容来重新组织传统的汇编语言课程以解决这个悖论,这种重新设计不仅能为在已经非常紧凑的课程中涵盖过程性方法并介绍嵌入式系统的流行主题预留出足够的时间,还能增强学生对CS1和CS2课程中引入的参数传递、作用域和内存分配模式等内容的理解。
  本书假定学生已经知道如何使用C、C++或者Java编程,并且了解这些语言在底层语法上的相似性,这种相似性使他们能够相对容易地从C++或Java程序迁移到C。本书并不着重于介绍C语言中那些让人难以忍受的细节,而是强调C语言在嵌入式应用中最常用的特征,并通过例子和编程作业来介绍过程化风格,采用的例子和编程作业中包括大量预先写好的源代码。原则上唯一需要的绝对前置课程是介绍C、C++或Java的CS1课程。然而本书也强烈推荐通过讲解数据结构知识的CS2课程来提高编程熟练程度。
编程作业与教学辅助网站
  本书在教学辅助网站(www.perasonhighered.com/lewis)上补充了大量程序设计作业。由于本书是面向大二学生的,作业将主要阐述书中的主题而不是扩展的程序设计项目。因此大部分作业的源代码已经提供,只要求学生关注与主题直接相关的部分。部分作业将解决在本书正文中没有涵盖的主题,比如A/D转换、反馈控制和处理器利用率。作业应该按照顺序完成,一些作业基于前面完成的某些作业内容。作业6~10是完整的程序,首先不加修改地运行来说明一个问题,然后修改后来解释一些具体的解决方案。编程作业11~14需要使用网站上所描述的特殊电机开发板。
  编程作业 相关章节 备注
  01 整数算术运算 2, 3 不需要特殊的硬件
  02 工具介绍 实现俄罗斯方块游戏
  03 时间测量 运行时间、程序延迟和PWM
  04 模拟设备 探讨A/D转换器、PWM和中断(使用C语言)
  05 定点实数 3, 5, 6, 7 使用汇编代码
  06 处理器利用率 这些作业是完整的程序,用于验证多线程程序中提出的问题。学生修改这些程序来学习或改进性能问题
  07 饥饿 10
  08 互斥、信号量和队列 9, 10
  09 优先级反转 10
  10 死锁 10
  11 电机速度控制Ⅰ 需要特殊电机开发板
  12 电机速度控制Ⅱ 9, 10 添加简单多任务
  13 电机速度控制Ⅲ 9, 10 添加互斥、信号量和队列
  14 电机速度控制Ⅵ 添加处理器利用率监测
平台的选择
  第5~8章中介绍的处理器体系结构是32位的ARM Cortex-M3。Stellaris LM2S811评估板使用了这款处理器并整合了大量适用的I/O设备,能够分别从德州仪器的EKI-LM3S811开发工具中的一部分来完成一个集成的软件开发环境和驱动库。
致谢
  如果没有很多人的共同努力,本书以及教学辅助网站上的软件不可能完成。在所有这些人中,我要特别感谢圣克拉拉大学过去十年间COEN 20的学生和助教,他们见证了本书从第1版到几乎完全重写的第2版的过程,也要特别感谢那些帮助调整文字、修订问题和实验作业的人。
  我也非常感谢我的很多同事,感谢Qiang Li和Neil Quinn耐心地使用我的材料进行教学——这可不是什么让人羡慕的事,他们也为最初的文本提出了大量的修改意见。感谢Hal Brown和Vasu Alagar帮助我开发了定点实数乘法的数学表示,从而能够在汇编语言中进行有效的直接实现,并且能够给出一个让学生相对容易理解的算法阐释。感谢Darren Atkinson在C语言方面宝贵的专业知识。同样感谢北卡罗来纳州立大学的Dana Lasher,他提供了中断驱动的I/O一节(8.4.2节)中关于电话呼叫的分析。
  我非常感谢北俄亥俄大学的Samuel Khorbotly和其他审查了新版本草稿的同仁,他们发现了我在文稿中的错别字、拼写错误、语法错误、遗漏、疏忽和偶尔的彻底错误。我也要表达我对Prentice-Hall的工作人员和他们的生产人员的感谢,他们让本书持续一年多的完成过程更加轻松。最后,我要感谢圣克拉拉大学准许我休假,从而使我能够有充足的时间来完成此次修订工作。

上架指导

计算机\嵌入式编程

封底文字

本书的最终目标是为支持多线程风格的程序设计和嵌入式软件的高可靠性需求建立坚实的基础。书中以实践中最常运用的方式讲解汇编语言——实现小型、快速或特殊目的的例程,这些例程由主程序(高级语言编写,如C)调用。通过运用嵌入式软件环境,本书介绍多线程程序设计、可抢占式系统与非可抢占式系统、共享资源和调度,帮助学生保持学习兴趣,满足他们的好奇心,并为操作系统、实时系统、计算机网络及基于多处理器的设计等后续课程做好充分准备。前版由高教社引进,新版用最新的ARM Cortex-M3 v7处理器替代了早期的Intel IA32处理器,更加符合目前越来越多的实时嵌入式应用需求。
本书适用于高等院校工科各专业本科嵌入式计算机系统程序设计、c语言程序设计及汇编语言程序设计类课程,也可供相关技术人员学习参考。

作者简介

(美)Daniel W. Lewis 圣克拉拉大学 著:Daniel W. Lewis 于1988年创立了圣克拉拉大学计算机工程系,并于接下来的18年担任系主任。在其任期内,他建立了独特的本科生出国交流项目和研究生学位证书项目,并开辟了网页设计和工程跨学科主修专业以及信息技术和社会跨学科辅修专业。在1975年进入圣克拉拉大学前,Lewis曾在通用电气航空部门工作六年,为最早的三重冗余自动着陆系统的商用飞机之一设计了容错时序系统。他在一些海湾地区公司(包括Singer-Link公司)做过顾问,他设计的新算法和相应的超大规模集成电路模块阵列成为实时计算机图形系统新生产线的基础。

译者简介

陈文智 胡威 等译:暂无简介

译者序

嵌入式系统是面向应用而进行定制的计算系统,它将多领域技术与具体行业需求结合在一起。经过多年的发展,其应用领域已经非常广泛,包括交通、能源、工业控制等,目前在汽车、家电和移动终端等领域的嵌入式创新应用不断涌现。
  在嵌入式系统发展迅速、应用范围不断扩大的背景下,我们迫切需要从嵌入式硬件与软件之间的关系出发,建立嵌入式软件设计与开发的系统性框架。而作为国内较早开设嵌入式系统课程的高校之一,浙江大学在教学过程中发现,嵌入式系统软硬件结合相对紧密,如果要学习设计和开发嵌入式软件,就必须对嵌入式硬件有一定程度的了解。因此,需要在嵌入式软件开发的课程中将具体的硬件知识与嵌入式软件知识结合起来,从而让学生能够真正深入了解嵌入式软件开发的本质。
  在《Fundamentals of Embedded Software with the ARM Cortex-M3》一书的第2版出版后,我们应机械工业出版社的邀请,开始进行翻译工作。在阅读完本书后,发现书中内容正是学习和了解嵌入式软件开发所需要的。本书作者选择了典型的嵌入式处理器体系结构作为嵌入式软件开发的基础,以嵌入式软件开发为目标,将软硬件系统很好地融合起来,通过循序渐进的方式,将嵌入式软件开发的本质生动地展现在读者面前。
  作者首先以实际生活中可能遇到的嵌入式系统来引入“嵌入式系统”的概念,并针对嵌入式系统做初步的介绍,以嵌入式系统中数的表示方法、算术运算的实现和C语言的基本特征等作为进一步探讨的基础;接下来分别介绍了嵌入式计算系统的构成、数据操作、控制结构和I/O程序设计,逐步深入到嵌入式软件设计与开发的主要内容中去;然后讨论了并发、调度、存储管理和共享存储,对嵌入式系统软件的核心进行剖析;最后探讨了嵌入式系统的软件初始化过程。同时,书中也提供了丰富的习题,可以让学生及时对所学知识进行全面把握和巩固。
  本书由浙江大学的陈文智和施青松以及武汉科技大学的胡威共同翻译完成。胡威和施青松对翻译初稿进行了审阅和修订,最终由陈文智统稿、定稿。
  在进行本书的翻译时,我们力求准确无误地表达出原文的意思,尽可能使文字流畅,易于理解。但是受译者水平和时间所限,不免有疏漏和不足之处,恳请读者不吝指正。
  在此非常真诚地感谢机械工业出版社的王春华和其他编辑,是她们细致的工作使得本书的翻译和出版顺利完成。

  译者
  2013年8月12日于求是园

图书目录

出版者的话
译者序
献辞
前言
第1章 导论  1
1.1 什么是嵌入式系统  1
1.2 嵌入式软件设计的目标有什么独特性  3
1.3 什么是实时系统  4
1.4 什么是多线程  4
1.5 嵌入式处理器到底有多强大  4
1.6 如何使用编程语言  5
1.7 构建嵌入式应用有什么不同之处  6
1.8 典型的嵌入式程序有多大  7
习题  7
第2章 数的表示  9
2.1 固定精度二进制数  9
2.2 按位计数制  10
2.2.1 二进制到十进制的转换  11
2.2.2 十进制到二进制的转换  11
2.2.3 十六进制:二进制的简写  13
2.2.4 固定精度、反转与溢出  14
2.3 整数的二进制表示  14
2.3.1 带符号整数  15
2.3.2 同一数量级的正数和负数表示  15
2.3.3 解释2的补码的值  16
2.3.4 改变具有整数和小数部分的数的符号  17
2.3.5 二进制加减法  17
2.3.6 表示范围与溢出  19
2.4 实数的二进制表示  19
2.4.1 浮点表示的实数  19
2.4.2 定点表示的实数  21
2.5 文本的ASCII码表示  22
2.6 二进制编码的十进制  23
习题  24
第3章 实现算术运算  27
3.1 2的补码与硬件复杂度  27
3.2 乘法与除法  29
3.2.1 有符号与无符号乘法  29
3.2.2 通过对2的移位来实现乘或者除  29
3.2.3 乘以任意常量  30
3.2.4 除以任意常量  31
3.3 定点实数的算术运算  31
3.3.1 使用标准16.16格式的定点数  33
3.3.2 使用标准32.32格式的定点数  34
3.3.3 32.32定点实数乘法  34
3.3.4 实例:4.4定点实数乘法  36
习题  37
第4章 C的整数类型及其使用  39
4.1 整数数据类型  39
4.2 布尔数据类型  42
4.3 混合数据类型  43
4.4 内存中的位操作  43
4.4.1 测试位  45
4.4.2 设置、清除与反转位  45
4.4.3 提取位  46
4.4.4 插入位  46
4.5 I/O端口的位操作  47
4.5.1 只写I/O设备  47
4.5.2 基于读和写的I/O设备  48
4.5.3 基于串行访问的I/O设备  49
4.5.4 基于写入数据位的I/O设备  49
4.6 访问内存映射的I/O设备  50
4.6.1 使用指针访问数据  50
4.6.2 数组、指针和取地址操作符  51
4.7 结构体  51
4.7.1 封装的结构体  52
4.7.2 位域  54
4.8 变量访问  54
4.8.1 获取对象的地址  55
4.8.2 使用联合体  56
习题  56
第5章 汇编程序设计Ⅰ:计算机组成  60
5.1 内存  61
5.2 中央处理单元  64
5.2.1 其他寄存器  65
5.2.2 取指–执行周期  65
5.3 输入/输出  67
5.4 ARM Cortex-M3 v7M体系结构概述  67
5.4.1 内部组成  68
5.4.2 指令流水线  69
5.4.3 存储模型  70
5.4.4 位带  71
5.5 ARM汇编语言  72
5.5.1 指令格式与操作数  72
5.5.2 将汇编翻译为二进制  73
习题  74
第6章 汇编程序设计Ⅱ:数据操作  77
6.1 将常量装入寄存器  77
6.2 将内存数据装入寄存器  77
6.3 数据从寄存器存入内存  79
6.4 将简单的C赋值语句转换为ARM汇编代码  80
6.5 内存地址计算  81
6.6 内存寻址实例  81
6.6.1 将C指针表达式翻译为汇编代码  82
6.6.2 将C下标表达式翻译为汇编代码  83
6.6.3 将结构体引用翻译为汇编代码  83
6.7 栈指令  84
6.8 数据处理指令  85
6.8.1 在APSR中更新标识  85
6.8.2 算术运算指令  85
6.8.3 位操作指令  86
6.8.4 移位指令  87
6.8.5 位域操作指令  88
6.8.6 混合位、字节和半字指令  89
习题  90
第7章 汇编程序设计Ⅲ:控制结构  92
7.1 指令序列  92
7.2 实现判定  92
7.2.1 条件分支指令  93
7.2.2 if-then和if-then-else语句  94
7.2.3 复合条件码  95
7.2.4 if-then指令  96
7.3 实现循环  97
7.4 函数的实现  99
7.4.1 函数调用和返回  99
7.4.2 寄存器使用  100
7.4.3 参数传递  101
7.4.4 返回值  101
7.4.5 临时变量  102
7.4.6 保存寄存器值  102
习题  103
第8章 汇编程序设计Ⅳ:I/O编程  106
8.1 Cortex-M3 I/O硬件  106
8.1.1 中断和异常  107
8.1.2 线程和异常处理模式  107
8.1.3 进入异常处理程序  107
8.1.4 从异常处理程序返回  108
8.1.5 减少延迟  108
8.1.6 优先级与嵌套异常  109
8.2 同步、传输率与延迟  111
8.3 缓冲区与队列  111
8.4 评价I/O的执行能力  113
8.4.1 轮询等待循环  114
8.4.2 中断驱动的I/O  116
8.4.3 直接内存访问  117
8.4.4 不同方法的比较  117
习题  118
第9章 并发软件  120
9.1 前台/后台系统  120
9.1.1 线程状态与串行化  120
9.1.2 延迟管理  121
9.1.3 中断溢出  123
9.1.4 将工作转移到后台  123
9.2 多线程编程  124
9.2.1 独立线程的并发执行  124
9.2.2 上下文切换  124
9.2.3 非抢占(合作)多线程  125
9.2.4 抢占式多线程  126
9.3 共享资源与临界区  127
9.3.1 禁止中断  127
9.3.2 禁止任务切换  127
9.3.3 自旋锁  128
9.3.4 互斥对象  128
9.3.5 信号量  129
习题  129
第10章 调度  131
10.1 线程状态  131
10.2 等待中的线程  132
10.3 上下文切换  132
10.4 轮转调度  134
10.5 基于优先级的调度  134
10.5.1 资源饥饿  134
10.5.2 优先级反转  134
10.5.3 优先级上限协议  135
10.5.4 优先级继承协议  135
10.6 分配优先级  136
10.6.1 最后期限驱动的调度  136
10.6.2 速率单调的调度  137
10.7 死锁  137
10.8 看门狗定时器  138
习题  140
第11章 存储管理  142
11.1 C语言中的对象  142
11.2 作用域  143
11.2.1 改进局部作用域  143
11.2.2 改进全局作用域  144
11.3 生命周期  145
11.4 自动分配  145
11.5 静态分配  146
11.6 三个程序:区分静态分配和自动分配  147
11.6.1 对象创建  147
11.6.2 对象初始化  147
11.6.3 对象销毁  148
11.7 动态分配  149
11.7.1 内存碎片  150
11.7.2 内存分配池  150
11.8 具有变量大小的动态分配  150
11.9 递归函数和内存分配  152
习题  152
第12章 共享内存  157
12.1 确定共享对象  157
12.1.1 共享全局数据  157
12.1.2 共享私有数据  157
12.1.3 共享函数  157
12.2 可重入函数  158
12.3 只读数据  158
12.4 编程实践需要避免的事项  159
12.4.1 将内部状态保持在本地静态对象的函数  159
12.4.2 返回本地静态对象地址的函数  161
12.5 访问共享内存  162
12.5.1 处理器体系结构的影响  163
12.5.2 只读和只写访问  164
12.5.3 类型限定符volatile  164
习题  165
第13章 系统初始化  168
13.1 内存层次  168
13.2 CPU和向量表  168
13.3 C运行时环境  170
13.3.1 将初始值从非易失性存储器复制到数据区  170
13.3.2 将未初始化的静态变量归零  170
13.3.3 设置堆  171
13.4 系统定时器  171
13.5 其他外围设备  172
部分习题答案  173
索引  175

教学资源推荐
作者: 袁春风,朱光辉,余子濠
作者: (美)Ken Kennedy,Randy Allen
作者: (美)David A. Patterson 加州大学伯克利分校 John L. Hennessy 斯坦福大学 著
作者: (美)David Money Harris 哈维玛德学院 Sarah L. Harris哈维玛德学院 著
参考读物推荐
作者: 刘火良 杨森 编著
作者: [英]姚文祥(Joseph Yiu) 著