基于嵌入式的TXT电子书阅读器的开发 毕业设计.doc
JIU JIANG UNIVERSITY 毕 业 论 文 题 目 基于嵌入式的TXT电子书阅读 器开发 英文题目 Development of TXT E-book Reader Based on Embedded 院 系 信息科学与技术学院 专 业 计算机科学与技术 姓 名 刘红刚 年 级 A081143 指导教师 于林峰 二一二年五月摘 要系统设计了基于嵌入式系统的TXT电子书阅读器,在飞凌FS2410硬件平台下,可以实现基本的阅读,对TXT格式电子书实现上下行以及翻页查看。主要的技术难点:如何将文字显示出来,实现多语言的支持,实现上下一行的翻动和上下页的翻动显示以及放大缩放字体显示,改变字体颜色。首先对基于嵌入式系统的TXT电子书阅读器的开发环境搭建和硬件系统平台做了简要的概述,并在现有的硬件平台下,详细讲述了构建嵌入式ARM-Linux开发系统的过程,整个过程是基于开发电子书阅读器的内容来阐述的。主要内容包括,交叉编译环境的搭建,U-Boot的移植与烧入,嵌入式Linux内核的裁剪和移植,TFTP服务环境的搭建,NFS网络文件传输环境的搭建,根文件系统的制作,SDL功能开发的研究,接下来也就是TXT电子书编码的实现,经过多次的调试以及优化,最后要将应用程序移植到开发板上的实验过程。关键词:嵌入式,阅读器,翻页AbstractSystem design a TXT reader based on embedded system, it can realise basic reading on the hardware platform of feiling FS2410, including the view for the txt format e-book as the way of up and down and page rotate.The main technic difficulties, that is how to show the txt on the screen with which method, how can realise mul-language support, how can realise the show of the pre,the next page and the pre line,the next line of txt, and change the color of font.It makes a brief overview of TXT reader based on the embedded system to make the development environmet and build the hardware platform on the first, then it makes a detailed introduction of the process of building a embedded ARM-Linux development system based on our existing hardware platform, and the all the description is based on the development of e-book. All the contents inclued building enviormen ofcross-compile, the transplantion and burnt of U-boot, cutting and transplantion of kernel, the structures of TFTP service enviorment, the buildings of NFS network file transfer environment, the production of root file system, the research of SDL development functions, the next process is realization of encode of e-book, which is tested and optimized constantly, porting the application to the board finally.Key words: Embedded, Electronic Reader, Page目 录摘 要IAbstractII1 绪论1.1系统概述(1)1.2 研究的意义和目的(1)1.3 国内外发展现状(1)1.4 发展趋势(2)1.5 本章总结(2)2 系统需求分析2.1 系统功能需求分析(3)2.2 系统硬件需求分析(4)2.3 系统软件需求分析(4)2.4 本章小结(6)3 嵌入式ARM-Linux环境建立3.1 基于Arm-Linux系统的总体设计(7)3.2 Arm-Linux交叉编译工具链的建立(8)3.3 U-boot的移植并烧入和烧入(8)3.4 Linux内核的裁剪与移植(10)3.5 根文件系统的制作与移植(12)3.6 NFS网络文件系统的建立(13)3.7 TFTP服务的配置(14)3.8 本章小结(15)4 系统设计4.1 系统概要设计(16)4.2 系统详细设计(17)4.3 软件运行环境(224.4 本章小结(22)5 系统实现5.1 系统关键技术(23)5.2 编码实现(25)5.3 本章小结(346 程序移植与验证6.1 移植需求(35)6.2 程序移植(35)6.3 程序验证(36)6.4 本章小结(38致 谢(39参考文献(401 绪论1.1系统概述本系统是设计一个基于嵌入式TXT的电子书阅读器功能开发1,实现在嵌入式系统上可以查看电子书的功能。硬件部分采用三星FS2410开发板2,网线。系统软件部分包括系统初始化程序U-boot3,Linux操作系统4,根文件系统5和一些运行应用程序所需要的库。应用软件就是开发的TXT电子书阅读器程序。基于SDL开发库进行开发6,首先将嵌入式Linux操作系统移植到基于ARM9核的FS2410的平台上。在嵌入式操作系统环境下,运行具有阅读TXT电子书功能的应用程序,实现对TXT电子书的基本阅读。1.2研究的意义和目的电子书阅读器将会带动阅读习惯、学习模式、内容创作及出版型态的改变,走向分众化、个人化、网络化及随身携带的行动智能信息发展,全方位的数字内容服务平台及商业模式也将应运而生,这些改变将带动许多新的服务产业,也会是未来其他新兴科技应用发展的典范。针对电子书阅读器的开发技术,不仅是限于各大公司之间的竞争,对个人也是挑战,本系统设计并实现了TXT电子书阅读器的功能,不仅要在嵌入式底层做好基础,而且还要在上层应用上开发阅读器。嵌入式系统可以有很灵活的特点,在本系统中只需要满足能让应用程序运行的要求,也可根据需求进行适当的改动。在上层应用开发上,电子书阅读器要能在嵌入式系统上实现上、下一行查看以及翻页查看功能以及放大缩小字体。1.3国内外发展现状随着数字阅读的方兴未艾,电子书市场风生水起,但国内外电子书发展市场,整体增势缓慢,电子书远没有达到普及的程度7。究其原因,不仅在电子书内容上没有达到服务用户的要求,而且在终端设施上也没有达到,另外,电子书在资源上混乱,没有形成一个完整的规划。然而面对电子书市场的巨大利润,国内外各大公司都在此方向寻生存机遇,在技术上,电子书阅读器并没有达到炉火纯青的地步,有很多的技术难题存在。1.4发展趋势尽管电子书现在已经到处可见,但是用户的需求是无止境的,伴随着硬件设施的不段改良,电子书会向着便捷,清爽,多元化,智能化的道路发展,打破传统纸质书的阅读习惯,有非纸质书不能比拟的优势。在未来的发展道路上,电子书很有可能会和移动3G相结合,达到书籍和网络的相结合,成为一项成熟的产业和技术,电子书普及到每个用户的手上。开发出高性能以及人性化的的阅读器,才能满足用户需求,达到用户所预期的效果。1.5本章总结首先对整个系统的硬件、系统软件以及应用程序做了一个简单的陈述,然后具体介绍了开发此系统的意义和目的。接下来分别介绍了电子书阅读器在国内外的发展现状以及未来的发展的趋势。面对电子书市场的巨大利润,开发高性能的电子书阅读器会是一项热门的技术。2 系统需求分析在进行可行性研究和项目开发计划以后,如果确认开发一个新的软件系统是必要的而且是可行的,那么就可进入需求分析阶段8。需求分析是指开发人员要理解用户的要求,进行详细的市场调查,确定系统的新目标。为了满足用户的需要,回答系统要“做什么”的问题。2.1 系统功能需求分析 随着数字电子技术的日益发展,电子书市场也愈演愈烈,面对巨大市场利润,各大公司纷纷投向电子书市场,电子书的应用将会普遍在普通市民中。本系统是开发出具有TXT功能的电子书阅读器,该阅读器主要功能有上下行查看,翻页查看,放大查看以及尽可能完成具有书签的电子书阅读器,然后将该应用程序移植到开发板上,能进行相应的阅读功能,其功能流程如图1-1所示。等待命令有按键否结束是有效按键否是左Ctrl右ctrl左Alt下键上键右键左键颜色退出放大下页上页下行上行图1-1 功能流程图2.2 系统硬件需求分析嵌入式系统开发与硬件平台紧密相连,没有硬件支持的嵌入式平台是不完整的,良好的硬件平台也为嵌入式系统应用软件的开发提供了许多便利,选择合适的硬件平台是一项复杂的工作。根据系统开发需求与实际情况结合,本系统采用的硬件平台是飞凌公司FS2410开发板2,处理器是SAMSUNG S3C24109,主频203MHz,存储器包括64M Bytes NAND FLASH(K9F1208),2M Bytes NOR FLASH (SST39VF1601),64M Bytes SDRAM,通过以太网控制芯片CS8900扩展了一个网口,另外通过50芯LCD接口引出了LCD控制器的全部信号。2.3 系统软件需求分析软件平台主要是BootLoader10,嵌入式操作系统,嵌入式文件系统以及一些在本电子书应用程序运行所要的库。(1)BootLoader是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。结合系统的需求并综合比较了各种BootLoader的优缺点,本系统选择了U-boot作为本系统的BootLoader。U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-boot不仅仅支持嵌入式Linux系统的引导,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。U-boot具有较高的可靠性和稳定性,高度灵活的功能设置。U-boot可以使用JTAG板直接烧写入Nor Flash中使用,也可以直接烧写入Nand Flash中运行。(2)嵌入式操作系统是嵌入式系统极为重要的组成部分。它提高了系统的可靠性、提高了开发效率,缩短了开发周期、充分发挥了32位CPU的多任务潜力。嵌入式操作系统的选择主要考虑其可移植性、可利用资源、系统定制能力和成本。综合对比了几种嵌入式操作系统,本系统选择了嵌入式Linux操作系统,它与其它嵌入式操作系统相比,Linux有以下特点: Linux系统是层次结构且内核完全开放。Linux是由很多体积小且性能高的微内核系统组成; 强大的网络支持功能; Linux具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,可以跨越嵌入式系统开发中仿真工具的障碍; Linux具有广泛的硬件支持特性。无论是RISC还是CISC、32位还是64位等各种处理器,Linux都能运行; Linux有装载和卸载程序的能力,所有应用程序以文件的形式被存放在闪存文件系统中并在必要的时候被装载到内存中,以节省RAM; Linux移植到新的微处理器体系非常快捷,一般是将其移植到一种新型的目标板,其中包含有独特的外设。(3)根据上面的分析本系统选择了Linux作为嵌入式操作系统,其支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等11,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS,为各类文件系统提供一个统一的操作界面和应用编程接口。 不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM和ROM,常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。本系统采用了busybox来制作yaffs的文件系统作为本系统的文件系统,其主要有一下特点: YAFFS12文件系统类似于JFFS/JFFS2,是专门为NAND闪存设计的嵌入式文件系统,适用于大容量的存储设备。它是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统一致性和完整性的影响。 YAFFS文件系统是按层次结构设计的,分为文件系统管理层接口、YAFFS内部实现层和NAND接口层,这样就简化了其与系统的接口设计,可以方便地集成到系统中去。与JFFS相比,它减少了一些功能,因此速度更快,占用内存更少。 YAFFS采用一种多策略混合的垃圾回收算法,结合了贪心策略的高效性和随机选择的平均性,达到了兼顾损耗平均和系统开销的目的。2.4 本章小结在这一章,主要做的工作就是进行系统需求分析,这一章在整个系统开发上起到了至关重要的作用,可以说是一个关键环节,这一章的分析调查结果直接指导以后的系统开发的工作,也直接关系着整个系统完成后的功能情况。在进行系统需求时,查阅了大量关于硬件和嵌入式操作系统方面的知识,综合各方面的因素,最终确定了选用的硬件平台和嵌入式操作系统,综合比较了各个系统之间的优点和不足,最终确定了系统的功能。3 嵌入式ARM-Linux环境建立绝大多数的软件开发都是本机开发、调试,本机运行的方式进行,但是这种方式不适合于嵌入式系统的软件开发,因为对于嵌入式系统的开发,它没有足够的资源在本机运行开发工具和调试工具。因此在宿主机上搭建一个好的开发环境是很关键的一步,它的成败直接影响下一步的进展。根据需求分析确定了系统的开发环境是嵌入式Linux操作系统。 3.1基于Arm-Linux系统的总体设计根据需求分析和嵌入式系统结构,得出了系统所需的系统结构如图3-1所示。应用程序嵌入式Linux操作系统,文件系统引导加载程序bootloaderFS S3C2410硬件平台图 3-1 系统结构图论文设计的嵌入式TXT电子书阅读器系统主要分为四个层次: (1)基于S3C2410A处理器的硬件平台:其中包括64MB 8位的NAND闪存和64MB32位的SDRAM; (2)加载程序BootLoader,主要初始化处理器及存储器等硬件设备; (3)Arm-Linux内核的裁剪、移植,文件系统的建立,以及运行应用程序所用到的库的添加; (4)应用程序的开发:主要包括对SDL的研究和相关代码实现并移植到开发板上。根据系统结构的设计,将分以下三个步骤实现,这一章只实现其中的前两步,其它的部分的实现在后续章节展开,实现步骤如下:(1)Arm-Linux交叉开发环境的建立;(2)嵌入式Arm-Linux的裁剪和移植:其中包括启动加载程序U-Boot的移植以及内核的裁剪、移植、文件系统的制作;(3)SDL的研究和编码实现;(4)应用程序的移植并测试。3.2 Arm-Linux交叉编译工具链的建立与主流软件开发相同,嵌入式系统开发同样需要用到编译器、链接器、解释程序、集成开发环境以及诸如此类的开发工具。但是在嵌入式系统开发中,由于执行应用程序的平台(目标机)与创建应用程序的平台(宿主机)并不兼容,因此,需要交叉开发工具进行交叉编译。本文采用工具链Arm-none-linux-gnueabi-创建Arm-Linux交叉编译环境13。建立过程如下:(1)登录Linux操作系统,然后再/home/farsight目录下新建toolchain目录; (2)将工具链toolchains_for_s3c2410.tar.bz2复制到以上toolchain目录下,并执行解压;(3)在宿主机中设置环境变量使得系统能自动调用已建立好的工具,具体的设置方法为:在根目录中打开/etc/profile文件添加交叉编译环境。具体设置方法为:vi /etc/profile,在文件的最后加上:export PATH=$PATH:/home/farsight/toolchain/bin最后保存退出,在终端输入source /etc/profile即可生效,在终端输入arm-none按Tabs键即可提示得到该交叉编译工具的名称。3.3 U-boot的移植并烧入和烧入针对FS2410开发板,对U-boot要进行一定的移植工作14,主要改动的地方有:(1)添加平台信息smdk2410是s3c2410的标准版,在smdk2410平台的基础上可以实现FS2410的移植; 进入U-boot所在目录下的board/samsung/,进行cp smdk2410 fs2410-a; 进入fs2410目录,进行mv smdk2410.c fs2410.c; 在Makefile下修改,将COBJS:=smdk2410 flash.o; 修改为COBJS:=fs2410 flash.o,进入U-boot目录下的include/configs目录,进行cp smdk2410.h fs2410.h,返回到顶层目录下的Makefile添加fs2410的内容。在smdk2410_config:unconfig下面添加对fs2410相应的信息:fs2410_config:unconfig$(MKCONFIG) $(:_config=)arm arm920t fs2410 samsung s3c24x0接着修改编译器,在ifeq($(HOSTARCH,$(ARCH) CROSS_COMPILE ?=endif下面添加 ifeq(arm,$(ARCH) CROSS_COMPILE = arm-none-linux-gnueabi- endif(2)针对fs2410平台要做出进一步的修改,主要做出的修改如下:修改start.S的中断屏蔽位,改为11个;修改配置文件include/configs/fs2410.h中的命令行提示符,网络配置参数,内核加载地址,Nand功能添加,环境变量的保存位置;在cpu/arm920t/start.S文件中对Nand启动进行修改,主要包括添加Nand启动标志位,添加BWSCON寄存器的定义,添加启动模式的判断;为nand启动做出支持;修改common/env_nand.c文件,添加nor flash环境变量烧写功能。修改后,编译U-boot,进行如下操作:$:make fs2410_config$:make 此时U-boot已经做编译好,在相应的U-boot目录下就可以看到u-boot.bin可执行文件,此可执行文件就可以实现烧录了。(3)利用H-jtag将u-boot烧写在fs2410开发板上的Nand flash上;(4)打开开发板,进入命令状态添加环境变量。$ setenv serverip 192.168.7.125$ setenv ipaddr 192.168.7.185$ setenv gatewayip 192.168.7.1$ setenv ethaddr 08:00:3e:26:0a:43$ setenv bootcmd tftp 30800000 uImage ; bootm$ setenv bootargs console=ttySAC0,115200 init=/linuxrc root=/dev/nfsnfsroot=192.168.7.130:/opt/filesystemip=192.168.7.190:192.168.7.130:192.168.7.1:255.255.255.0:farsight_30:eth0:off重启开发板,此时开发板就可以工作了。3.4 Linux内核的裁剪与移植嵌入式系统的硬件资源毕竟有限,不能直接将Linux操作系统作为嵌入式硬件平台上的操作系统,需要针对具体的应用进行内核的配置和裁减,使整个系统能够存放到容量较小的 Flash中。Linux的动态模块加载方式使 Linux的裁剪极为方便,高度模块化使得添加和删减非常容易。结合该系统在开发中所需要的功能,Linux内核的裁剪与移植过程中涉及到的目录有:include/ 、arch/ 、drivers/ 、fs/,移植的过程为:(1)在/home/farsight目录,将Linux源代码解压至该目录下,本设计用到的内核为Linux-2.6.35内核;(2)编译ARM-Linux内核,进入内核目录,在终端输入:make menuconfig;然后对内核进行裁剪和配置:(1)选择<*>System Type,选中该目录下的<*>ARM system type 模块,选中所用到的硬件平台信息,即Samsung S3C2410;(2)在以后的实验中需要用到网线,必须在内核中添加网卡的支持,在这一步中的操作如下。 将cs8900.c和cs8900.h文件拷贝到linux-2.6.35/drivers/net/arm目录下。 修改Linux-2.6.35/dirvers/net/arm/Kconfig文件,添加以下内容:Config S3C2410_CS8900Tristate “CS8900 support”Depends on NET_ETHERNET && ARM && ARCH_SMDK2410-help-Support for cs8900 chipset base Ethernet cards,if you have a network card of thistype 修改driver/net/arm/Makefile文件,对网卡进行支持,添加配置内容为:obj-$(CONFIG_S3C2410_CS8900) += cs8900.o 添加地址映射定义,修改arch/arm/mach/s3c2410/include/mach/map.h文件,添加如下内容:#define pSMDK2410_ETH_IO_phys_to_pfn(0x19000000)#define vSMDK2410_ETH_IO0xE0000000#define SMDK2410_ETH_IRQIRQ_EINT9 添加平台信息,修改arch/arm/mach-s3c2410-smdk2410.c文件,添加对平台信息的支持,其内容为: vSMDK2410_ETH_IO , pSMDK2410_ETH_IO ,SZ_1M,MT_DEVICE 配置内核,支持cs8900网卡。(3)LCD驱动也是必不可少的,具体的操作步骤如下: 在arch/arm/mach-s3c2410/mach-smdk2410.c中添加LCD参数设置,在本文件中的smdk2410_init函数中添加如下内容:S3c2410xx_fb_set_platdata(&s3c2410_fb_info); 配置内核,添加对LCD的支持。$ make menuconfigDevice Drivers- >Graphics support- >*Support for frame buffer devices- >*S3C2410 LCD framebuffer support(4)用make zImage指令编译生成内核镜像文件;(5)编译完毕后在arch/arm/boot 目录下将会生成ARM Linux内核镜像文件zImage,这就是我们将要下载到目标系统的内核文件,将其拷贝到tftpboot目录下,执行的命令为:cp arch/arm/boot/zImage /tftpboot3.5根文件系统的制作与移植(1)根文件系统介绍根文件系统不仅具有普通文件系统的存储数据文件的功能,它是内核启动时所mount的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。(2)根文件系统制作此处用到的根文件系统是busybox-1.17.3.tar.gz,进行解压并进入该目录。 首先要进行源码的一个安装,在目录有个_install,执行如下命令进行安装:$ make install 在安装完成后,进入到_install目录,创建一些要用到的目录,具体的目录创建如下:$ mkdir dev etc mnt proc var tmp sys root; 接着将工具链中的库需要拷贝到_install目录下,实现工具链的可用,其操作如下:$ cp /home/farsight/toolchain/arm-none-linux-gnueabi/lib ./; 接着要对库进行瘦身,删除lib目录下所有.o文件和.a文件,执行的如下命令:$ arm-none-gnueabi-strip lib/*; 最后要在添加系统启动文件,在etc下添加文件inittab文件,在etc下添加fstab文件。此时根文件系统已经制作完成,接着需要添加内核对根文件系统的支持。(3)添加内核的支持,具体配置如图3-2所示。图3-2 内核配置图(4)创建设备文件根文件系统中有一个设备节点是必须的,在dev目录下创建console节点,其具体操作为:$ mknod dev/console c 5 1(5)挂载测试将我们的文件系统拷贝到/opt/filesystem目录下,cp _install /opt/filesystem a,重新启动开发板,查看是否可以正常挂载。3.6 NFS网络文件系统的建立NFS网络文件系统可以使得系统调试开发更容易进行,只需要将经过交叉编译器编译之后生成的可执行文件通过NFS挂载到板子上为调试做好准备,避免反复的烧写可执行文件到FLASH中15,造成时间浪费和FlASH寿命的缩短。(1)安装NFS server端口映射和服务,首先需要下载相应的包,接着进行端口的映射,其命令如下:$ sudo apt-get install nfs-kernel-server nfs-common portmap$ sudo dpkg-reconfigure portmap,执行完后,在出现提示的时候,选定“不将 portmap 绑定在 loopback 地址”;(2)通过查看 /etc/default/portmap, 确保#OPTIONS="-i 127.0.0.1"前面的#号 被添加了,重启portmap服务:$ sudo /etc/init.d/portmap restart;(3)编辑/etc/exports文件,添加目标系统的根文件系统映射目录,此时需要将目标系统的根文件系统最后映射到/opt/filesytem,在/etc/exports文件的最后添加如下内容:/opt/filesystem *(subtree_check,rw,no_root_squash,async)(4)重启NFS服务,并更新,其执行的命令为:$ sudo /etc/init.d/nfs-kernel-server restart,接着进行的操作为:$ sudo exportfs a,执行完后此时就基本上可以实现NFS服务;(5)测试NFS服务,将主机上的共享目录mount到自己另外一个目录下,如:mount 192.168.0.125:/home/farsight/toolchain /mnt,然后查看/mnt目录下是否有/home/farsigh/toolchain目录下的文件,如果有的话,则NFS服务启动成功。3.7 TFTP服务的配置(1)TFTP16服务可以用来在开发板和主机之间进行传输内核,对TFTP服务的配置是必不可少的,具体配置如下:$ sudo mkdir /tftpboot$ cp uImage /tftpboot $ sudo chmod 777 /tftpboot -R$ sudo apt-get install tftp tftpd$ sudo apt-get install openbsd-inetd $ sudo vi /etc/inetd.conf在f文件中填入如下一行:tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot修改/etc/default/tftpd-hpa下的文件为如下内容:#Defaults for tftpd-hpaRUN_DAEMON="yes"OPTIONS="-l -s /tftpboot”$ sudo /etc/init.d/openbsd-inetd reload$ sudo /etc/init.d/openbsd-inetd restart(2) TFTP服务的测试进入内核目录下将已经编译好的内核镜像拷贝到tftp目录下,即/tftpboot。执行 cp arch/arm/boot/zImage /tftpboot进入/home/farsight目录,在终端输入 $ tftp 192.168.7.125,接着执行tftp> get zImage,如果tftp服务配置成功后会在当前目录下会看到zImage镜像文件了。3.8 本章小结一个好的嵌入式开发平台是进行后续开发的一个重要基础,它在整个嵌入式系统开发的过程中起着非常重要的作用。本章主要阐述了嵌入式ARM-Linux开发平台的搭建。具体的介绍了交叉编译工具链的建立,嵌入式Linux操作系统的裁剪和移植,U-boot制作与移植,以及网络文件系统、TFTP服务的搭建,为后续的开发以及调试打好基础。4 系统设计进入了系统设计阶段,要把软件“做什么”的问题变换成“怎么做”的问题。要将需求分析阶段生成后的文件做进一步的分析和精化。描述软件的总体体系结构,称为软件概要设计。然后对结构进一步细化,称为详细设计。本章主要介绍系统详细设计。4.1 系统概要设计软件总体结构的设计是概要设计关键的一步,直接影响到详细设计与编码的工作,所以要采用一定的设计方法,选取合理的设计方案。4.1.1 系统功能说明根据系统的需求分析,系统有不同的功能模块,主要包括的功能有:上下翻行显示、上下翻页显示、字体缩小以及放大显示和改变字体颜色。4.1.2 系统总体功能结构总体功能结构如图4-1所示。电子书阅读器上下翻行显示上下翻页显示放大字体缩小字体改变字体颜色图4-1 系统功能模块图4.2系统详细设计根据系统的需求分析,系统被分为两个不同的模块,一为命令模块,二为数据模块。在命令模块中主要利用SDL实现接收按键并将命令交给SDL后台。在数据模块包括:整个开发流程部分,创建窗口部分,编码解码部分,对接收的命令做出处理部分,命令处理部分包括上下行显示,上下页翻页显示,退出以及放大显示。在数据模块中的整体开发流程如图4-2所示。得到文件大小并申请空间语言编码初始化SDL初始化编码判断设置当前偏移创建主窗口解析文件编码准备命令等待图 4-2 整体开发流程图在主函数中的整体开发流程中的具体实现步骤和方法如下:(1)读出文件的大小,利用全局的文件大小变量以及Unicode编码大小变量,为变量申请相应的空间;(2)因开发中要用到SDL库,在利用函数库之前要对其进行初始化操作;(3)初始化语言编码指针,为编码解析做好准备;(4)判断文件所采用的编码方式;(5)根据文件的编码方式,若编码采用的非Unicode编码,则将字符编码转换为Unicode编码;若为Unicode编码,不进行转换;(6)设置文件的当前偏移量;(7)创建主窗口;(8)进入等待接受命令状态,进行相应的处理。文件编码判断模块的功能如图4-3所示。打开文件读取文件的前3个字节到临时区域判断该临时区域字符读到长度小于1读到长度只有一个前2个字节FF FE前2个字节FE FF前3个字节FF BB BF地方码的进一步检测空文件Gb18030编码Unicode编码Unicode大端码Utf-8编码地方语言码 判断结束图4-3 编码检测流程图检测编码类型主要是根据文件头部的前3个字节来判断,根据每种编码头的规定来得到文件的编码方式。在窗口创建模块的具体实现步骤和方法如下:(1)创建窗口之前首先设置窗口的宽度以及高度;(2)利用load_image()函数来装载背景,将背景存放在一个指针中。在该函数中利用了SDL库支持的IMG_Load()函数真正来装载背景图片,然后采用SDL_DisplayFormat()函数进行格式转换图片优化,将优化后的图片返回作为最后的背景资源;(3)利用SDL库中支持的TTF_OpenFont()函数装载所用的字