嵌入式系统及应用PPT讲稿.ppt

上传人:石*** 文档编号:70309380 上传时间:2023-01-19 格式:PPT 页数:105 大小:4.68MB
返回 下载 相关 举报
嵌入式系统及应用PPT讲稿.ppt_第1页
第1页 / 共105页
嵌入式系统及应用PPT讲稿.ppt_第2页
第2页 / 共105页
点击查看更多>>
资源描述

《嵌入式系统及应用PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统及应用PPT讲稿.ppt(105页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、嵌入式系统及应用嵌入式系统及应用第1页,共105页,编辑于2022年,星期六核心内容核心内容n交叉开发技术 n仿真开发技术n开发环境提供的主要工具nGNU的嵌入式开发环境nWindriver的集成开发环境n仿真开发工具ARMulator第2页,共105页,编辑于2022年,星期六9.1 概述概述 需要协调管理特殊的硬件资源 软件具有可配置裁剪特性 需要交叉编译环境 需要交叉调试环境 需要交叉测试环境 需要软件固化工具嵌入式软件开发的特点:第3页,共105页,编辑于2022年,星期六9.2 交叉开发技术交叉开发技术宿主机:开发系统目标机:运行平台第4页,共105页,编辑于2022年,星期六宿主机

2、与目标机的差别宿主机与目标机的差别n n硬件的差别:处理器不同n n软件环境的差异:宿主机上有通用操作系统等系统软件提供软件开发支持,而目标机上除了调试代理没有其他用于嵌入式软件开发的软件资源第5页,共105页,编辑于2022年,星期六一、常用的交叉开一、常用的交叉开发方法发方法 1.Crash and Burn方式在宿主机上编写代码;在宿主机编译应用程序,生成可执行程序;固化到目标机的非易失存储器中;启动运行,若正常则转到;不正确则根据目标板上的信号显示估计错误位置,改写代码,纠正错误;返回重复操作;固化完成。第6页,共105页,编辑于2022年,星期六2.ROM Monitor方式 第7页

3、,共105页,编辑于2022年,星期六优点优点:n实时控制目标机的内存单元、寄存器、设置断点等n调试采用目标机本身的串口、网口、USB口进行第8页,共105页,编辑于2022年,星期六ROM Monitor的缺点的缺点:目标机内存使用与运行时不一致 目标机CPU运行与正常运行时不一致 无法调试通讯占用端口的相关代码 若目标机CPU不支持硬件断点,则无法调试设置数据断点 无法调试系统启动初始化过程第9页,共105页,编辑于2022年,星期六3.ROM Emulator方式 ROM Emulator是一种用于替代目标机上ROM芯片的设备,插接到目标机的ROM插座上,取代ROM内存。第10页,共10

4、5页,编辑于2022年,星期六4.ICE方式 ICE是一种用于替代目标机上CPU的设备,可执行目标机CPU的指令,能将内部的信号输出到被控制的目标机,ICE上的内存也可以被映射到用户的程序空间。第11页,共105页,编辑于2022年,星期六ICE方式 第12页,共105页,编辑于2022年,星期六ICE方式的特殊调方式的特殊调试功能试功能 支持软件断点和硬件断点的设置设置复杂的断点和触发器实时跟踪目标程序的运行,并可实现选择性的跟踪支持“Time Stamp”允许用户设置“Timer”提供“Shadow RAM”,支持非干扰调试查询。第13页,共105页,编辑于2022年,星期六5.OCD方式

5、 采用两级CPU模式:正常运行模式 调试模式第14页,共105页,编辑于2022年,星期六OCD方式的优点 性价比高 不占用目标机硬件资源 调试环境和运行环境一致 能调试底层系统软件第15页,共105页,编辑于2022年,星期六OCD方式的缺点方式的缺点 调试的实时性不如ICE强 不支持非干扰调试查询 CPU必须有OCD功能 OCD标准不统一 第16页,共105页,编辑于2022年,星期六BDM方方式式 第17页,共105页,编辑于2022年,星期六二、交叉开发过二、交叉开发过程程 三个阶段:应用软件生成阶段 应用软件调试阶段 应用软件固化运行阶段第18页,共105页,编辑于2022年,星期六

6、交叉开发过程交叉开发过程 第19页,共105页,编辑于2022年,星期六应用软件生成应用软件生成阶段阶段 第20页,共105页,编辑于2022年,星期六应用软件调试应用软件调试阶段阶段 第21页,共105页,编辑于2022年,星期六应用软件固化应用软件固化阶段阶段 第22页,共105页,编辑于2022年,星期六三、交叉开发环境三、交叉开发环境 交叉编译环境 交叉调试环境 嵌入式开发支持环境 其他辅助工具第23页,共105页,编辑于2022年,星期六交叉开发环境交叉开发环境 第24页,共105页,编辑于2022年,星期六9.3 仿真开发技术仿真开发技术 利用计算机仿真技术模拟嵌入式硬件系统的真实

7、运行,使软件开发和系统集成在虚拟平台上进行。第25页,共105页,编辑于2022年,星期六仿真开发结构图仿真开发结构图 第26页,共105页,编辑于2022年,星期六一、仿真开发分类一、仿真开发分类 纯软件仿真开发是利用宿主机上的资源模拟目标机实际硬件电路的运行,构建应用软件运行所需的虚拟硬件环境,提供嵌入式软件开发和调试的真正“软”平台。第27页,共105页,编辑于2022年,星期六纯软件仿真开发分纯软件仿真开发分类类 应用级仿真 编程接口级仿真 硬件级仿真第28页,共105页,编辑于2022年,星期六编程接口级仿真编程接口级仿真 第29页,共105页,编辑于2022年,星期六硬件级仿真开发

8、硬件级仿真开发 第30页,共105页,编辑于2022年,星期六二、仿真开发过程二、仿真开发过程 第31页,共105页,编辑于2022年,星期六三、仿真开发环境三、仿真开发环境 第32页,共105页,编辑于2022年,星期六四、仿真开发环境四、仿真开发环境的特点的特点 不需要提供实际的目标硬件环境;编译调试都在宿主机上进行;可以最大限度地保证软硬件同时开发。第33页,共105页,编辑于2022年,星期六9.4 开发环境提供的主要开发环境提供的主要工具工具 项目管理器 项目配置工具 源码编辑工具 C RTL(C Run-Time Library)RTOS开发支持包 交叉编译工具 交叉调试工具 交叉

9、测试 性能分析工具等第34页,共105页,编辑于2022年,星期六一、项目管理一、项目管理 项目管理器一般采用通用的工作区、项目管理方式,这能较好的支持在不同硬件平台上的软件移植。第35页,共105页,编辑于2022年,星期六二、配置剪二、配置剪裁裁 编译参数配置工具 实时操作系统裁剪工具 内存配置工具第36页,共105页,编辑于2022年,星期六三、源码编辑三、源码编辑 标准的文本编辑功能 支持语法色彩 简单的语法检查功能 源程序函数索引、定位功能显示调试信息文本保存的多中备份机制第37页,共105页,编辑于2022年,星期六四、目标代码编译四、目标代码编译生成生成 嵌入式开发环境一般提供工

10、具make,它利用编译器、汇编器、链接器和库管理器等工具,根据Makefile文件,将源代码转换成目标代码。第38页,共105页,编辑于2022年,星期六1.目标代码生成目标代码生成 设置目标代码生成选项;C源码预处理;C源码编译成汇编代码;汇编语言程序转换为可重定位目标代码;可重定位的目标模块链接成目标程序;文件格式转换。第39页,共105页,编辑于2022年,星期六2.目标代码优化目标代码优化 合并已有常量;公共子表达式删除;控制流优化;寄存器变量使用优化;循环优化;冗余指令删除;窥孔优化。第40页,共105页,编辑于2022年,星期六3.编译提示信息编译提示信息 错误信息:致命错误、一般

11、错误和警告。过程信息 状态信息第41页,共105页,编辑于2022年,星期六4.库的使用库的使用 在开发大中型软件时,常把一些编译好的模块统一放到一个库中。第42页,共105页,编辑于2022年,星期六5.常用文件后缀常用文件后缀.c或.cc 或.cxx 或.cpp.h或.hpp.s或.asm.S.o或.obj.a或.lib.elf.omf.hex.eepk.cofl.s19或.s2或.s3m.lstn.map第43页,共105页,编辑于2022年,星期六五、交叉调试五、交叉调试 硬件:连接线、仿真头、转换板等连接硬件。软件:宿主机端调试工具和目标机端ROM Monitor第44页,共105页

12、,编辑于2022年,星期六交叉调试定义交叉调试定义 调试器能够通过某种方式远程控制目标机上被调试程序的运行模式,并且具备查看和修改目标机上的内存、寄存器以及被调试程序中的变量等功能。第45页,共105页,编辑于2022年,星期六交叉调试与非交叉调交叉调试与非交叉调试比较试比较交叉交叉交叉交叉调试调试调试调试本地本地本地本地调试调试调试调试DebuggerDebugger和和DebuggeeDebuggee运行在运行在不同的不同的计计算机算机DebuggerDebugger和和DebuggeeDebuggee运行在同运行在同一台一台计计算机算机运行运行时时不一定需要操作系不一定需要操作系统统的的

13、调试调试支持支持运行运行时时需要操作系需要操作系统统的的调试调试支持支持DebuggeeDebuggee装装载载由由DebuggerDebugger或或LoaderLoader完成完成DebuggeeDebuggee的装的装载载是由是由专门专门的的LoaderLoader程序完成程序完成需要通需要通过过外部通信的方式来控外部通信的方式来控制制DebuggeeDebuggee不需要外部的通信方式来控制不需要外部的通信方式来控制DebuggeeDebuggee可以直接可以直接调试调试不同指令集的程不同指令集的程序序只能直接只能直接调试调试相同指令集的程序相同指令集的程序第46页,共105页,编辑于

14、2022年,星期六1.交叉调试支持的交叉调试支持的功能功能 内存 寄存器 断点 程序执行 变量 显示模式 OS-aware第47页,共105页,编辑于2022年,星期六交交叉叉调调试试的的过过程程框框架架第48页,共105页,编辑于2022年,星期六2.任务级调试任务级调试 调试对象是一个用户任务(集),用户可以自定义调试范围。第49页,共105页,编辑于2022年,星期六任务级调试任务级调试第50页,共105页,编辑于2022年,星期六3.系统级调试系统级调试 即内核级调试,调试对象是目标机上除调试代理外的所有程序,包括RTOS本身。第51页,共105页,编辑于2022年,星期六系统级调试系

15、统级调试第52页,共105页,编辑于2022年,星期六六、测试工具六、测试工具 嵌入式系统采用交叉测试,即嵌入式软件测试必须由宿主机和目标机协作完成。第53页,共105页,编辑于2022年,星期六1.仿真测试仿真测试 仿真测试环境可分为两类:一类要求用户改写I/O部分代码。无须改动其源程序。第54页,共105页,编辑于2022年,星期六纯软件仿真测试结纯软件仿真测试结构框架构框架 第55页,共105页,编辑于2022年,星期六2.交叉测试交叉测试 目标机的测试分为两类:仿真信号测试 实物测试第56页,共105页,编辑于2022年,星期六仿真信号测试的结仿真信号测试的结构构 第57页,共105页

16、,编辑于2022年,星期六3.实时性测试实时性测试 静态时间分析。不执行被测程序,通过分析估计执行时间。动态实时检测。实际执行程序测试程序的时间特性。包括:在线仿真器、模拟器、插桩技术。第58页,共105页,编辑于2022年,星期六七、版本管理工具七、版本管理工具 版本管理是用户对项目文件版本进行控制的工具软件。包括:版本库和临时工作区。第59页,共105页,编辑于2022年,星期六嵌入式软件版本管理工具的嵌入式软件版本管理工具的功能结构功能结构 第60页,共105页,编辑于2022年,星期六9.5 GNU的嵌入式开的嵌入式开发环境发环境 C编译器gcc make工具GNU make 开发调试

17、工具gdb第61页,共105页,编辑于2022年,星期六一、一、gcc编译器编译器 gcc前端支持多种高级语言,后端支持多种平台,它是一个交叉编译器,可以把源代码编译成在其他硬件平台上运行的可执行代码。第62页,共105页,编辑于2022年,星期六1.编译过程编译过程 预处理 编译 汇编 链接第63页,共105页,编辑于2022年,星期六预处理预处理 执行源代码的预处理,处理完后生成一个以“.i”为后缀名的临时文件。第64页,共105页,编辑于2022年,星期六编译编译 将预处理后生成的源代码编译为后缀名为“.s”的汇编文件。第65页,共105页,编辑于2022年,星期六汇编汇编 gcc调用a

18、s汇编程序,将汇编语言代码转换为以“.o”为后缀名的中间代码。第66页,共105页,编辑于2022年,星期六链接链接 它调用ld链接程序,把所有目标代码以及静态库,定位链接生成最后的可执行程序或其他格式的目标文件。第67页,共105页,编辑于2022年,星期六test.ctest.c的的gccgcc编编译过程译过程第68页,共105页,编辑于2022年,星期六2.交叉交叉gcc的生成的生成 gcc的缺省配置是本地使用。当需要交叉gcc时,可利用Linux环境下提供的一些交叉gcc生成工具来重新配置。第69页,共105页,编辑于2022年,星期六交叉交叉gcc的生成过程的生成过程 重新生成bin

19、utils。生成Llinux Headers 生成目标机的Glibc 生成交叉GCC第70页,共105页,编辑于2022年,星期六二、二、项目编译管理工项目编译管理工具具make 自动查找已修改的源程序文件,并对它们进行编译;对未改动的源程序文件,如果已经存在中间代码文件(“.o”文件)则不再重新编译;将所有的中间代码文件和库链接成可执行文件或特定格式的目标文件。第71页,共105页,编辑于2022年,星期六1.Make命令命令一般语法规则是:make-f makefile文件名 其他选项 目标名说明:-f:makefile的文件名字。目标名:所要更新目标的名称。两个常用选项。:-n:只显示生

20、成指定目标的各命令,并不 实际执行,可以用来检查make文件中的错误。-p:显示并检查make文件中的所有宏定义和所有内部规则。第72页,共105页,编辑于2022年,星期六2.目标目标 make文件中描述了目标依赖于哪些源程序文件,按照什么样的规则生成。目标的状态取决于所依赖的源程序文件状态。语法规则为:第73页,共105页,编辑于2022年,星期六3.宏宏宏的基本定义语法为:marco_name=string而已定义宏的引用语法规则为:$(marco_name)或者$marco_name第74页,共105页,编辑于2022年,星期六Make内部预定义内部预定义的宏的宏$,表示当前目标名。等

21、价于语句:第75页,共105页,编辑于2022年,星期六Make内部预定义内部预定义的宏的宏$*,表示去掉后缀的当前目标名。$,表示目标所依赖文件名。第76页,共105页,编辑于2022年,星期六4.符号符号%,对应于具体的文件名,表示命令本身不在屏幕上显示。:=,变量定义,它不是“=”符号。第77页,共105页,编辑于2022年,星期六符号符号例如:结果是:第78页,共105页,编辑于2022年,星期六5.函数函数语法格式如下:$(funcname arg1,argn)例如:SOURCES=$(wildcard*.c)产生一个所有以“.c”为后缀名的文件的列表,然后存入变量SOURCES中。

22、第79页,共105页,编辑于2022年,星期六6.注释注释 make文件的注释是用“#”开头的语句。第80页,共105页,编辑于2022年,星期六示示例例第81页,共105页,编辑于2022年,星期六三、三、gdb调试器调试器 运行程序,给程序加所需的执行条件。使程序在断点处暂停运行,并可继续运行。显示程序暂停时的状态信息。允许在暂停的程序中改变运行数据。程序运行出错后可以事后分析。支持远程调试。支持源码级调试。支持反汇编调试,可调试无源码的可执行文件。第82页,共105页,编辑于2022年,星期六1.Gdb的调试的调试过程过程串口接收程序test.c第83页,共105页,编辑于2022年,星

23、期六LinuxLinux环境下环境下test.ctest.c的的gdbgdb调试过程调试过程第84页,共105页,编辑于2022年,星期六2.Gdb远程远程调试调试 宿主机端 通讯系统 目标机端第85页,共105页,编辑于2022年,星期六宿主机端宿主机端 宿主机上运行gdb主程序。调试步骤为:设置目标机的类型、通讯断口及通讯协议 建立宿主机与目标机的连接,进行与本地调试相似的远程调试。第86页,共105页,编辑于2022年,星期六宿主机端宿主机端 gdb提供了target命令设置调试目标及其参数,建立连接,格式为:target TYPE PARAMETERSgdb的target命令支持多种类

24、型的调试目标设备。第87页,共105页,编辑于2022年,星期六宿主机端宿主机端 在使用串口建立连接之前,须使用Set命令设置串口的波特率。如:set remotebaud 9600 再使用target remote命令指定与目标机进行串口通信端口。如:target remote/dev/ttyS0第88页,共105页,编辑于2022年,星期六通讯系通讯系统统 硬件上:串口、并口、以太网口及红外等。软件上:专门定义的远程串行通信协议(RSP)。第89页,共105页,编辑于2022年,星期六调试信息数调试信息数据包据包 调试信息,开始用“$”符号作为标记,结尾用“#”符号。校验码,调试信息中所有

25、字符的ASCII码相加后取256的模。格式:$#第90页,共105页,编辑于2022年,星期六常用调试命令及常用调试命令及参数参数 g:查看CPU寄存器的值。G:设置CPU寄存器的值。maddr,count:从addr位置开始读count字节的数据。Maddr,count:从addr位置开始写count字节的数据。第91页,共105页,编辑于2022年,星期六常用调试命令及参常用调试命令及参数数 c/caddr:在当前位置继续执行程序或从addr开始。s/saddr:单步执行当前的指令,或者执行到指定的addr位置.k:杀掉target进程。?:打印出最近的信号值。T:允许目标机的stub发送

26、gdb需要的基本寄存器信息。第92页,共105页,编辑于2022年,星期六目标机端目标机端 目标机上嵌入式应用程序须预先加入了stub模块,由stub模块进行串口驱动,进行gdb远程串口通信协议的解析,完成与宿主机gdb的通讯。第93页,共105页,编辑于2022年,星期六目标机端目标机端第94页,共105页,编辑于2022年,星期六Stub种类种类 i386-stub.c:适用于Intel公司386系列及兼容处理器。m68k-stub.c:适用于Motorola公司68K系列处理器。sh-stub.c:适用于Hitachi SH结构的处理器。sparc-stub.c:适用于SPARC结构的处

27、理器。sparcl-stub.c:适用于Fujitsugongsi的SPARCLITE结构的处理器。第95页,共105页,编辑于2022年,星期六stub的基本结构在被调试应用程序的main()函数的开头插入两行代码:利用breakpoint()函数在程序中插入一个断点,使gdb获得控制权。以i386-stub.c文件为例:第96页,共105页,编辑于2022年,星期六Set_debug_traps()函数的源码如下:第97页,共105页,编辑于2022年,星期六Breakpoint()函数的源码如下:BREAKPOINT宏定义如下:第98页,共105页,编辑于2022年,星期六 系统接到中断

28、请求后,调用中断向量为3的中断处理函数,实现代码如下:第99页,共105页,编辑于2022年,星期六9.6 Windriver集成开发环境集成开发环境Tornado 内核配置程序WindConfig 装载器Loader 图形化的交叉调试器WDB 工程配置工具 集成仿真VxSim C/C+编译环境ObjectCenter 命令行执行工具WindSh 第100页,共105页,编辑于2022年,星期六Tornado 软件逻辑分析仪WindView 对象浏览器Browser 显示软件包ScopePak 性能检测包PerformancePak 代码测试器CodeTest 编辑工具Visual Slick

29、Edit for Tornado 第101页,共105页,编辑于2022年,星期六Workbench 第102页,共105页,编辑于2022年,星期六Tornado与与Workbench的的功能对比功能对比 表表表表9-2 Tornado9-2 Tornado与与与与WorkbenchWorkbench的功能的功能的功能的功能对对对对比比比比项目项目项目项目Tornado Tornado Workbench Workbench 工程管理工程管理基本的工程管理功能,对分级的工程支持有限,并基本的工程管理功能,对分级的工程支持有限,并需要手工修改需要手工修改makefilemakefile等,比较

30、麻烦等,比较麻烦支持任意工程的分级控制,采用简单的支持任意工程的分级控制,采用简单的“拖拉拖拉”方式就方式就可完成工程项目的分级构造,非常方便可完成工程项目的分级构造,非常方便工程项目工程项目支持可下载的工程项目和客户化的支持可下载的工程项目和客户化的VxWorksVxWorks工程项工程项目目增加了对系统引导工程项目、实时进程工程项目、文件增加了对系统引导工程项目、实时进程工程项目、文件系统工程项目、用户定制工程项目等的支持系统工程项目、用户定制工程项目等的支持编辑器编辑器功能比较简单,只能完成一般的编辑功能功能比较简单,只能完成一般的编辑功能具有语法分析功能,可以进行语法着色显示、符号定义

31、具有语法分析功能,可以进行语法着色显示、符号定义查找、符号补全、函数参数提示等功能,具有强大的符查找、符号补全、函数参数提示等功能,具有强大的符号查找和浏览能力号查找和浏览能力断点设置断点设置支持任务级断点和全局断点支持任务级断点和全局断点增加支持对处理器硬件断点等的支持,并且对各种断点增加支持对处理器硬件断点等的支持,并且对各种断点还提供多种控制手段还提供多种控制手段仿真环境仿真环境基本的基本的VxWorksVxWorks仿真环境,可以操作主机系统中的仿真环境,可以操作主机系统中的文件和网络访问文件和网络访问增强了仿真环境中的复杂组网功能,提供了调用主机系增强了仿真环境中的复杂组网功能,提供

32、了调用主机系统统APIAPI的能力,并可模拟中断信号的产生的能力,并可模拟中断信号的产生目标连接目标连接支持网络、串口等连接方式支持网络、串口等连接方式增加了对硬件仿真器的连接增加了对硬件仿真器的连接下载的代码量下载的代码量下载的目标代码一般在下载的目标代码一般在10MByte10MByte之内,超过之内,超过10MByte10MByte会出现下载速度慢,系统不稳定的问题会出现下载速度慢,系统不稳定的问题设计能力为可下载设计能力为可下载750MByte750MByte的目标代码,充分满足开的目标代码,充分满足开发和调试需要发和调试需要目标操作系统目标操作系统只支持只支持VxWorksVxWor

33、ks操作系统操作系统增加了对增加了对LinuxLinux操作系统的支持,并且还可以扩展到其操作系统的支持,并且还可以扩展到其它目标操作系统它目标操作系统目标系统数目目标系统数目单一的目标系统,同一个开发环境中同时只能建立单一的目标系统,同一个开发环境中同时只能建立一个连接,调试一种类型的单板一个连接,调试一种类型的单板可以同时进行多目标板、多可以同时进行多目标板、多CPUCPU体系结构的调试体系结构的调试多任务调试多任务调试不支持,每次只能挂接一个任务,或者进行系统级不支持,每次只能挂接一个任务,或者进行系统级调试调试支持,同时可挂接目标系统的多个任务或进程进行调试支持,同时可挂接目标系统的多

34、个任务或进程进行调试第三方工具第三方工具结构比较封闭,集成第三方工具比较困难结构比较封闭,集成第三方工具比较困难采用采用EclipseEclipse的开放架构,第三方工具容易集成,且资的开放架构,第三方工具容易集成,且资源丰富源丰富第103页,共105页,编辑于2022年,星期六9.7 仿真开发工具仿真开发工具ARMulator 指令集模拟器 仿真ARM处理器的体系结构和指令集,还可仿真存储器和外围设备。支持全部标准C库函数。通过Semihosting方式来实现程序中I/O功能。第104页,共105页,编辑于2022年,星期六ARMulator的的组成组成 ARM处理器核心模块 存储器模块。外设模块:中断控制器、定时器、看门狗、堆栈跟踪器、显示管。第105页,共105页,编辑于2022年,星期六

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁