基于嵌入式的TXT电子书阅读 - 图文

更新时间:2023-03-08 10:05:08 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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电子书编码的实现,经过多次的调试以及优化,最后要将应用程序移植到开发板上的实验过程。

关键词:嵌入式,阅读器,翻页

I

信息科学与技术学院学士学位论文

Abstract

System 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

II

信息科学与技术学院学士学位论文

目 录

摘 要 ..................................................... I Abstract .................................................. II 1 绪论

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)

III

信息科学与技术学院学士学位论文

3.6 NFS网络文件系统的建立 .............................. (13) 3.7 TFTP服务的配置 ..................................... (14) 3.8 本章小结 ............................................ (15) 4 系统设计

4.1 系统概要设计 ........................................ (16) 4.2 系统详细设计 ........................................ (17) 4.3 软件运行环境 ......................................... (22 4.4 本章小结 ............................................ (22) 5 系统实现

5.1 系统关键技术 ........................................ (23) 5.2 编码实现 ............................................ (25) 5.3 本章小结 ............................................. (34 6 程序移植与验证

6.1 移植需求 ............................................ (35) 6.2 程序移植 ............................................ (35) 6.3 程序验证 ............................................ (36) 6.4 本章小结 ............................................. (38 致 谢 ................................................... (39 参考文献 ................................................. (40

IV

信息科学与技术学院学士学位论文

1 绪论

1.1系统概述

本系统是设计一个基于嵌入式TXT的电子书阅读器功能开发[1],实现在嵌入式系统上可以查看电子书的功能。

硬件部分采用三星FS2410开发板[2],网线。

系统软件部分包括系统初始化程序U-boot[3],Linux操作系统[4],根文件系统[5]和一些运行应用程序所需要的库。

应用软件就是开发的TXT电子书阅读器程序。

基于SDL开发库进行开发[6],首先将嵌入式Linux操作系统移植到基于ARM9核的FS2410的平台上。在嵌入式操作系统环境下,运行具有阅读TXT电子书功能的应用程序,实现对TXT电子书的基本阅读。

1.2研究的意义和目的

电子书阅读器将会带动阅读习惯、学习模式、内容创作及出版型态的改变,走向分众化、个人化、网络化及随身携带的行动智能信息发展,全方位的数字内容服务平台及商业模式也将应运而生,这些改变将带动许多新的服务产业,也会是未来其他新兴科技应用发展的典范。

针对电子书阅读器的开发技术,不仅是限于各大公司之间的竞争,对个人也是挑战,本系统设计并实现了TXT电子书阅读器的功能,不仅要在嵌入式底层做好基础,而且还要在上层应用上开发阅读器。嵌入式系统可以有很灵活的特点,在本系统中只需要满足能让应用程序运行的要求,也可根据需求进行适当的改动。在上层应用开发上,电子书阅读器要能在嵌入式系统上实现上、下一行查看以及翻页查看功能以及放大缩小字体。

1.3国内外发展现状

随着数字阅读的方兴未艾,电子书市场风生水起,但国内外电子书发展市场,

1

信息科学与技术学院学士学位论文

整体增势缓慢,电子书远没有达到普及的程度[7]。究其原因,不仅在电子书内容上没有达到服务用户的要求,而且在终端设施上也没有达到,另外,电子书在资源上混乱,没有形成一个完整的规划。然而面对电子书市场的巨大利润,国内外各大公司都在此方向寻生存机遇,在技术上,电子书阅读器并没有达到炉火纯青的地步,有很多的技术难题存在。

1.4发展趋势

尽管电子书现在已经到处可见,但是用户的需求是无止境的,伴随着硬件设施的不段改良,电子书会向着便捷,清爽,多元化,智能化的道路发展,打破传统纸质书的阅读习惯,有非纸质书不能比拟的优势。在未来的发展道路上,电子书很有可能会和移动3G相结合,达到书籍和网络的相结合,成为一项成熟的产业和技术,电子书普及到每个用户的手上。开发出高性能以及人性化的的阅读器,才能满足用户需求,达到用户所预期的效果。

1.5本章总结

首先对整个系统的硬件、系统软件以及应用程序做了一个简单的陈述,然后具体介绍了开发此系统的意义和目的。接下来分别介绍了电子书阅读器在国内外的发展现状以及未来的发展的趋势。面对电子书市场的巨大利润,开发高性能的电子书阅读器会是一项热门的技术。

2

信息科学与技术学院学士学位论文

2 系统需求分析

在进行可行性研究和项目开发计划以后,如果确认开发一个新的软件系统是必要的而且是可行的,那么就可进入需求分析阶段[8]。

需求分析是指开发人员要理解用户的要求,进行详细的市场调查,确定系统的新目标。为了满足用户的需要,回答系统要“做什么”的问题。

2.1 系统功能需求分析

随着数字电子技术的日益发展,电子书市场也愈演愈烈,面对巨大市场利润,各大公司纷纷投向电子书市场,电子书的应用将会普遍在普通市民中。

本系统是开发出具有TXT功能的电子书阅读器,该阅读器主要功能有上下行查看,翻页查看,放大查看以及尽可能完成具有书签的电子书阅读器,然后将该应用程序移植到开发板上,能进行相应的阅读功能,其功能流程如图1-1所示。

左键 上行 下行 上页 下页 放大 颜色 退出 右键 上键 下键 左Alt 右ctrl 左Ctrl 等待命令 否 有按键 是 否 结束 有效按键 是 图1-1 功能流程图

3

信息科学与技术学院学士学位论文

2.2 系统硬件需求分析

嵌入式系统开发与硬件平台紧密相连,没有硬件支持的嵌入式平台是不完整的,良好的硬件平台也为嵌入式系统应用软件的开发提供了许多便利,选择合适的硬件平台是一项复杂的工作。

根据系统开发需求与实际情况结合,本系统采用的硬件平台是飞凌公司FS2410开发板[2],处理器是SAMSUNG S3C2410[9],主频203MHz,存储器包括64M Bytes NAND FLASH(K9F1208),2M Bytes NOR FLASH (SST39VF1601),64M Bytes SDRAM,通过以太网控制芯片CS8900扩展了一个网口,另外通过50芯LCD接口引出了LCD控制器的全部信号。

2.3 系统软件需求分析

软件平台主要是BootLoader[10],嵌入式操作系统,嵌入式文件系统以及一些在本电子书应用程序运行所要的库。

(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的多任务潜力。

嵌入式操作系统的选择主要考虑其可移植性、可利用资源、系统定制能力和成

4

信息科学与技术学院学士学位论文

本。综合对比了几种嵌入式操作系统,本系统选择了嵌入式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的文件系统作为本系统的文件系统,其主要有一下特点:

① YAFFS[12]文件系统类似于JFFS/JFFS2,是专门为NAND闪存设计的嵌入式文件系统,适用于大容量的存储设备。它是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统一致性和完整性的影响。

② YAFFS文件系统是按层次结构设计的,分为文件系统管理层接口、YAFFS内部实现层和NAND接口层,这样就简化了其与系统的接口设计,可以方便地集

5

信息科学与技术学院学士学位论文

成到系统中去。与JFFS相比,它减少了一些功能,因此速度更快,占用内存更少。

③ YAFFS采用一种多策略混合的垃圾回收算法,结合了贪心策略的高效性和随机选择的平均性,达到了兼顾损耗平均和系统开销的目的。

2.4 本章小结

在这一章,主要做的工作就是进行系统需求分析,这一章在整个系统开发上起到了至关重要的作用,可以说是一个关键环节,这一章的分析调查结果直接指导以后的系统开发的工作,也直接关系着整个系统完成后的功能情况。在进行系统需求时,查阅了大量关于硬件和嵌入式操作系统方面的知识,综合各方面的因素,最终确定了选用的硬件平台和嵌入式操作系统,综合比较了各个系统之间的优点和不足,最终确定了系统的功能。

6

信息科学与技术学院学士学位论文

3 嵌入式ARM-Linux环境建立

绝大多数的软件开发都是本机开发、调试,本机运行的方式进行,但是这种方式不适合于嵌入式系统的软件开发,因为对于嵌入式系统的开发,它没有足够的资源在本机运行开发工具和调试工具。因此在宿主机上搭建一个好的开发环境是很关键的一步,它的成败直接影响下一步的进展。根据需求分析确定了系统的开发环境是嵌入式Linux操作系统。

3.1基于Arm-Linux系统的总体设计

根据需求分析和嵌入式系统结构,得出了系统所需的系统结构如图3-1所示。

引导加载程序bootloader 应用程序 嵌入式Linux操作系统,文件系统

FS S3C2410硬件平台 图 3-1 系统结构图

论文设计的嵌入式TXT电子书阅读器系统主要分为四个层次:

(1)基于S3C2410A处理器的硬件平台:其中包括64MB 8位的NAND闪存和64MB32位的SDRAM;

(2)加载程序BootLoader,主要初始化处理器及存储器等硬件设备; (3)Arm-Linux内核的裁剪、移植,文件系统的建立,以及运行应用程序所用到的库的添加;

(4)应用程序的开发:主要包括对SDL的研究和相关代码实现并移植到开发板上。

根据系统结构的设计,将分以下三个步骤实现,这一章只实现其中的前两步,其它的部分的实现在后续章节展开,实现步骤如下:

7

信息科学与技术学院学士学位论文

(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的移植;

8

信息科学与技术学院学士学位论文

① 进入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

9

信息科学与技术学院学士学位论文

$ setenv ethaddr 08:00:3e:26:0a:43

$ setenv bootcmd tftp 30800000 uImage \\; bootm

$ setenv bootargs console=ttySAC0,115200 init=/linuxrc root=/dev/nfs nfsroot=192.168.7.130:/opt/filesystem

ip=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_CS8900

Tristate “CS8900 support”

10

信息科学与技术学院学士学位论文

Depends on NET_ETHERNET && ARM && ARCH_SMDK2410 ---help---

Support for cs8900 chipset base Ethernet cards,if you have a network card of

this type

③ 修改driver/net/arm/Makefile文件,对网卡进行支持,添加配置内容为:obj-$(CONFIG_S3C2410_CS8900) += cs8900.o

④ 添加地址映射定义,修改arch/arm/mach/s3c2410/include/mach/map.h文件,添加如下内容:

#define pSMDK2410_ETH_IO #define vSMDK2410_ETH_IO

__phys_to_pfn(0x19000000) 0xE0000000

#define SMDK2410_ETH_IRQ IRQ_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 menuconfig

Device Drivers---- >

Graphics support--- >

[*]Support for frame buffer devices--- >

[*]S3C2410 LCD framebuffer support

11

信息科学与技术学院学士学位论文

(4)用make zImage指令编译生成内核镜像文件;

(5)编译完毕后在arch/arm/boot 目录下将会生成ARM Linux内核镜像文件zImage,这就是我们将要下载到目标系统的内核文件,将其拷贝到tftpboot目录下,执行的命令为:cp arch/arm/boot/zImage /tftpboot

3.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所示。

12

信息科学与技术学院学士学位论文

图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=\127.0.0.1\前面的#号 被添加了,重启portmap服务:$ sudo /etc/init.d/portmap restart;

(3)编辑/etc/exports文件,添加目标系统的根文件系统映射目录,此时需要将目标系统的根文件系统最后映射到/opt/filesytem,在/etc/exports文件的最后添加如下

13

信息科学与技术学院学士学位论文

内容:/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)TFTP[16]服务可以用来在开发板和主机之间进行传输内核,对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

在inetd.comf文件中填入如下一行:tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot

修改/etc/default/tftpd-hpa下的文件为如下内容: #Defaults for tftpd-hpa RUN_DAEMON=\OPTIONS=\s /tftpboot”

$ sudo /etc/init.d/openbsd-inetd reload $ sudo /etc/init.d/openbsd-inetd restart

(2) TFTP服务的测试

14

信息科学与技术学院学士学位论文

进入内核目录下将已经编译好的内核镜像拷贝到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服务的搭建,为后续的开发以及调试打好基础。

15

信息科学与技术学院学士学位论文

4 系统设计

进入了系统设计阶段,要把软件“做什么”的问题变换成“怎么做”的问题。要将需求分析阶段生成后的文件做进一步的分析和精化。描述软件的总体体系结构,称为软件概要设计。然后对结构进一步细化,称为详细设计。本章主要介绍系统详细设计。

4.1 系统概要设计

软件总体结构的设计是概要设计关键的一步,直接影响到详细设计与编码的工作,所以要采用一定的设计方法,选取合理的设计方案。 4.1.1 系统功能说明

根据系统的需求分析,系统有不同的功能模块,主要包括的功能有:上下翻行显示、上下翻页显示、字体缩小以及放大显示和改变字体颜色。 4.1.2 系统总体功能结构

总体功能结构如图4-1所示。

电子书阅读器 上下翻行显示 上下翻页显示 放大字体 缩小字体 改变字体颜色

图4-1 系统功能模块图

16

信息科学与技术学院学士学位论文

4.2系统详细设计

根据系统的需求分析,系统被分为两个不同的模块,一为命令模块,二为数据

模块。在命令模块中主要利用SDL实现接收按键并将命令交给SDL后台。在数据模块包括:整个开发流程部分,创建窗口部分,编码解码部分,对接收的命令做出处理部分,命令处理部分包括上下行显示,上下页翻页显示,退出以及放大显示。

在数据模块中的整体开发流程如图4-2所示。

准备 解析文件编码 得到文件大小并申请空间 设置当前偏移 SDL初始化 创建主窗口 语言编码初始化 命令等待 编码判断

图 4-2 整体开发流程图

在主函数中的整体开发流程中的具体实现步骤和方法如下:

(1)读出文件的大小,利用全局的文件大小变量以及Unicode编码大小变量, 为变量申请相应的空间;

(2)因开发中要用到SDL库,在利用函数库之前要对其进行初始化操作; (3)初始化语言编码指针,为编码解析做好准备; (4)判断文件所采用的编码方式;

(5)根据文件的编码方式,若编码采用的非Unicode编码,则将字符编码转换为Unicode编码;若为Unicode编码,不进行转换;

17

信息科学与技术学院学士学位论文

(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()函数装载所用的字体,返回值作为存放字体的指针变量;

18

信息科学与技术学院学士学位论文

(4)利用apply_surface()将背景填充到屏幕,此函数中调用SDL库支持的位填充函数SDL_BlitSurface()来实现该功能;

(5)将文字显示到屏幕上。此部分是最重要部分之一,主要思想为,设置好当前偏移为0,将文件中的所有字符保存到临时区,将字体和字利用TTF_RenderGlyph_Blended()函数组合成一体,最后调用SDL_BlitSurface()函数将组合后的字符装载到屏幕中,如果是遇到文件结尾,则下一页的偏移设置为当前偏移即可,若是屏幕结尾,则设置好下一行以及下一页的偏移;

(6)利用库函数中的SDL_Flip()函数更新屏幕显示,即可将字显示到屏幕上并做相应的更新,窗口创建模块功能如图4-4所示。

开始 将背景填充到屏幕 初始化窗口宽度和高度 填充文字到屏幕 装载背景 屏幕更新 装载字体 进入命令等待状态

图4-4 窗口创建模块流程图

在SDL窗口创建成功之后,窗口利用轮询机制来接收发送过来的消息,此接收机制同样采用的方法是利用了SDL函数库,此函数是SDL_PollEvent(&event),,其中的按键对应的是SDL库中的命令,如果当有按键按下时,要根据按键的类型进行区别,即event.type。

当按键类型是SDL_KEYDOWN时,在此利用到的几个按键分别对应: (1)SDLK_UP,即方向键中的向上键,显示上一页; (2)SDLK_DOWN,即方向键中的向下键,显示下一页; (3)SDLK_LEFT,即方向键中的向左键,显示上一行;

19

信息科学与技术学院学士学位论文

(4)SDLK_RIGHT,即方向键中的向右键,显示下一行; (5)SDLK_LCTRL,即空格左边键左边的Ctrl键,退出程序; (6)SDLK_LALT,即空格左边的Alt键,放大显示。

如果按键类型是SDL_QUIT时,则进行退出操作,和按空格左边Alt键的功能一样,命令模块功能如图4-5所示。

创建窗口 向上键按下 向下键按下 轮询接收命令 向左键按下 向右键按下 Alt键按下 左Ctrl键按下

图 4-5 命令模块流程图

上一行显示 上一行显示 上一行显示 上一行显示 字体放大或缩小 退出

编码解析模块功能如图4-6所示。

图4-6 编码格式转换流程图

完成 转换为Unicode Unicode编码 准备 Gb18030 取得编码方式 Utf-8 Utf-16 否 ISO8859-1 是 不需格式转换 Gb2312

20

信息科学与技术学院学士学位论文

根据编码标准,所有的字符集若要正确显示出来,都必须将非Unicode编码格式转换为Unicode编码。根据得出的字符集编码方式,如果是Unicode编码,不要进行转换。在非Unicode编码的情况下再继续判断,如果是Utf-8编码,进行单独的转换,否则对相应的语言编码进行相应的编码转换,该转换都是对相应的编码二进制表将其读取。

根据Utf-8的字符编码的规定,Utf-8编码的转换步骤和方法如下:

(1)在ASCII码范围内的字符,即小于0x80的字符编码,可直接支持显示,不用进行编码的解码;

(2)在0x80到0x7FF的范围内,要Utf-8编码形式为高字节为110xxxxxx,低字节为10xxxxxx,将高字节中的110抽去,低字节的10抽去,最后剩下的就是Unicode编码;

(3)在0x800到0x7FFF的范围内,Utf-8的编码形式为1110xxxx 10xxxxxx 10xxxxxx,用同样的方法将Utf-8前端的标示符抽去,剩下的经过组合成Unicode编码。

总体来说,在非Unicode编码中只有Utf-8编码有规律可找,其他编码形式都要经过查表来进行解码。

在接收到命令后,可以向上翻页,向下翻页,上一行,下一行,其实现原理类似,分析向下行显示,功能实现流程如图4-7所示。

接收到右键 填充背景到屏幕 设置当前偏移量 否 是 当前偏移>0 设置下一页下一行的偏移量 传送字符串到屏幕 刷屏 设置上一页上一行的偏移 图4-7 下一行显示流程图

21

信息科学与技术学院学士学位论文

当系统接收到向下行显示的命令后,具体的实现步骤如下: (1)填充背景到屏幕;

(2)设置当前偏移为下一行偏移,画出下一行; (3)判断是否到屏幕末以及文件末; (4)设置下一行下一页的偏移; (5)设置上一行上一页的偏移; (6)刷新屏幕。

4.3 软件运行环境

为了保证系统运行的可靠性,对于软件的运行环境具有一定的要求。软件的运行环境分为硬件环境和软件环境。

(1)硬件开发环境 PC机

处理器:基于ARM920T内核的S3C2410处理器 内存: 64MB以上 FS2410 开发板 (2)软件环境

Ubuntu Linux10.04操作系统 Windows 98/2000/XP操作系统(可选) 嵌入式Linux开发环境

4.4 本章小结

系统设计是每个系统的灵魂所在,这一章主要阐述系统的功能设计,通过对系统设计的两个功能模块,即命令模式功能和数据模式功能,数据模块功能可以基本从大局上掌握系统的框架。系统设计这是整个系统的核心,它直接展示了系统的功能实现方法和原理以及整个系统的控制流。

22

信息科学与技术学院学士学位论文

5 系统实现

5.1系统关键技术

实现TXT电子书阅读器的开发,主要用到的技术就是SDL,SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发函数库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函式,让开发者只要用相同或是相似的程序码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。 5.1.1 SDL的功能

(1)视频

可设置8bpp或更高的任意色彩深度的视频模式。如果某个模式硬件不支持,可以选择转化为另一模式,支持可以直接写入线性的图像帧缓冲(framebuffer),用颜色键值(colorkey)或者alpha混合属性创建surface,将surface显示到屏幕上。

Surface的blit能自动的转化为目标格式。blit是优化过的,并能使用硬件加 速。x86平台上有针对MMX优化过的blit,硬件加速的blit和fill(填充)操作,如果硬件支持的话。

(2)事件

当应用程序的visibility发生改变的事情,主要检测到的事件主要有:键盘输入 、和鼠标输入,当用户要求的退出的时候调用SDL_QUIT() 函数实现退出应用程序,每种事件都能通过SDL_EventState()关闭或者打开,事件经由用户指定的过滤函数再被加入到内部的事件队列,可支持线程安全的事件队列。

(3)音频

可以设置8位和16位的音频,单声道或者立体声,如果格式硬件不支持,可以选择进行转换,由独立的线程执行音频部分,并提供用户回调(callback)机制。

23

信息科学与技术学院学士学位论文

设计上考虑到了客户定制的软混音器,但实际上在例程中就包含了一个完整的音频/音乐输出库。

(4)CD音频

具有完整的CD音频控制API。 (5)线程

简单的线程创建API ,可用于同步的简单的二进制信号量(semaphores)。 (6)定时器

可读取已流逝的毫秒数或等待指定的毫秒数,可支持设置一个10毫秒精度的周期性定时器。

(7)字节序无关

侦测当前系统的字节序 ,快速转换数据的函数,读写指定字节序的数据。 SDL支持的系统如下: (1)Linux

视频显示使用X11,利用XFree86 DGA扩展的优势,全屏显示使用新的w MTRR加速,声音使用OSS API,使用clone()系统调用和SysV IPC,或者glibc-2.1的pthreads实现线程。

(2)Win32

有两个版本,一个是适合所有基于Win32的系统的安全版本,另一个是基于DirectX的高性能版本,安全版本的视频显示采用GDI。高性能版本采用DirectDraw,并可支持硬件加速,安全版本的音频回放采用waveOut API。高性能版本采用DirectSound。

(3)BeOS

视频显示采用Bwindow,音频回放采用BSoundPlayer API。 5.1.2 SDL开发基本介绍

(1)初始化库

24

信息科学与技术学院学士学位论文

调用SDL_Init()动态的加载和初始化SDL库,该函数带有一组标记来表示哪部分需要激活:SDL_INIT_AUDIO 、SDL_INIT_VIDEO、SDL_INIT_CDROM、SDL_INIT_TIMER,或者是采用SDL_INIT_EVERYTHNG,在使用完毕SDL最后调用SDL_Quit()函数来完成退出操作。

(2)视频

简便的选择和设置视频模式,可实现在屏幕上绘制像素,该功能主要可以通过直接写入图形帧缓冲(framebuffer)和调用屏幕更新函数来绘制屏幕并刷新,另外也可以实现加载和显示图片的功能。在SDL中只提供了SDL_LoadBMP()函数以及SDL_BlitSurface()函数将图片blit进图形帧缓冲,从而显示图片,SDL_BlitSurface()自动对blit矩形进行裁边,blit矩形在调用SDL_UpdateRects()时被用作更新屏幕变化了的部分。

(3)事件

SDL中支持的事件主要包括等待事件和事件轮询,前者等待事件采用的调用函数为SDL_WaitEvent();而在事件轮询中调用SDL_PollEvent()函数可实现对按键以及鼠标事件输入的轮询判断。

5.2 编码实现

编码的实现主要包括主函数实现、字符编码的解码实现、TXT主窗口的创建、等待命令、翻页显示等。 5.2.1 主函数的实现

主函数是整个程序的灵魂,涵盖了主要的设计思路,其主要设计思路为: (1)读取电子书的大小,分配相应的空间;

(2)分析传入的参数是否合理,设置放大率,旋转和偏移量; (3)初始化有关SDL资源; (4)语言编码初始化;

(5)根据文件得到字符集编码格式;

25

信息科学与技术学院学士学位论文

(6)读取文件流到结构体中,保存相应的参数; (7)将字符集编码转换为统一编码格式,并保存; (8)设置好当前偏移,进入SDL主窗口。 其主要代码如下:

int main(int argc, char **argv)

{

if (get_text_len(argv[1]) < TEXT_BUF_LEN_8M ) // 得到文件长度 { }

if ( (pos=get_space(TEXT_LEN)) == -1) { }

return -1;

// 申请空间

ret = process_arg(argc, argv); //实现对传入参数进行分析,可实现放大倍数设置 ret = sdl_init(); convert_init_local(); unicode_nchar = 0;

file_type = get_file_type_from_name(argv[1]); // 得到文件名,主要为了可支持

// 进行有关SDL有关的初始化操作 // 进行编码的初始化

其他文件格式的文件

charset = DetectCharSet(argv[1]); if(argc == 5) { }

pgtxt->fp = fopen(argv[1], \

// 得出文件的字符集编码格式

strcpy((char *)pgtxt->path, argv[1]);

get_file_name_from_path((char *)pgtxt->name, argv[1]);

if(charset == CHAR_SET_UNICODE || charset == CHAR_SET_UNICODE_BE)

26

信息科学与技术学院学士学位论文

{ } else {

len = fread(buf_text, 1, TEXT_LEN, pgtxt->fp); fclose(pgtxt->fp);

//为Utf-8编码格式的情况

//非Unicode编码

len = fread(buf_unicode, 1, UNICODE_LEN, pgtxt->fp); unicode_nchar = len/2;

if(charset == CHAR_SET_UTF8) { }

pgtxt->charset = CHAR_SET_UTF8;

unicode_nchar = utf8_to_unicode(buf_text, (unsigned short *)buf_unicode, len);

// 其他情况

else { }

pgtxt->charset = charset;

nicode_nchar = local_to_unicode(buf_text, (unsigned short *)buf_unicode, len);

pgtxt->buf = (unsigned char *)buf_unicode; pgtxt->unicode_len = unicode_nchar * 2;

if(pgtxt->cur_offset > pgtxt->unicode_len || pgtxt->cur_offset < 0)

pgtxt->cur_offset = 0;

pgtxt->cur_offset=pgtxt->cur_offset/2*2;

else

while(1) { }

27

s_table[cur_state].enter(NULL); // 进入到主窗口函数

信息科学与技术学院学士学位论文

}

5.2.2 字符编码解码的实现

return 0;

字符编码解码部分是整个开发中核心的,也是难点之处,如何从缓冲区中正确解析字符出来,是整个系统的关键之处,因涉及到的字符编码比较多,常见的编码有Utf-8编码,gb18030编码,big5编码,iso-8859编码体系,Unicode编码,如果文件所采用的编码格式本身就是Unicode编码,那么不需要进行编码解析就能直接正确读取数据出来,而非Unicode编码时,分2种情况来分析,一种是针对Utf-8编码体系的,因该编码可以找到规律,故分开来对待,其他的编码体系都是相似的解码方法,都是从编码体系-Unicode编码表中查询得到。

Utf-8编码和Unicode编码的对应关系如表5-1所示。

表 5-1 Utf-8 Unicode关系表

Utf-8编码 0xxxxxxx 110xxxxx 10xxxxxx 1110xxxxx 10xxxxxx 10xxxxxx Unicode编码 0x00 ~ 0x7F 0x80 ~ 0x7FF 0x8FF ~ FFFF 根据以上表中给出的Utf-8与Unicode的关系,以下是对Utf-8字符集编码的解析的主要代码。

int Utf8ToUnicode(uint8_t* src, uint16_t * punicode) {

if(0 == (src[0] & 0x80)){

// 单字节

*punicode = (uint16_t)src[0]; return 1; }

if(0xC0 == (src[0] & 0xE0) &&

28

信息科学与技术学院学士学位论文

0x80 == (src[1] & 0xC0)){

// 双字节

*punicode = (uint16_t)((((uint16_t)src[0] & 0x001F) << 6) | ((uint16_t)src[1] & 0x003F)); return 2; }

if(0xE0 == (src[0] & 0xF0) && 0x80 == (src[1] & 0xC0) && 0x80 == (src[2] & 0xC0)){

// 三字节

*punicode = (uint16_t)((((uint16_t)src[0] & 0x000F) << 12) | (((uint16_t)src[1] & 0x003F) << 6) | ((uint16_t)src[2] & 0x003F)); return 3; } return 0; }

主要的实现思想,就Utf-8编码的三种情况,一个字节的情况下直接转换为

Unicode编码,若是两个字节,将字节头去掉,三个字节和两个字节的处理方法相似,只要处理其字节头。 5.2.3 TXT主窗口实现

TXT主窗口是整个系统设计的难点,运用到了SDL库开发,电子书翻页以及行的处理,其主要设计思想为:

(1)初始化TXT窗口,即设置窗口大小; (2)装载背景图片; (3)装载字体; (4)创建窗口;

(5)进入循环,接受命令。 其主要代码如下:

29

信息科学与技术学院学士学位论文

{ }

5.2.4 命令循环实现

if(buf_text) { }

init_text_rect();

free(buf_text); buf_text = NULL;

int main_window_enter(void *data)

// 初始化窗口的宽度和高度

// 装载背景图片

background = load_image(PIXMAP_BACKGROUND);

font = TTF_OpenFont(DEFAULT_TTF_PATH, font_table[pgtxt->zoom]); if(window_free) { } goon = 1;

main_window_loop(); return 0;

// 命令接收函数

txt_main_window_create(); window_free = 0;

// 创建主窗口函数

命令循环用于接收输入命令执行响应的操作,利用了等待时间机制来接收命令

的输入,根据传的命令来进行相应的操作,包括上、下行,上、下一页查看以及方法查看,其主要代码如下: {

static void main_window_loop()

SDL_Event event;

30

信息科学与技术学院学士学位论文

while(goon)

{

if( SDL_PollEvent( &event ) ) {

if( event.type == SDL_KEYDOWN ) {

process_key(event.key.keysym.sym);

// 若是按键按下

// 利用轮询机制检测事件的到来

}

else if( event.type == SDL_QUIT ) {

process_back(); } } } }

static void process_key(int keyval) {

switch(keyval)

{

case SDLK_UP:

process_page_up(); break;

// 显示上一页

case SDLK_DOWN:

process_page_down(); break;

// 显示下一页

case SDLK_LEFT:

process_line_up(); // 显示上一行

31

信息科学与技术学院学士学位论文

break;

case SDLK_RIGHT:

process_line_down(); break;

// 显示下一行

case SDLK_LCTRL:

process_back(); break;

// 退出应用程序

case SDLK_LALT:

process_zoom(); break;

// 放大显示字体

case SDLK_RALT:

process_zoom_small(); break;

// 改变字体颜色

// 缩小显示字体

case SDLK_RCTRL:

if(color_id >= COLOR_MAX) { } else{ }

txt_main_window_free(); main_window_update();

// 屏幕刷新

color_id++; color_id = 0;

default: break;

} }

32

信息科学与技术学院学士学位论文

5.2.5 翻页显示

因有上下翻页,上下行显示,上下翻页原理是一样的,其主要思想就是不断改变当前的偏移为上、下页的偏移或者是相应的上、下行的偏移,最后更新窗口。以下为向下翻页的代码:

static void process_page_down() {

apply_surface( 0, 0, background, screen,NULL );

pgtxt->cur_offset = pgtxt->next_page_offset; // 设置当前的偏移为下一页的偏移 draw_string_down(font,(Uint16*)(buf_unicode+pgtxt->cur_offset),&text_rect,textC

olor,screen,&cct,&end_flag,1);

if(end_flag == SCREEN_END) { }

if(end_flag == FILE_END) { }

if(pgtxt->cur_offset >= 0) {

draw_string_up(font,(Uint16*)(buf_unicode+pgtxt->cur_offset-2),(Uint16*)buf_uni

//设置前一页以及前一行偏移

pgtxt->next_page_offset = pgtxt->next_line_offset = pgtxt->cur_offset;

// 已经到文件结束

pgtxt->next_page_offset = pgtxt->cur_offset + 2*(cct.page_char_count); pgtxt->next_line_offset = pgtxt->cur_offset + 2*(cct.line_char_count);

// 已经到屏幕结束

code,&text_rect,textColor,screen,&cct,&end_flag,0);

}

pgtxt->pre_page_offset = pgtxt->cur_offset - 2*(cct.page_char_count); pgtxt->pre_line_offset = pgtxt->cur_offset - 2*(cct.line_char_count);

33

信息科学与技术学院学士学位论文

SDL_Flip( screen ); }

5.2.6 字体放大显示

// 刷新屏幕

字体的放大显示和缩小显示的方法类似,下面为字体放大显示的主要代码。 void process_zoom() {

}

if(pgtxt->zoom >= 11)

pgtxt->zoom = 0;

// 总共设置的字体大小为12个

else

pgtxt->zoom++;

// 关闭当前的字体

TTF_CloseFont( font ); //Open the new font size

font = TTF_OpenFont(DEFAULT_TTF_PATH, font_table[pgtxt->zoom]); txt_main_window_free(); main_window_update();

// 释放当前主窗口 // 更新主窗口

5.3 本章小结

SDL知识点是整个开发过程必不或缺的,真个开发都是基于SDL库来开发的,

了解SDL基本概念和功能是整个程序开发首要也是最重要的条件。本章从SDL的概念首先出发,讲述了什么是SDL,SDL的功能,简单讲述了SDL的基本开发模版,然后详细介绍了整个编码的思想,包括主函数中主要开发流程、TXT主窗口的创建思想,根据命令接收分别进行上下翻页,上下行翻行,退出,改变字体颜色,以及放大、缩小字体等操作。

34

信息科学与技术学院学士学位论文

6 程序移植与验证

6.1 移植需求

移植程序与测试是整个过程的最后的环节,也是至关重要的一个环节,决定了

系统是否能运行在开发板上,是否可以进行电子书的阅读。在进行移植程序之前有必要对程序的移植做个移植需求分析,可以避免在移植过程中出现一些没必要的疏忽。

TXT电子书阅读器开发是基于SDL的开发,在运行程序时需要相应的库支持,

需要用到的库有如下:

libsdl1.2-dev,

libsdl-image1.2-dev,

libsdl-mixer1.2-dev,libsdl-ttf2.0-dev, libsparsehash-dev, libsdl-gfx1.2-dev libvorsidec_dev_1.0.2

移植程序到开发板上时需要用到的主要硬件是网线。

6.2 程序移植

将以上的库添加到根文件系统中 $ cp libsdl1.2-dev

/opt/filesystem/lib

$ cp libsdl-image1.2-dev /opt/filesystem/lib $ cp libsdl-mixer1.2-dev /opt/filesystem/lib $ cp libsdl-ttf2.0-dev /opt/filesystem/lib $ cp libsparsehash-dev $ cp libsdl-gfx1.2-dev

/opt/filesystem/lib /opt/filesystem/lib

$ cp libvorsidec_dev_1.0.2 /opt/filesystem/lib

为了验证阅读器功能是否可以正常运行,采用了利用网络文件传输协议将阅读器程序挂载的方式,而不是将程序进行烧录。

将程序拷贝到虚拟机上:

35

本文来源:https://www.bwwdw.com/article/t0c3.html

Top