数码相册——软件框架
- 硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)
- 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统
- 参考资料:《嵌入式Linux应用开发手册》、《嵌入式Linux应用开发手册第2版》
- 开发环境:Linux 3.4.2内核、arm-linux-gcc 4.3.2工具链
- 源码仓库:https://gitee.com/d_1254436976/Embedded-Linux-Phase-3
一、前言
在日常的生活中,我们往往离不开手机,而手机中的相册也基本是每个人都会使用到的一个软件,不要小看这个相册,想要做出来、做的好也不是一件简单的事情。对于第一个应用层软件,我们做的就是基于Linux的数码相册。
一个软件的开发,离不开这四步:需求分析、框架设计、代码编写、软件测试。在这篇博文中,我先介绍关于这个应用的前两部分析。
二、需求分析
对比我们日常手机中使用的相册,功能如下:
- 显示图片
- 双指缩放图片
- 左右滑动移动图片
- 左右快速滑动切换图片
- 点击显示编辑菜单,根据编辑菜单的提示进行相关操作
而对于我们制作的基于Linux的在开发版中使用的数码相册,功能如下:
- 显示图片
- 上滑放大图片
- 下滑缩小图片
- 左右滑动移动图片
- 左右快速滑动切换图片
- 点击显示对话框:提示手动显示或自动显示
以上就是我们需要实现的功能。
三、框架设计
考虑到程序日后的拓展性、可移植性、方便修改的因素,故框架如下图所示:
(图片引用来源,在此基础上修改:https://blog.csdn.net/qq_36535963/article/details/89413420?utm_source=app)
整个框架分为两个进程:输入进程、显示进程,输入进程通过Socket与显示进程进行信息通信。
- 输入进程
1、按键线程:负责读取按键值、封装按键事件并对事件进行上报
2、ts(触摸屏)线程:负责调用tslib库读取触摸屏信息,封装事件并对事件进行上报
3、主控线程:负责收集按键线程与ts线程的事件,用socket发出信息给显示进程 - 显示进程
1、socket线程:接收输入进程发出的socket
2、当前图片线程:准备好当前图片信息
3、放大图片线程:准备好当前图片放大后的信息
4、缩小图片线程:准备好当前图片缩小后信息
5、下一幅图片线程:准备好下一幅图片的信息
6、上一幅图片线程:准备好上一幅图片的信息
7、主控线程:根据得到的事件,决定显示哪个信息
其中2~~6的线程,需要调用mmap
函数来进行内存的映射,当决定好显示那个线程的信息,则通过DMA把图片信息加载到Framebuffer中,供LCD显示。
—————————————————————————————————————————————
为什么采用mmap
而不用copy_to_user
,这个要从它们的工作原理出发:
(摘抄自【copy_to_user与mmap的工作原理】)
copy_to_user
在每次拷贝时需要检测指针的合法性,也就是用户空间的指针所指向的地址的确是一段该进程本身的地址,而不是指向了不属于它的地方,而且每次都会拷贝一次数据,频繁访问内存,由于虚拟地址连续,物理地址不一定会连续,从而造成CPU的CACHE频繁失效,从而使速度降低 。
mmap
仅在第一次使用时为进程建立页表,也就是将一段物理地址映射到一段虚拟地址上,以后操作时不再检测其地址的合法性(合法性交由CPU页保护异常来做);另一方面是内核下直接操作mmap地址,可以不用频繁拷贝,也就是说在内核下直接可用指针向该地址操作,而不再在内核中专门开一个缓冲区,然后将缓冲区中的数据拷贝一次进来。mmap
一般是将一段连续的物理地址映射成一段虚拟地址,当然,也可以将每段连续,但各段不连续的物理地址映射成一段连续的虚拟地址。无论如何,其物理地址在每段之中是连续的,这样一来,就不会造成CPU的CACHE频繁失效,从而大大节约时间。