三、基於Cortex-A8和ZigBee技術的智能家居監控系統的設計與實現

Qt應用程序部署到ARM板上,需滿足幾個條件:

1、移植U-boot,並且能啓動Linux內核

2、移植Linux內核,Linux 內核要能成功掛載根文件系統

3、構建根文件系統

4、移植Qt應用程序所需的庫文件到根文件系統下並配置好的環境參數,如果Qt應用程序使用了觸摸事件,還需移植觸摸屏庫tslib

本篇簡單介紹U-boot移植、Linux kernel移植、根文件系統的構建和移植Qt到ARM板上。

詳細請參考:

朱有鵬老師U-boot和系統移植課程和課件

《ARM Cortex-A8實戰演練》--網蜂團隊 傾力打造


一. U-Boot(Universal Boot Loader)移植

(1).選擇合適的U-Boot

U-Boot 來自何方?

U-Boot( Universal Boot Loader),最初是由一個德國人發起的項目,然後在整個Network上由存在共同興趣愛好的小夥伴一起維護,在SourceForge是開源的一個Project。

U-Boot的用處是什麼?

主要作用有如下幾點:
1、操作系統的kernel由U-Boot來啓動。
2、整個計算機系統的部署。
3、操作板子上硬盤的drive等。
3、提供一個友好的命令行界面供用戶操作

U-Boot移植選擇方案

1、三星官方網站移植U-Boot
2、U-Boot標準的官方網站移植

本系統設計選擇第一種方案,主要考慮到如下幾點:
(1)、從U-Boot官方移植,對於一個還沒有多少工作經驗的人來說是件相當困難的事,複雜性很強,需要更改的地方有很多,沒有一定的相關工作經驗是很難搞定的。
(2)三星已經把s5pv210這款CPU移植到U-Boot上了,所以如果以效益性來說,完全沒有多少必要性去做重複且複雜性很高的工作,當然,如果只是爲了學習,增強自身功力,那就另當別論。

(2).U-Boot啓動過程分析

U-Boot分爲兩個啓動階段

一、第一階段

第一階段主要是做一些跟CPU相關的Initialize工作,比如一些硬件的Initialize等。因爲跟硬件相關很大,考慮到效率的問題,所以這部分的代碼主要是用匯編寫的。
這一階段的代碼一般運行的Flash中,因爲是位置無關碼,所以在任何位置上都可運行。

第一階段主要負責的任務主要有如下的五點:
1、一些硬件設備相關的初始化,包括關Interrupt、關Watchdog、設置clock frequency和CPU的工作speed、關閉處理器Internal Command 和數據Cache、configure  SDRAM 存儲控制器及 IO等。
2、加載 Bootloader第二階段的代碼,爲其準備enough的 RAM 空間。
3、將 Bootloader 第二階段的代碼copy到 RAM 裏面去。
4、設置堆棧
5、跳轉到第二階段的 C 函數入口地址。

二、第二階段

考慮到代碼的移植性和可讀性,而且需要完成很複雜的功能,所以第二階段的代碼一般會使用C語言來寫。

第二階段主要負責的任務主要有如下的五點:
(1)、Initialize第二階段要使到的硬件device(如serial、Flash 和網卡等)。
(2)、系統內存映射的檢測。
(3)、將kernel image從 Flash 中讀取到 RAM 空間裏(用戶沒有干預的情況下)。
(4)、設置kernel的需要的一些啓動參數。
(5)、最後,調用kernel。

二. Linux內核(kernel)移植

(1).選擇合適的Linux內核(kernel)版本

Linux操作系統發展到現在,Linux kernel版本不斷更新,越來越多的CPU加入到了Linux kernel源碼中,使得Linux kernel越來越複雜。選擇合適的Linux kernel版本,不僅能減輕工作量,而且還能提高Linux kernel運行效率。

選擇Linux kernel版本有如下幾個因素需要考慮:
(1)、很多人都喜歡追求新的東西,總覺得越新的東西越好,但是有時並非越新越好;如果選擇的Linux kernel版本過於新,可能會適得其反,影響kernel運行效率,因爲新的版本加載了很多你的內核不需要的功能和文件,如果把它們運行起來,可能會拖慢kernel。
(2)、選擇SoC 廠商移植過的Linux kernel版本會減少很多不必要的工作量。

本系統設計選擇移植2.6.35.7版本Linux kernel。

(2).Linux kernel的子系統

Linux kernel主要由如下五大子系統構成:
(1)、進程調度(SCHED);
(2)、內存管理(MM);
(3)、虛擬文件系統(Virtual File System ,VFS);
(4)、網絡接口(NET);
(5)、進程間通信(IPC);

(3).Linux kernel啓動過程分析

Linux kernel啓動過程可以分爲如下四個階段:
一、第一階段:內核自解壓階段;
二、第二階段:內核引導階段;
三、第三階段:內核初始化階段;
四、第四階段:Busy Box初始化階段;

推薦參考文章http://www.linuxidc.com/Linux/2014-10/108034.htm

(4). 移植Linux kernel

移植Linux內核需要六個流程步驟:
第一步: 從Linux kernel官方網站http://www.kernel.org獲取源碼;
第二步:修改Linux kernel;
第三步:配置Linux kernel;
第四步:檢查串口,如果串口不對,就不能看到kernel輸出的調試信息,也就很難跟蹤和調試kernel;
第五步:拷貝uImage製作工具(mkimage);
第六步:編譯kernel,並且處理出錯信息;


三. 製作根文件系統

(1).根文件系統是什麼?根文件系統有哪些類型?

所謂的“根”,其實就是基礎的意思,所以根文件系統可以理解爲最基礎的文件系統。根文件系統其實是一種特殊的文件系統。文件系統是是一套軟件,由一些C語言代碼構成,存儲設備的扇區就是由這套軟件來管理的,如果要訪問存儲設備的扇區,只需要訪問目錄和文件名就可以了,因爲目錄跟文件名是關聯起來的,文件系統會將其變爲對扇區號的訪問。如何區分不同的文件系統,主要在於它們對扇區管理的策略和方法不一樣(如對扇區的壞塊管理和碎片管理)。

根文件系統的類型有很多種。以下列出了一些常用的文件系統格式:
1、FAT32
2、NTFS
3、EXT2
4、EXT3
5、JFFS2
6、YAFFS2
7、NFS
8、等等

(2).移植BusyBox

BusyBox簡介

BusyBox融合很多UNIX下的工具,是一個開源項目,遵循GPL v2協議。BusyBox相比GNU,BusyBox去掉很多GNU下的功能和參數選項,不過,BusyBox減少的這些功能和參數選項在嵌入式系統中並不常使用,所以可以滿足絕大部分的嵌入式系統使用。

如何獲取BusyBox源碼

BusyBox既然是一個開源項目,當然就可以在網絡下載到。打開BusyBox 的官方網站
http://www.busybox.net/ ,找到“Download Source”,然後選擇一個版本進行下載,版本差異並不大,所以對版本的要求不高。

移植busybox主要有四個步驟:

第一步:解壓下載到的BusyBox到一個目錄下
第二步:配置 BusyBox
第三步:編譯 BusyBox
第四步:安裝 BusyBox

(3).構建根文件系統

安裝好 Busybox後,打開其安裝目錄,可以看到有 usr/bin、usr/sbin、bin、sbin 等目錄,構建完整的根文件系統還需要六個重要目錄,分別爲 lib/、dev/、etc/、proc/、sys/和 tmp/。
構建lib目錄:根文件系統要用到一些加載器和動態庫文件。所以在根文件系統中的lib/和 usr/lib/目錄下需要這些文件。
構建dev目錄:這個目錄用來存放設備文件 
構建 etc目錄::需要在其目錄下添加四個文件併爲其添加內容,分別爲inittab、init.d/rcS、fstab 和 profile
構建proc/、sys/和tmp/目錄: /proc 目錄用來掛載proc文件系統,/sys 目錄用來掛載sys文件系統,/tmp 目錄用來掛載tmp 文件系統

(4).構建NFS文件系統

NFS(Network File System),一種網絡文件系統。NFS文件系統跟其它文件系統不同的是,NFS文件系統不需要“燒寫”,在調試系統的時候非常方便,只需要保證主機跟開發板在同一個局域網內,然後用NFS的方式啓動開發板,主機上Linux裏的根文件系統目錄就會掛載到你的開發板上,不管是修改開發板上的根文件系統還是Linux下的根文件系統,都能夠同步更新修改的內容。 
構建NFS文件系統之前需要安裝NFS服務器,並配置好一些參數。U-Boot中NFS的參數也要進行相應的修改。

(5).製作ext2格式的根文件系統

在Linux在創建一個目錄rootfs,然後在命令行下逐步輸入
dd if=/dev/zero of=rootfs.ext2 bs=1024 count=204800
losetup  /dev/loop1 rootfs.ext2
mke2fs -m 0 /dev/loop1 204800
mount -t ext2 /dev/loop1 ./rootfs/
之後打開rootfs/目錄,裏面就會有一個lost+found目錄.完成根文件系統的構建,我們還需要在rootfs/目錄中,添加相關的一些文件和目錄。

最後執行命令
umount /dev/loop1
losetup -d /dev/loop1
卸載掉,鏡像就做好了。

《參考資料:http://blog.csdn.net/zhengmeifu/article/details/24174513

四. Qt簡介和移植

(1).Qt是什麼?

Qt是一個可以跨平臺的應用程序,Qt爲用戶提供了豐富多樣的 UI 開發框架。用戶開發的應用程序,只需要一次性開發好,不需要重新編寫源代碼,便可以部署應用程序在不同桌面和嵌入式操作系統中。
Qt的特點有如下四個:
(1)、直觀的 C++ 類庫
(2)、跨桌面和嵌入式操作系統的移植性
(3)、具有跨平臺 IDE 的集成開發工具
(4)、在嵌入式系統上的高運行時間性能,佔用資源少

(2).將Qt移植到ARM開發板上

Linux下或者Windows下編寫的Qt應用程序,移植到ARM開發板上部署,需要滿足如下條件:
(1)、在ARM開發板部署的Qt應用程序,使用到觸摸事件,需要移植觸摸屏庫tslib到ARM開發板上。
(2)、編譯安裝嵌入式ARM版的Qt,編譯安裝好後,在其安裝目錄下,將一些Qt lib庫文件複製到ARM開發板目錄下,然後設置開發板環境變量參數。
(3)、ARM開發板部署的Qt應用程序需要字體支持,在Linux下安裝好的嵌入式ARM版Qt目錄下,將字體文件複製到ARM開發板上,最後設置好開發板環境變量參數。

QT安裝和移植參考資料:

ARM Cortex-A8實戰演練
http://blog.csdn.net/marc07/article/details/64123329


一、基於Cortex-A8和ZigBee技術的智能家居監控系統的設計與實現

二、基於Cortex-A8和ZigBee技術的智能家居監控系統的設計與實現

四、基於Cortex-A8和ZigBee技術的智能家居監控系統的設計與實現


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