<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于Linux的嵌入式GUI研究與應(yīng)用

          基于Linux的嵌入式GUI研究與應(yīng)用

          作者: 時(shí)間:2012-03-24 來(lái)源:網(wǎng)絡(luò) 收藏

          1.引言

          指在嵌入式系統(tǒng)中為特定的硬件設(shè)備或者環(huán)境而設(shè)計(jì)的圖形用戶界面系統(tǒng)。它極大地方便了非專業(yè)用戶的使用,人們不再需要死記硬背大量的命令,而可以通過(guò)窗口、菜單方便地操作。在實(shí)際應(yīng)用中,應(yīng)滿足輕型、占用資源少、高性能、高可靠性、可配置等基本要求。

          作為一種可裁減的操作系統(tǒng),兼容多種主流CPU且支持所有的文件系統(tǒng)和網(wǎng)絡(luò)服務(wù),并具備源代碼公開(kāi)、易于定制、穩(wěn)定、功能強(qiáng)大和易開(kāi)發(fā)等優(yōu)點(diǎn),是發(fā)展未來(lái)嵌入式設(shè)備的絕佳資源。

          2.在嵌入式系統(tǒng)上的實(shí)現(xiàn)
          2.1系統(tǒng)引導(dǎo)

          系統(tǒng)上電或者復(fù)位后,將對(duì)系統(tǒng)硬件設(shè)備進(jìn)行自檢,無(wú)錯(cuò)誤則將硬盤(pán)0磁道的第一個(gè)扇區(qū),即MBR中的BootLoader調(diào)至內(nèi)存0x07C00處,并將控制權(quán)交給BootLoader[1]。BootLoader通常是一段匯編代碼,存放在MBR中,作用是將系統(tǒng)啟動(dòng)代碼讀到內(nèi)存中。目前可選用的引導(dǎo)工具主要有GRUB和LILO,這里我們選用主流的GRUB,由于選用的存儲(chǔ)介質(zhì)是CF卡,格式化CF卡后建立GRUB安裝目錄,按照提示安裝GRUB后,在 /etc目錄下新建grub.conf文件,內(nèi)容如下:
          default=0
          timeout=5
          title-2.4.34
          root(hd0,0)
          kernel/boot/vmlinuz-2.4.34roroot=/dev/hdc1
          其中root(hd0,0)指定了/boot所在的分區(qū),kernel一行用來(lái)指定Linux的內(nèi)核,及/所在的分區(qū)。

          2.2內(nèi)核配置、編譯及裁減

          內(nèi)核是Linux操作系統(tǒng)的核心,它負(fù)責(zé)管理系統(tǒng)進(jìn)程和進(jìn)程調(diào)度等大小事務(wù),決定著系統(tǒng)的性能和穩(wěn)定性,其它應(yīng)用程序都必須通過(guò)它才可以使用系統(tǒng)資源,獲取系統(tǒng)服務(wù)。由于嵌入式硬件資源的限制,我們需要對(duì)Linux內(nèi)核進(jìn)行定制,精簡(jiǎn)出符合實(shí)際需要的最小內(nèi)核文件。
          首先在www.kernel.org上獲取相應(yīng)的內(nèi)核包,解壓后進(jìn)行配置,然后根據(jù)目標(biāo)板的硬件特點(diǎn)和實(shí)際需求配置內(nèi)核的編譯選項(xiàng)。這里我們選用基于X86 架構(gòu)的PC104主板,為了減低不必要的復(fù)雜性,內(nèi)核中取消kernelmodule支持,將有關(guān)CPU類型、內(nèi)存管理、doc驅(qū)動(dòng)、ext2文件系統(tǒng)支持、串口支持等常用功能編譯進(jìn)內(nèi)核,SCSI、Floppy之類的外設(shè)在我們的嵌入式系統(tǒng)中沒(méi)有使用,編譯時(shí)可去掉。這樣實(shí)際編譯出的內(nèi)核只有 747.6KB。基本步驟如下[2]:
          #cd/usr/src/linux//內(nèi)核包所在目錄,這里下載的內(nèi)核包版本是2.4.34
          #makemrproper//確保源代碼目錄下沒(méi)有不正確的.o文件以及文件的相互倚賴關(guān)系
          #makemenuconfig//圖形界面下編譯選項(xiàng)配置

          #makedep//確保關(guān)鍵文件在正確位置
          #makeclean//確保所有有關(guān)文件都處于最新版本狀態(tài)
          #makebzImage//編譯內(nèi)核
          #cp/usr/src/linux/arch/i386/bzImage/mnt/cf/boot//將內(nèi)核文件拷貝至boot

          2.3根文件系統(tǒng)實(shí)現(xiàn)

          Linux 的根文件系統(tǒng)以樹(shù)的結(jié)構(gòu)方式組織,主要由配置文件、設(shè)備文件、Linux基本命令、基本C語(yǔ)言庫(kù)組成。后兩者是主要的,也是占空間最大的,用 Busybox和uClibc的組合夠建這兩部分內(nèi)容,可以大大節(jié)省空間。根據(jù)根文件系統(tǒng)的基本結(jié)構(gòu),我們建立各個(gè)對(duì)應(yīng)的目錄:
          #mkdirprocdevbinbootboot/grubetcsrclib//由于是單用戶系統(tǒng),刪除了root、home、sbin目錄
          #cp–r/dev/null/dev/mem…/mnt/cf/dev//拷貝所需設(shè)備文件

          最后需要在etc目錄下建立幾個(gè)配置文件,分別是/etc/inittab、/etc/init.d/rcS、/etc/fstab,限于篇幅,僅介紹inittab文件,內(nèi)容如下[4]:
          ::sysinit:/etc/init.s/rcS//指定初始化文件
          ::askfirst:/bin/sh//啟動(dòng)時(shí)執(zhí)行的shell
          ::respawn:/bin/getty38400ttyS0//打開(kāi)一個(gè)串口,波特率為38400
          ::restart:/bin/init//重啟時(shí)執(zhí)行進(jìn)程init
          ::ctrlaltdel:/bin/reboot//捕捉特定按鍵動(dòng)作
          ::shutdown:/bin/umount–a–r//關(guān)機(jī)時(shí)動(dòng)作,卸載所有文件系統(tǒng)

          3.研究
          3.1基于嵌入式Linux的GUI系統(tǒng)底層實(shí)現(xiàn)基礎(chǔ)

          一個(gè)能夠兼容多硬件平臺(tái)的嵌入式GUI系統(tǒng),應(yīng)至少抽象出兩類設(shè)備:基于圖形顯示設(shè)備(如VGA卡)的圖形抽象層 GAL(GraphicAbstractLayer)和基于輸入設(shè)備(如鍵盤(pán),觸摸屏等)的輸入抽象層 IAL(InputAbstractLayer)[3]。抽象層的概念類似Linux內(nèi)核虛擬文件系統(tǒng)的概念,它定義了一組不依賴于任何特殊硬件的抽象接口,所有頂層的圖形操作和輸入處理都建立在抽象接口上,而用于實(shí)現(xiàn)該抽象接口的底層代碼稱為“圖形引擎”或“”,類似操作系統(tǒng)中的驅(qū)動(dòng)程序,這實(shí)際是一種面向?qū)ο蟮某绦蚪Y(jié)構(gòu)。利用該抽象接口,嵌入式GUI可以非常方便的移植到其他POSIX系統(tǒng)上,只需要根據(jù)抽象層接口實(shí)現(xiàn)新的引擎即可。

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: Linux 嵌入式GUI 輸入引擎

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();