第三阶段应用层——1.1 数码相册—软件框架

数码相册——软件框架

  • 硬件平台:韦东山嵌入式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频繁失效,从而大大节约时间

猜你喜欢

转载自blog.csdn.net/weixin_42813232/article/details/106797691