嵌入式系统原理及开发:基于ATOM处理器及Linux实现(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-06 13:49:03

点击下载

作者:应忍冬,蒋乐天,等

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

嵌入式系统原理及开发:基于ATOM处理器及Linux实现

嵌入式系统原理及开发:基于ATOM处理器及Linux实现试读:

前言

嵌入式系统是面向各种专业应用领域的基于微处理器技术的智能控制系统。它是当今发展最为迅速的技术领域之一,嵌入式系统已经深入到人类生活的方方面面,小到MP3播放器、手机、平板电脑等娱乐消费类产品;大到电冰箱、电梯、汽车等机电产品的控制;本书的写作目的是希望帮助读者了解嵌入式系统这一广阔领域的技术,掌握它的硬件和软件技术原理,为今后从事嵌入式系统设计开发提供基础。

虽然嵌入式技术经过了长期的发展,但作为这一领域技术教材,在内容选取和组织上且遇到不少困难,这主要是由于嵌入式系统的多样性造成的——针对不同的应用领域,嵌入式系统在接口电路、功耗、复杂度、微处理器架构、总线结构、操作系统、应用层软件等各方面又有着巨大的差异,仅仅通过一本教材去遍历所有的嵌入式系统几乎是不可能的。本书在写作前期,分析了读者对象、教学时间安排以及当前技术的发展趋势,对内容进行了取舍。教材内容从简单嵌入式系统硬件架构和接口开始讲起,较详细地介绍多种常用嵌入式系统接口,随后根据目前技术趋势介绍几种复杂的高速信号接口。其中常用的中低速接口和外围设备的介绍占整个硬件部分的80%,对于这部分内容,作者力图讲清楚原理;高速高性能接口以及外设备占硬件部分内容的20%,这一部分的写作目标是向读者指明这些接口和设备实现高性能的基本思想和概念,避开繁琐冗长的技术细节描述(事实上几乎每种高速设备和接口完整协议文档的页数都超过本书)。本书软件部分内容也以类似方式组织,对于嵌入式软件的基本组成和编译、链接、执行过程、嵌入式软件编程模式、代码优化技术部分作了详细地介绍,占软件部分的75%,而对于更上层的内容,比如嵌入式操作系统架构、驱动程序以及GUI技术占25%。通过这样的内容组织,使得书本一方面能够帮助嵌入式领域的初学者快速入门,掌握基本的系统软硬件设计技术,消除他们对嵌入式系统的”朦胧感“或者“恐惧感”。另一方面从宏观的角度对高性能嵌入式系统硬件架构及上层软件架构的介绍,使得读者能够了解嵌入式系统的技术现状,并为今后从事更先进的嵌入式系统软硬件设计铺平道路。

本书在读者对象包括计算机和电类专业学生,其中嵌入式系统硬件基本架构和常用接口技术、软件编程模式和优化技术能够用于一个学期的本科教学,而更高层次的高性能硬件接口设备、处理器架构以及嵌入式Linux优化技术、Meego架构及编程技术等作为基本内容的补充可以用于研究生课程的教学。本书建议的教学时间安排是36学时,并建议实验实践不低于40%的课时。

本书的1~4、6、9章节由应忍冬主笔撰写,5、7、8章节由蒋乐天主笔撰写,全书的内容结构由徐国治教授参与制定,并且由他审阅了书稿内容。在本书编写过程中英特尔亚太研发有限公司的技术专家提供了大力支持,英特尔开源技术中心中国首席开源科学家冯晓焰提供了全程技术咨询,并承担了书稿的通篇审阅工作。英特尔开源技术中心资深Linux软件工程师赵复生、英特尔平台软件基础架构部资深系统工程师龙勤提供了部分代码示例,并审阅了相关技术章节。英特尔开源技术中心软件经理郭相国、资深软件工程师杜小勇和顾扬等对本书也有贡献,对此深表感谢。本书编写同时得到了英特尔中国区教育事务总监朱文利女士、英特尔公司大学合作部经理颜历女士、王靖淇女士,以及英特尔合作伙伴关系部的杨青博士的支持,作者在此表示衷心的感谢。

另外,为了配合教学实践,特为本书开发了教学课件,内附书中程序完整代码和补充材料。索取可登录华信教育资源网(http://www.hxedu.com.cm)。

作者

于上海交通大学第1章 嵌入式系统概述1.1 嵌入式系统的定义

嵌入式系统这个名字已经出现很长时间了,但到目前为止对嵌入式系统没有一致的定义。其中一个被广为接受的定义是:嵌入于特定应用环境的、带有微处理器的软/硬件系统。嵌入式系统和通用计算机系统有一定的相同之处,但也有明显的差异,表1.1列出了两者的相同和不同之处。表1.1 嵌入式系统与通用计算机比较

根据表1.1给出比较可以看出,嵌入式系统的主要特点在于“嵌入”——嵌入不同的应用环境。虽然嵌入式系统拥有微处理器,有些在计算能力上不亚于个人PC(Personal Computer),但它的外观上完全看不出PC的样子来。在我们身边能够找到大量的嵌入式系统的例子,如手机、超市收银的POS机、地铁的刷卡检票系统、户外视频广告牌、MP3/MP4播放器等,如图1.1所示。图1.1 我们身边的嵌入式系统实例

嵌入式系统大量的“隐藏”在我们的身边,据统计,2009年嵌入式处理器的产量达到83亿颗,而PC处理器产量只有1.5亿颗,不到嵌入式处理器的2%。我们平时能够注意到仅仅是嵌入式系统的“冰山一角”。这些身边的嵌入式系统深深地嵌入了我们的日常生活和工业生产中,可以说是在背后默默地推动现代文明的发展。1.2 嵌入式系统的发展历史

嵌入式系统的发展历史与计算机及集成电路技术紧密联系。早期的计算机系统在运算能力上能够满足应用领域的需求,但由于当时计算机系统体积庞大、成本高、功耗高、编程及控制复杂,难以直接应用于设备控制。在工业控制领域更多的是通过各种继电器以及中小规模的模拟集成电路实现辅助控制。随着微电子技术的发展,计算机系统越来越小,各种单芯片微处理器的出现使得基于微处理器的数字控制技术成为可能,早期的处理器包括Intel的MCS8051、Motorola的6800、68K系列处理器、Zilog的Z80等处理器,这些处理器被称为单片机,它们与模数转换器(ADC,Analog to Digital Convertor)及数模转换器(DAC,Digital to Analog Convertor)结合实现设备的数字化控制,在工业控制系统中发挥了巨大的作用。早期应用于嵌入式系统的处理器由于集成电路逻辑规模有限,往往需要大量外围电路完成计算功能,包括外围的存储器、地址译码电路等,通常在单个印刷电路板(PCB,Printed Circuit Board)上集成嵌入式应用所需的处理器和外围电路,并被称为“单板机”。现在随着集成电路技术的发展,单个芯片能够容纳越来越多的电路模块,以往由多个芯片构成的“单板机”已经可以通过单个芯片实现,这一类芯片通常被称为“片上系统”(SoC,System on a Chip),图1.2给出了英特尔EP80579 SoC处理器的框图。图1.2 英特尔EP80579集成处理器的框图

该框图反映了典型的SoC架构,芯片系统包括了处理器内核、片内总线、外围设备通信控制器和部分存储器等。

随着集成电路技术的发展和嵌入式系统应用领域的不断拓展,可以看到未来嵌入式系统的发展趋势,即:功耗越来越低、体积越来越小、功能越来越强,此外通信能力将被大大加强。与目前的分散独立的嵌入式系统不同,未来的嵌入式系统将更加侧重于网络通信,利用集群运算和协同控制技术,将不同的嵌入式系统连成整体,大大拓展芯片的控制能力,服务于人类生活的各个方面。1.3 嵌入式系统的特征

对于嵌入式系统的特征,在上一节已经粗略地介绍,这里根据它的各个组成模块进行具体的讨论。由于嵌入式系统千差万别,这里描述的技术特征是不同的嵌入式系统中比较相似的一些特性。

嵌入式系统的硬件构成一般包括:嵌入式处理器、存储器、人机接口,以及针对特定应用的专用接口硬件。虽然在硬件组成上与传统PC类似,但每个组件的具体特性有明显的差异。表1.2例举了硬件方面的差异。表1.2 嵌入式系统硬件模块与PC的差异(续表)

虽然从运算能力上来看,多数嵌入式系统不及普通PC,但由于它们运行环境的特殊性,在结构上、性能指标要求上(比如可靠性和实时性等指标)可能会远高于PC。这些特殊性也对嵌入式系统的设计制造带来了挑战,常规的标准化模块化的设计方法在PC设计中得到普及,但对于嵌入式系统,很多设计需要针对应用逐一定制,缺乏一致的通用设计模式和软硬件架构。

在软件上,嵌入式系统和PC的具体差异如下:在操作系统上,PC使用Windows、Desktop Linux等系统,操作系统界面相对统一,系统软件可用的资源丰富(内存资源、CPU运算能力资源),并且操作系统提供给上层应用软件的运行环境遵循统一的标准(POSIX)。而嵌入式系统中由于内存容量和CPU运算速度的限制,对操作系统的规模有一定的限制,要求操作系统能够在特定的小内存和低速度下实现,并且很多情况下嵌入式系统不使用任何操作系统。对于嵌入式操作系统也因为应用环境要求的多样性,没有标准的实现,目前嵌入式系统软件市场上针对不同的特性要求有对应的操作系统。另外在操作系统的软件功能上,除了支持常规的设备管理、分配和多任务管理之外,嵌入式操作系统在可靠性和实时性上的要求通常高于PC操作系统,这些特点给嵌入式操作系统的设计带来了巨大的挑战。在应用程序方面,嵌入式系统软件通常针对设备控制和检测,而不会提供复杂的用户界面和视觉效果,因此很少需要PC环境下复杂的界面操作。在软件可靠性方面,嵌入式系统的要求通常高于PC软件。比如,交换机上运行的嵌入式应用程序通常需要连续数年不关机持续运行,不允许任何内存泄漏、死机、系统崩溃等软件故障的存在。相比之下,PC应用软件的崩溃就显得很频繁。

嵌入式系统是软硬件的结合体,针对应用环境定制,本书将根据从嵌入式系统的基本硬件构成和软件架构两方面进行介绍。由于嵌入式系统包括了各种不同的设计,书本的内容仅仅包括了其中相对共性的内容,虽然这仅仅是众多嵌入式系统的一小部分,但希望通过本书的介绍能够帮助读者学会分析理解应用于各行各业的嵌入式系统,并能够从事嵌入式系统的开发设计。第2章 嵌入式系统架构及硬件组成

嵌入式系统是由软硬件构成的系统,它总体的架构示意图如图2.1所示。

系统分为三个层次:最底层是硬件层,包括硬件模块和固件程序(Firmware),其中Firmware严格来说是控制硬件的底层软件,它用于非常基本的硬件管理,实现的功能有:嵌入式系统的上电自检程序、FlashROM的刷新重写程序、模块的电源开关等,这些功能相对简单,但和硬件结构紧密结合,通常由硬件设计厂家提供,因此一般被归为硬件。在硬件层之上有两层软件层,分别是操作系统层和应用程序层。其中操作系统提供统一的设备管理功能,比如设备驱动程序、硬件中断服务程序、内存分配和释放、协调多个应用程序共同访问设备时的设备控制、多线程程序的并行运行和调度等。操作系统的存在能够简化上层的用户程序开发,因为操作系统提供了软件大量功能给应用程序,使得上层开发不需要关心那些技术细节。上层应用程序实现的功能取决于具体的应用需求。对于复杂的嵌入式系统,往往采用多线程的编程模式,因此需要多个上层应用程序并行运行如图2.1所示。对于一些简单的嵌入式系统,会省去上面架构中的操作系统层,由应用软件直接访问所有的硬件资源,如图2.2所示。图2.1 嵌入式系统总体架构图图2.2 简单的嵌入式系统架构

这样能够提高软件的执行效率和减小内存占用,但难以适用于复杂系统的设计。

针对嵌入式系统的这个层次化架构,下面将会详细介绍各个层次的构成和基本原理。本章节侧重硬件部分的介绍,软件部分在后续的章节介绍。2.1 嵌入式硬件组成

嵌入式系统硬件常规的架构如图2.3所示。

图中CPU是整个系统的管理者,它通过板级总线访问内存及各种控制器(通信控制器、设备控制器)。对于简单设备(比如LED、开关等)CPU还可以绕开总线直接访问,比如通过CPU的通用IO管脚(GPIO,General Purpose Input Output)直接连接设备。

上面的架构是目前单处理器的嵌入式系统中较为常见的架构,这一架构由多个芯片构成,但是随着SoC技术的普及,图中的一些模块被集成到芯片内部,如内存、通信控制器、设备控制器等。对于简单的系统,选用合适的SoC芯片能够最大程度地降低外围元件数量,图2.4是一个SoC控制系统的例子。图2.3 常规嵌入式系统硬件架构图2.4 一个Soc控制系统实例

在上述例子中,嵌入式系统围绕SoC构造,由于SoC片内集成了各种所需的硬件模块,外围电路很少,只有几个信号接口和电源。这种形式的嵌入式系统外围电路简单,尺寸小,可靠性高,但由于片内集成的芯片规模有限,主要用于简单的设备控制,并且控制程序只需要较少的内存资源就能运行。

随着社会发展,对嵌入式系统的要求也不断提高,不少应用需要极高的运算能力和复杂的控制,常规的单处理器的解决能力往往不能满足需求,多处理器的技术成为满足这一类应用的技术趋势之一。在多处理器架构方面,嵌入式系统中比较常见的是结合几种不同架构和性能的处理器,分别满足几个方面的应用需求。多个处理器之间通过相对简单的接口进行通信或者同步。下面给出了几种架构方案:

图2.5所示方案中,两个处理子系统相对独立运行,但通过通信接口相互通信。其中通信接口可以在RS232、SPI、IIC等简单接口,也可以是USB、以太网等高速通信接口。由于两个系统相对独立,这一架构用于数据交互量相对较小的多任务嵌入式。比如在电梯控制器设计中,嵌入式子系统1负责电机变频器和各种传感器、开关的管理,嵌入式子系统2负责用户的按钮和显示屏。

这一模式的一个扩展就是构建模块化、可组装的嵌入式系统硬件,如图2.6所示。图2.5 多系统组合架构图2.6 模块化可组装的嵌入式硬件系统

通过通信线路互联能够把各个模块组装成一个系统。只要规定好模块之间数据和控制信号交互的协议,各个子模块能够独立设计完成。另外,系统升级可以通过更换子模块实现,而不用重新开发所有的软件。比如,以上面电梯控制为例,两个子系统之间通信的数据是用户按钮的信息和当前楼层信息,当系统设计者需要升级用户操作接口,比如从原先的数码管显示屏升级到液晶图形显示屏时,可以简单地更换子系统2,而子系统1的软件不用改变。

多处理器架构在高性能PC或者服务器中也很常见,但在那些系统中,各个处理器之间的联系相对紧密,数据交互频繁,因此处理器之间往往通过高速总线、高速网络或者是共享内存实现同步和交互,运行的软件需要考虑数据同步、CPU利用率等问题,架构复杂。相比之下多处理器嵌入式系统中各个处理器之间相对独立,数据耦合小,软件结构相对简单,便于提高系统的可靠性和稳定性。

下一节具体介绍嵌入式系统的一些主要硬件接口的原理。2.2 嵌入式处理器

嵌入式处理器是嵌入式系统的控制核心,根据目前市场上有各种不同的处理器,有不同的分类准则。下面根据处理器的硬件结构和处理能力进行分类:(1)嵌入式微控制器(MCU,Micro-control Unit)

这一类处理器的特点在于片内集成工业控制所需的接口控制器,如定时/计数器、看门狗、通用数字IO、串行口、脉宽调制输出(PWM)、ADC、DAC等,并且通常还具备一定的片内存储器(FlashROM和RAM),单片芯片就能够用于多种工业控制系统。基于这一类处理器的嵌入式系统硬件结构相对简单,可靠性高。(2)嵌入式微处理器(MPU,Micro-processor Unit)

这一类处理器在设计上相对通用,处理器性能较高,有高度灵活的内存管理单元,支持大容量(几百到数GBytes)内存,并能够运行复杂的操作系统软件。(3)数字信号处理器(DSP,Digital Signal Processor)

这一类处理器架构上针对信号处理应用进行专门的强化,片内提供多套运算电路实现并行计算,并且在片内总线结构、内存分配等各个方面根据信号处理算法的特点进行了优化。相对于MCU,DSP处理器的数学运算能力强而设备控制接口相对少一些。

从功能上看MCU和MPU有一定的相似之处,从图2.7所示面的框图能够大致看出两者的特点和差异。图2.7 MPU与MCU框图对比

如图所示,MCU内存和外设在控制器内置,微处理器MPU虽然没有片内存储器和控制器,但通过高速的总线能够连接大容量高速片外内存和外设实现高性能的嵌入式系统。

随着市场对嵌入式处理器的要求不断提高,目前MCU、MPU和DSP处理器在架构和功能都有相互融合的趋势,如MPU也开始在片内配置各种控制器,来提高控制领域的应用能力。另外,以往DSP专用的一些提高信号处理运算速度的技术也被MCU和MPU被采用,以适应控制和信号处理这两个方面的嵌入式应用。2.3 Intel嵌入式处理器

Intel公司可以说是嵌入式处理器的鼻祖之一,早期广为流行MCS8051单片机(MCU)由它设计生产(见图2.8),这一型号的处理器至今仍广泛用于各个行业。目前市场上有各家公司生产的兼容8051指令集的处理器,这一类处理器是嵌入式处理器领域的重要力量。图2.8 MCS 8051外形图片

除了早期的8051及同一系列的单片机(MCU)之外,Intel在嵌入式处理器方面的产品还包括XScale系列——基于ARM技术的处理器和当前ATOM系列处理器。其中ATOM处理器的指令集兼容x86系列处理器,这些系列处理器用于车载娱乐信息系统、多媒体IP电话、工业控制与自动化、医疗仪器等嵌入式系统。作为针对嵌入式系统应用的处理器,ATOM在低功耗上进行了设计优化,具体包括:

· 40nm高K技术流片工艺(K源于希腊文Kappa,用于衡量材料存储电荷的能力)。

· 通过缩小集成电路的晶体管尺寸,同时实现提高速度、降低电压和降低功耗这几项目标,使得该芯片在1.6GHz主频下功率仅为3W。相比之下Pentium处理器的功耗高达20W。

· 简化了指令执行硬件。

· Intel的其他x86处理器为了更高效的执行指令,使用了“乱序执行”的技术,即处理器在执行一个指令序列时,有可能在不改变执行效果的前提下不按照指令在内存中的排列顺序执行,通过重新排序执行,使得x86处理器的运算和控制硬件得到充分的利用,提高执行效率和性能。但ATOM不同,它是顺序执行指令,通过结构的简化,使得ATOM比常规的x86处理器有更低的功耗和更小的芯片面积。但在性能上为了能够获得x86乱序执行单元的性能,需要通过编译器优化技术,使生成的机器码按照能够提高运行效率的方式排列,提高运算效率。

· 针对多媒体应用的扩展指令集和超线程技术。

· 支持SSE3指令,通过编译器优化选项能够生成专用机器码。

决定嵌入式系统的性能除了CPU之外,还与外部设备控制器紧密联系,这些外部设备控制器包括以太网、串口控制器、CAN总线控制器、SPI总线控制器、PCI总线控制器等。这些外部设备与CPU的通信和连接方式影响到系统的性能和使用场合。下面通过对常规PC和基于ATOM的嵌入式系统架构比较,来说明连接设备的总线结构设计思想。

CPU在运行过程中,需要不同速率的数据通信,其中图像显示和主内存访问数据量大、速度高,而外部设备,如以太网、串行口等速度相对较低,为了能够提高通信效率,PC的总线结构需要分离这两类数据流,这是通过两个独立的总线通信互联芯片实现的。图2.9给出了常规的PC架构中设备控制器和处理器连接结构。图2.9 设备控制器和处理器的连接结构

图中上方的北桥芯片负责CPU和显示系统、主存储器之间的高速通信。下方的南桥芯片(图的××部分)负责管理相对低速的外围设备通信,并将这些数据流汇集起来通过南北桥芯片之间的内部总线传递给北桥,并最终到达CPU。这一模式在PC架构上得到广泛应用。

PC总线的这种南北桥架构需要的芯片数量多、系统复杂度和功耗高,难以直接应用嵌入式系统。对于嵌入式应用,更普遍的方法是利用尽可能少的芯片集成尽可能多的功能模块。对于ATOM处理器,为了能够满足嵌入式应用需求,Intel提供了“系统控制集成芯片”(SCH,System Controller Hub)的设计方案。该芯片同时集成了南桥和北桥功能,降低基于ATOM嵌入式系统的硬件复杂度,并通过片内电路优化降低功耗。图2.10是系统控制集成芯片μs15W的照片。图2.10“系统控制集成芯片”μs15W照片

使用“系统控制集成芯片”的ATOM嵌入式系统架构如图2.11所示。图2.11 使用“系统控制集成芯片”的ATOM嵌入式系统架构

图2.12中SCH芯片的型号是μs15W,该芯片集成的控制器接口包括:USB、PCI Express、PATA(并行硬盘接口)、SDIO/MMC(SD卡、MMC卡控制器)、内存控制器(支持DDR2内存)、显示器接口、高质量音频控制器接口(HAD Bus)、SMBus控制器、GPIO控制器(通用IO接口)、RTC(实时时钟)接口等。ATOM处理器配上该控制芯片后,能够直接连接各种设备,大大简化了主板的设计复杂度。

SCH内部各个控制器提供给CPU两种访问模式,一种是内存映射寄存器访问模式,每种设备的控制寄存器对应固定的地址,读写这些地址就能够操控相应的设备;另一种是IO访问模式,通过ATOM处理器的IO访问指令,读写IO端口操作,实现对SCH芯片内的控制器操作。

上述通过SCH简化外围控制器的芯片架构对于有更高体积要求的嵌入式系统仍就显得复杂,面向当前嵌入式应用小型化的趋势,新的ATOM处理器架构实现可编程SoC技术,它一方面将系统控制器和CPU集成在同一芯片上,去除了外置的SCH芯片,降低系统复杂度,另一方面,集成了FPGA可编程单元(CPU和FPGA两个芯片裸片封装在一起),为用户自定义硬件提供了灵活的实现方案。这一系列处理器的架构框图如图2.13所示。图2.12 ATOM嵌入式系统应用示意图

图中浅灰色部分是Altera公司的FPGA单元,FPGA单元通过PCIe总线和CPU通信,并扩展处理器的功能。这一架构为面向低功耗小型化嵌入式应用,并通过可编程芯片技术为适应不同的应用提供了极大灵活性,相信会在未来的嵌入式系统领域发挥巨大的作用。图2.13 新的ATMO架构2.4 内存子系统2.4.1 存储单元基本结构和分类

嵌入式系统的程序运行依赖于存储器,为了减小内存尺寸,降低系统复杂度,通常把嵌入式程序的代码部分和数据部分拆分,代码存放于半固定的ROM中,而数据放置于内容可变的RAM中。其中常见2的ROM种类有EPROM、FlashROM、PROM,这些ROM的共同点是它们可编程,即用户可以通过一定的手段能够将程序数据写入。其中22EPROM和FlashROM是可以重复擦写的,但EPROM容量相对较小,擦写速度快;FlashROM容量相对较大,但擦写速度慢。PROM是只能写入一次的ROM,一般分熔丝型和反熔丝型两种。PROM无法重复写入,但相比可重复写入的其他两种ROM,它的数据可靠性高,保存时间长,可以用于高可靠性,长寿命的应用,比如大楼的电梯控制器等。2

EPROM和FlashROM存储数据的基本原理是浮栅型场效应管,他们的示意图如图2.14所示。通过电的方式向浮栅上注入或者移除电子,改变场效应管的阈值电压,以标识存储的每一数据位的内容。由于浮栅中的电子会因为一些物理效应(比如高能粒子轰击)进入或者2离开浮栅,使得FlashROM和EPROM在一些严酷环境下(比如空间环境)的应用受到制约。图2.14 浮栅型场效应管剖面结构

在存储子系统中RAM用于存放可变数据,现有的RAM分SRAM和DRAM两种,其中SRAM中每一数据位的基本结构如图2.15所示。

该单元通过“正反馈”环路存储数据,因为正反馈环路能够锁定在输出低电平或者高电平两种状态。从而实现1位(bit)的数据存储。

SRAM的结构需要大量的晶体管实现,为了减小存储一位(bit)所需要的晶体管数量和面积,现在常用的技术是通过电容存储实现的,这一类RAM存储器称为DRAM,它们的基本数据存储单元结构如图2.16所示。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载