數碼相冊——軟件框架
- 硬件平臺:韋東山嵌入式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頻繁失效,從而大大節約時間。