第三階段應用層——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工具鏈

目錄


一、前言

  在日常的生活中,我們往往離不開手機,而手機中的相冊也基本是每個人都會使用到的一個軟件,不要小看這個相冊,想要做出來、做的好也不是一件簡單的事情。對於第一個應用層軟件,我們做的就是基於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頻繁失效,從而大大節約時間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章