第一章 基礎篇 第一章基礎篇 1-1 Linux 入門 Linux 究竟是什麼? 用最簡單的話說,Linux 是一個作業系統 它是一位赫爾辛基大學學生 Linus Torvalds(Linux 是 Linus's UNIX 的縮寫 ) 在 1991 年 10 月創造的 Linux 本身實

Size: px
Start display at page:

Download "第一章 基礎篇 第一章基礎篇 1-1 Linux 入門 Linux 究竟是什麼? 用最簡單的話說,Linux 是一個作業系統 它是一位赫爾辛基大學學生 Linus Torvalds(Linux 是 Linus's UNIX 的縮寫 ) 在 1991 年 10 月創造的 Linux 本身實"

Transcription

1 第 1 章基礎篇 Linux 入門 Linux 系統開發簡介 第 2 章 實驗篇 實驗一嵌入式 Linux 開發環境建立及核心編譯運作實驗 實驗二嵌入式 Linux 根檔案系統的製作實驗 實驗三嵌入式 Linux 驅動程式添加實驗 實驗四嵌入式 Linux 下彩色 LCD 驅動的設計與實現 實驗五 USB HOST 掛載實驗 實驗六嵌入式 Linux 下的音效實驗 實驗七 10M/100M 網路通訊實驗 實驗八 WEB SERVER 網頁伺服器實驗 實驗九瀏覽器取用外部 Internet 實驗 實驗十 CCD 攝影機拍攝實驗 實驗十一 Qt/Embedded 嵌入式圖形開發實驗 附錄一 Qt 圖形系統開發 附錄二出廠值設定

2 第一章 基礎篇 第一章基礎篇 1-1 Linux 入門 Linux 究竟是什麼? 用最簡單的話說,Linux 是一個作業系統 它是一位赫爾辛基大學學生 Linus Torvalds(Linux 是 Linus's UNIX 的縮寫 ) 在 1991 年 10 月創造的 Linux 本身實際上只是其核心 ; 它實現了多工和多用戶功能, 管理硬體, 分配記憶體並且使應用程式能夠運作 對於任何一種作業系統, 普通用戶絕對沒有足夠的興趣去瞭解如核心內部細節這樣的內容 只有真正致力於此的人, 那些放棄個人生活或受雇做這種工作的人, 才願意探索這些複雜的東西 但即使您從未親身深入研究過核心, 那麼也別擔心, 您可以很容易地雇用一家承包商或公司來為您做這項工作 ; 要對一個專有系統進行這樣的修改常常較困難, 花費也比較大 對於初學者, 有關核心要記住的最重要的事是 : 帶奇數的核心版本 ( 即 等 ) 是實驗性的開發版核心 穩定的發行版核心的版本號是偶數 ( 即 等 ) 典型的 Linux 發行版包含 Linux 核心, 但還包含許多應用程式和工具 總體說來,Linux 發行版中出現的許多系統級別和用戶級別的工具都來至自由軟體基金會 (Free Software Foundation) 的 GNU 專案 (GNU 是 GNU's Not UNIX" 的縮寫 ) Linux 核心和 GNU 工具套件都在 GNU 通用公共許可證 (GNU General Public License,GNU GPL) 下發行 如果您還不熟悉 GNU GPL, 那麼理解它的最佳方法就是 1

3 DMA270 Linux 操作流程 去閱讀它 冒著可能會遺漏某些重要方面的風險, 這樣概括 GNU GPL: 它是一種使電腦程式碼可自由使用的方式, 使用其程式碼的用戶可隨意使用和實驗它 我們極力推薦 Linus Torvalds 以前的同事 Lars Wirzenius 所寫的一篇很有趣的對 Linux 歷史的概括 Linux Online 提供中立的 Linux 新聞和資訊 還可查看這些有用的 Linux 鏈結, 由 Linux at IBM" 的研究人員彙編 Linux at IBM 的 Linux Line 提供有關合作夥伴的新聞 Linux 學習資源 成功案例和新的進展, 所有這些都是 IBM Linux 所關注的 IBM Linux 技術中心 (IBM Linux Technology Center) 直接與 Linux 社區協同工作 ; 它的網站跟蹤 IBM 對 Linux 以及相關的開發社區作出的貢獻 UNIX 和 Linux 有什麼不同? UNIX( 此名稱是源自以前的 Multics" 作業系統 ) 於 1969 年在 AT&T 貝爾實驗室被創造出來, 它是一種健壯的 靈活的和對開發人員友好的計算環境 儘管 UNIX 最初是為 Digital Equipment Corporation(DEC) 的 PDP 微型電腦系列編寫的, 但它卻成為最受歡迎的多用戶通用作業系統, 並已在所有計算領域, 甚至包括曾一度被大型機器壟斷的領域佔據主導地位 UNIX 和 IBM IBM 在 Linux 和 UNIX 領域 ( 以及許多其他領域 ) 都有支持 要瞭解有關 IBM UNIX 的更多資訊, 請參閱頁面 IBM High Performance Computing IBM 產品與服務頁提供了指向硬體和軟體 支援 諮詢等內容的鏈結 要瀏覽 IBM 站點, 請取用 IBM 主頁 歷經 20 多年的發展,UNIX 已經開始至少在某些領域被 Linux 超越 Linux 不是 UNIX; 它只是非常像 UNIX 對於有些任務, 您需要 Linux, 對於其他任務, 您仍需要 UNIX UNIX 和 Linux 可以在一起非常協調地工作, 編寫得好的程式可以非常容易地在這兩個系統之間進行移植 有關 UNIX 在 IBM(UNIX at IBM) 的更多資訊, 請參閱下面一些站點 在軟體方面, 您可以瞭解有關 IBM 的 AIX 5L UNIX 作業系統的更多資訊 2

4 第一章 基礎篇 從誕生至今,IBM 一直被公認是世界一流的硬體供應商 請查看 IBM pseries UNIX 電腦中提供的新功能特性, 主旨在是這些電腦運作 Linux 的能力和運作 UNIX 一樣強大 IBM 開發者園地門戶網站為用戶提供最佳實踐和技巧 特別地,IBM eserver 開發者園地有介紹硬體和軟體的文章 產品幫助和參考資料, 所涉及的 IBM 伺服器硬體從基於 Intel 的機器到大型機器, 軟體從 Linux 和 UNIX 到 z/os, 一應俱全 z/os UNIX 系統組有一頁介紹由 IBM 員工以及由社區開發的免費 UNIX 工具和小玩意 要瞭解有關 Multics(Multiplexed Information and Computing Service, 多路資訊和計算服務 ) 的更多資訊, 請取用 Multics 主頁 為什麼 Linux 很重要? 因為它是自由軟體, 通過 GNU 通用公共許可證授權,Linux 使程式設計師無需在每次開發新專案時都要不斷重新設計操作層 打個比方,GNU 的系列工具就好比免版稅的磚塊和灰泥, 您可以用它們構建獨立的項目 自由軟體的批評者們常常擔心自由軟體的自由和低成本會將導致一場計算行業的經濟災難 然而, 自由軟體對計算領域的影響只不過像 ( 不然的話更像 ) 古騰堡 (Gutenberg) 的印刷機對文字世界的影響一樣 The GNU 通用公共許可證說明了自由軟體用戶所享有的自由和要承擔的責任 在自由軟體基金會 (Free Software Foundation,FSF) 網站, 您可以閱讀有關自由軟體的 思想 " 並且可以找到大量可下載的文件檔案和套裝軟體 IBM 公共許可證 (IBM Public License,IPL) 也是一個自由軟體許可證 它是在 FSF 創始人 Richard Stallman 的幫助下建立的 IBM developerworks 的開放來源碼專區提供了在開放和自由許可證下發行的下載 我能用 Linux 做什麼? 您希望用 Linux 系統做什麼, 將決定您想要什麼樣的 Linux 系統, 以及在開始使用該系統之前要對它有多深的理解 Linux 是進行核心研究 學習 UNIX 或學習編寫程式的絕佳學習平台 ; 有許多工 3

5 DMA270 Linux 操作流程 具和應用程式可用來玩遊戲 進行桌面排版或者只是閒來無事發一下電子郵件和瀏覽 Web 它也是開放和封閉式生產系統的絕佳平台, 因為可自由地對其進行最大程度的定制 Linux 可以作為各種事物的平台, 從中間件到嵌入式計算和群集, 從並行超級電腦到小玩意兒 IBM 已經參與了製造在 Linux 上運作的收銀機的專案, 以及製造 Linux 手錶的專案 其他開發人員已經在手機 Sony PlayStation TiVo 和 Sharp Zaurus 上使用了 Linux 儘管 GNU 通用公共許可證要求將修改過的程式碼發佈給使用該程式碼的客戶, 但它不要求將所有修改後的程式碼都發佈給公眾 ( 這是某些自由軟體的批評者沒有領會的關鍵一點 ) 的確, 對於基於 Linux 的收銀機, 把程式碼發佈給大眾在安全性上完全是一種冒險 GNU GPL 只要求使用程式碼的客戶可以獲得修改後的程式碼 文章 Linux 客戶機有多好?" 就是一個學習有關 Linux 操作環境的更多知識的絕佳起點 IBM developerworks Linux 專區是一個不可缺少的教程與文章資源, 裡面介紹了 Linux 的所有知識, 從基礎知識到高級編寫程式和部署 概念驗證手錶上的 Linux 專案是一項由 IBM Research 開發的非常流行且廣受歡迎的專案 查看 IBM 的智慧自動售貨機 從 Linux at IBM 門戶網站瞭解令人振奮的 Linux 項目和隨需應變的計算 Linux Services Overview 著重描述 IBM 的 Linux 解決方案, 並專門關注電子商務的使用和應用程式 IBM 全球服務為您提供諮詢和支援 ; 它的服務無所不含從實現新安裝到遷移或更新舊安裝 在 Linux services 瀏覽頁面上瞭解 IGS 在 Linux 領域所做的工作, 或者通過查看 Linux at IBM" 的案例分析, 看看它最近提供了什麼樣的解決方案 如何開始學習 Linux? 如果完全不瞭解 Linux, 或者正在使用 Linux 作為桌面作業系統, 那麼您至少需要學習一些有關系統管理和安全性的基本知識 和試圖將這些任務自動化的商業性個人作業系統不同,Linux 並不承諾手把手幫助您, 也不承諾跟在您後面做一些清理工作 : 您必須自己管理系統 幸運的是, 基本的維護和基本的安全性都很簡單 在許多方面, 4

6 第一章 基礎篇 現在的 Linux 和 UNIX 管理要比流行的商業性個人作業系統的管理容易得多, 因為前者更透明 儘管 Linux 的確有幾個視窗環境可讓您執行管理, 但控制系統最直接的方法是使用命令行 構建在命令行環境結構之中的是大量的命令和數種基於文本的幫助系統 在 Web 上, 在現實世界中, 有許多資源可以幫助您開始使用 Linux 有許多專門針對這一主題的網站 文章和書籍,Linux 用戶組 (Linux User Groups, 也稱為 LUG) 在世界各個國家和城市舉行會議眾所周知, 他們對新用戶也非常友好 Linux Online 提供一份詳盡的有關全球 Linux 用戶組的列表 你可以通過變通利用已有的技能, 從 Windows 環境轉到 Linux 環境 我們的系列文章 "Windows 到 Linux 之旅 " 有 9 個部分, 指導你披荊斬棘 詳盡的 Linux 用戶技術 FAQ" 是幫助新用戶開始學習的好起點 為 Windows 用戶準備的簡明 Linux 辭彙表 " 是另一個適合新手使用的有用 ( 如果不是不可替代的話 ) 資源 IBM developerworks Linux 專區提供了許多專門介紹基礎知識的獨立教程和系列教程 ; 所涉及的內容有編譯 Linux 核心 編譯和安裝軟體到對 Linux 系統分區和備份等等 為您的 Linux 應用開發加油提速,2003 針對 Linux 開發新手的基本任務 " 介紹了瀏覽 Linux 以及使用基本命令和工具的基礎知識 Addressing security issues in Linux" 是一個常見安全性問題的指南, 共 39 頁, 由 IBM 的 Mark Chapman 編寫 如何在應用開發中使用 Linux? Linux 是作為編寫程式平台的絕佳選擇 它符合 GCC, 這意味著您可以使用 GNU 項目出色的編寫程式與調整測試工具套件絕對免費, 而且享有 GNU GPL 保證的所有自由 商業性編寫程式套裝軟體和商業性作業系統一樣, 要花很多錢 是的, 某些專案常常需要它們, 而它們也物有所值, 但對於新手或學習編寫程式的人, 以及某些職業人士自由軟體絕對是不可替代的 如果您正在使用 Linux 作為開發平台, 請不要跳過學習管理和安全性這第一步 不能掌握自己的電腦的程式師實在是愚蠢 IBM 拿出十億美元支持 Linux 的行動成了頭條新聞 ; 它對 Linux 開發人員的支援旨在使應用程式編寫程式的工作變得更容易 不管您的項目是普通項目還是位於前緣的項目, 您都應當看看 Linux at IBM: Developers 站點上可用的資源 5

7 DMA270 Linux 操作流程 UnitedLinux 公共程式碼庫承諾使 Linux 上的編寫程式變得更簡單 IBM developerworks 線上時事通訊 : 技術版本專門為您提供與最新技術和開發保持同步所需的文章和資訊 IBM 國際技術支援組織 (International Technical Support Organization,ITSO) 推出的 IBM 紅皮書提供類似的服務 您將會特別喜歡涉及方面的線上提示和技巧 印刷版本的 IBM developerworks 技術專刊也是一個有價值的參考資料 Linux 生來就符合標準 Linux 開發者通常非常重視的方面是 : 保持操作層以及在上面構建的應用的開放性 互操作性並符合標準 Linux 標準基礎庫 (or LSB) 提供了特定於 Linux 的工業規範和認證計畫 LSB 是 Free Standards Group 的一個工作組 意在為了符合 LSB,UnitedLinux 致力於提供改進的公共程式碼庫 UnitedLinux 是由四家領袖級 Linux 提供商發起的協會專案 通常與 UNIX 緊密聯繫,The Open Group 是一中立提供商 技術中立的國際化協會, 其目標是計算界協同操作的安全性和可靠性 IEEE's Portable Application Standards Committee (PASC) 負責 UNIX 標準的 POSIX 系列 Requests for Comments (RFC) document series 是一套關於 Internet 的有組織的技術 由 IETF 秘書處維護,RFC 發行過程在 Internet 標準過程中佔有重要地位 在 Linux 上可以使用哪些編寫程式語言? 除了像 Fortran 和 C/C++ 這樣一直流行的傳統編寫程式語言, 許多腳本和其他電腦語言也都可以在 Linux 上正常運作 ( 甚至被設計成與 Linux 能最融洽地工作 ) 最受歡迎的編寫程式語言包括 Perl Python PHP 和 Tcl 像 Java 技術和 XML 那樣不斷發展的新技術可以在 Linux 上暢順地運作, 許多其他更深奧的編寫程式語言 ( 從 Logo 和 Rebol 到 Smalltalk 及其它語言 ) 也是如此 GNU 的 GCC 頁提供了大量免費工具和支援 David Mertz 在 IBM developerworks 上的可愛的 Python 專欄讓您和 Python 世界中的技術保持同步 6

8 第一章 基礎篇 Perl 愛好者們可以從 Ted Zlatanov 在 IBM developerworks 上的文章功能豐富的 Perl 專欄和更佳編寫程式之路系列獲得大量實用的建議 IBM 的 SashXB for Linux 項目提供了一個用於 Linux 的小型 RAD 環境, 它是一個智慧的基於 Java 的環境 IBM developerworks 用整個專區專門介紹了 Java 技術和編寫程式 IBM developerworks XML 專區是得過獎的極有價值的線上資源, 適合各領域的開發人員 IBM 提供 Toolbox 訂閱, 其特點是單個用戶可以用較低的價格獲得為期一年的許可證, 來取用 IBM 核心工具和技術 Web 服務與 Linux 有什麼關係? Web 開發人員在決定以什麼技術作為其電子商務應用程式的基礎時, 有許多選擇 因為 Linux 符合標準, 所以許多新技術 從 Java 技術和 XML 這樣的開放成果到語音應用程式 無線普及計算甚至 Web 服務這樣最前線的服務 都支援 Linux IBM developerworks Web 服務專區正是一個更詳細瞭解 Web 服務編寫程式這一令人振奮領域的地方 alphaworks Web Services 提供新的 Web 服務技術和 IBM 新興技術工具箱 (Emerging Technologies Toolkit,ETTK) IBM Web 服務頁介紹來自 IBM 的產品和新聞 演示及合作夥伴事例 IBM 的 WebSphere Studio Application Developer 和 WebSphere Application Server 提供產品級的 Web 服務開發環境 Linux 如何適用於網路計算? 使 Linux 或 UNIX 機器與其他出售的作業系統一起出色地工作一直就不太容易, 而且現在這仍然不是件簡單的事 但是, 當今現有的作業系統實際上都有這個問題 在互操作性和可攜性方面已經有了巨大進步, 在這個領域, 新的工具和技術仍不斷被開發出來 這方面的 Linux 工作包括移植和聯網, 這涉及到編寫或重寫設備驅動程式 儘管設備驅動程式和 Linux 的其他高級方面一樣較為複雜, 但有必要不時地重新設計它們, 以便將各種系統和外部設備 ( 無論是舊的還是新的 ) 連接到 Linux 或 UNIX 機器 7

9 DMA270 Linux 操作流程 幸運的是, 從所涉及的範圍看, 它們通常比核心和系統的其他高級方面小很多 David Mertz 在 IBM developerworks 文章 在 Linux( 或異構 ) 網路上共用電腦 " ( 另請參閱第 2 部分 ) 中向您介紹基本的 Linux 聯網規則 要獲得更多關於聯網的基本資料, 請參閱 局域網的組建 " 拼湊起一個複雜的網路是比較困難的, 但您將在 IBM developerworks Web 體系結構專區發現大量的編寫程式和實踐技巧 將安裝移到無線平台比您想像的容易 在 IBM developerworks Wireless 專區瞭解編寫程式和連通性 通過閱讀這些專門的 IBM 參考資料來瞭解網路模型, 包括入門級文章 網路計算關鍵元件文章 ", 以及電子商務隨需應變 虛擬化資源中心上的白皮書和文章 一旦您一切就緒,IBM developerworks 網路計算專題將使您與最新的資訊 工具和支援保持同步, 以便使您的網路順暢地運作 我瞭解 Linux, 但如何能進一步提高技能? 如果您希望使用 Linux 作為非常高級的應用程式或應用程式集的平台, 您將會對系統的某些領域感興趣, 譬如核心研究 各種檔案系統的差異以及其他一些基本的細節 高級應用程式 ( 或遊戲 ) 所需要的另一套技能是調優 Linux 機器 群集或網路以獲得最佳性能 這需要掌握多處理 編程技術 群集和其他神秘而複雜的系統管理知識 理解 Linux 的這些方面不像實際的核心研究那樣需要勇氣, 但也會非常困難 IBM Learning Services 提供的各種課程涉及各個方面, 從基礎知識到開發, 以及非常專業化的技能 並且還有認證 ( 稍後將詳細介紹 ) IBM 開發人員解決方案提供有關 IBM 產品的文章和 HOWTO, 更多的 IBM 網站提供許多資源, 其中有許多 ( 如果不是大部分的話 ) 也都在 Linux 上運作 IBM developerworks 提供了關於 Linux 和其他幾種開放或自由技術的文章 教程和資源, 其他技術包括 XML 無線 Web 服務 Java 技術和網路計算 IBM developerworks Live! 技術簡報事件是瞭解更多有關 IBM 技術的好方式 您將在 Linux at IBM: Events 頁面和 IBM developerworks Linux 事件列表中找到有關它們以及其他 IBM 事件的詳細資訊 8

10 第一章 基礎篇 IBM 的國際技術支援組織 (International Technical Support Organization,ITSO) 不僅出版 IBM 紅皮書, 它還主持世界範圍的研討會 當沒有時間進行正規學習時,IBM developerworks 和 IBM developer solutions 允許您根據自己的時間和條件緊跟變化和技術 怎樣證明我具備 Linux 技能? Linux 培訓有各種認證專案 既有聯盟計畫, 也有獨立的技能測試和公司贊助的認證 IBM 提供了數種 Linux 專門技能的認證途徑 IBM developerworks 提供了兩個內容豐富的系列教程, 專門用於準備 Linux Professional Institute(LPI) 認證 請取用 LPI, 瞭解有關他們認證計畫的更多資訊 Red Hat 也提供針對其開發版的認證 哪些 IBM 工具可用於 Linux? Linux 是一個出色的作業系統, 可以在它上面運作標準的應用程式, 從辦公應用程式 ( 如字處理程式和電子製表軟體 ) 到資料庫系統, 以及 Web 發佈和服務環境 諸如 DB2 Lotus Tivoli 和 WebSphere 這樣的 IBM 產品都可在 Linux 上運作, 而且 IBM 不是唯一認識到 Linux 是應用程式的絕佳平台的業界領導者 雖然受到誤解並且常遭誹謗, 至少某些自吹自擂的數字文人是這麼做的 但首先, 應用程式卻是電腦得以即時運轉的主要原因 ( 對於許多電腦用戶是唯一的主要原因 ) Linux 的開放性質允許應用程式供應商對其解決方案進行細緻的調優以滿足用戶的需要, 這是封閉式系統做不到的 Why DB2 for Linux? 提供了各種資訊 下載和鏈結以便您瞭解有關 IBM 這一主要資料庫系統的更多資訊 WebSphere Portal 專區將回答您有關應用程式服務 電子商務和體系結構應用程式的所有問題 除了最為人熟知的消息傳遞和協作功能之外,Lotus 軟體套件的整合功能還提供小組會議 網路遠端教育 知識管理及其它功能 Tivoli 技術擴充了系統管理並將 Linux 機器與其他 IT 系統整合在一起 9

11 DMA270 Linux 操作流程 Linux 前景如何? Linux 的開放性和靈活性使它得以在實驗室和其他研究機構中被用於創新性技術變革的前緣 IBM 的研究涵蓋資訊技術的所有領域, 從物理和認知科學到前緣應用研究等 但 IBM 的研究人員 ( 在很多情況下 ) 也涉及純科學 和其他機構一樣,IBM 也常常在這些場合中使用 Linux 針對極具創新性的實驗或原型 模擬或者測試, 可以很容易地群集或定制 Linux; 也可以同樣具有創新性的方法使用大量的自由軟體工具 ( 為了使用這些工具而建立了 Linux) 即使有了現在正在開發的所有令人振奮的新技術, 從網路計算和無線語音應用程式到人工智慧和量子計算, 我們所處的計算時代的潛能和前景仍然遠沒有被充分利用 Linux 健壯和開放的靈活性意味著它在今後很多年都將處於開發戰線的最前緣 IBM Research 的研究涉及很多領域, 從遺傳學到奈米技術 人工智慧以及量子隱形傳態 (quantum teleportation), 無所不含 在 IBM Research news 中密切關注他們最新的成果 我們可沒有拿量子隱形傳態開玩笑 您也可能有興趣閱讀量子計算 IBM 的普及計算實驗室不僅僅普及, 它還給人非常深刻的印像 IBM Research 奧斯丁中心是 IBM Linux 技術中心 (IBM Linux Technology Center) 的大本營 IBM 的藍色基因 (Blue Gene) 超級電腦運作 Linux IBM Scholars Program 與多所大學合作, 在許多課題上提供科學研究產品以及資源和資助, 所涉及的課題包括 Linux 和生命科學 1-2 Linux 系統開發簡介 如果您剛接觸嵌入式開發, 那麼大量可用的引導裝載程式 (bootloader) 規模縮小的開發版 (distribution) 檔案系統和 GUI 看起來可能太多了 但是這些豐富的選項實際上是一種恩賜, 允許您調整開發或用戶環境以完全符合您的需要 對 Linux 嵌入式開發的概述將幫助您理解所有這些選項 Linux 正在嵌入式開發領域穩步發展 因為 Linux 使用 GPL( 請參閱本文後面的參考資料 ), 所以任何對將 Linux 定制於 PDA 掌上機器或者可配帶設備感興趣的人都可以從網際網路免費下載其核心和應用程式, 並開始移植或開發 許多 Linux 改良品 10

12 第一章 基礎篇 種迎合了嵌入式 / 即時市場 它們包括 RTLinux( 即時 Linux) uclinux( 用於非 MMU 設備的 Linux) Montavista Linux( 用於 ARM MIPS PPC 的 Linux 開發版 ) ARM-Linux (ARM 上的 Linux) 和其他 Linux 系統 ( 請參閱參考資料以鏈結到本文中提到的這些和其他術語及產品 ) 嵌入式 Linux 開發大致涉及三個層次 : 引導裝載程式 (bootloader) Linux 核心和圖形用戶介面 ( 或稱 GUI) 在本文中, 我們將集中討論涉及這三層的一些基本概念 ; 深入瞭解引導裝載程式 (bootloader) 核心和檔案系統是如何交互的, 並將研究可用於檔案系統 GUI 和引導裝載程式的眾多選項中的一部分 引導裝載程式引導裝載程式通常是在任何硬體上執行的第一段程式碼 在像桌上型機器這樣的常規系統中, 通常將引導裝載程式裝入主引導紀錄 (Master Boot Record,(MBR)) 中, 或者裝入 Linux 駐留磁片的第一個磁區中 通常在桌上型機器或其他系統上,BIOS 將控制移交給引導裝載程式 這就提出了一個有趣的問題 : 誰將引導裝載程式裝入 ( 在大多數情況中 ) 沒有 BIOS 的嵌入式設備上呢? 解決這個問題有兩種常規技術 : 專用軟體和微小的引導程式碼 (tiny bootcode) 專用軟體可以直接與遠端系統上的快閃記憶體設備進行交互並將引導裝載程式安裝在快閃記憶體的給定位置中 快閃記憶體設備是與儲存設備功能類似的特殊晶片, 而且它們能持久儲存資訊, 即在重新引導時不會抹除其內容 這個軟體使用目標 ( 在嵌入式開發中, 嵌入式設備通常被稱為目標 ) 上的 JTAG 埠, 它是用於執行外部輸入 ( 通常來自主機機器 ) 的指令的介面 JFlash-linux 是一種用於直接寫入快閃記憶體的流行工具 它支援為數眾多的快閃記憶體晶片 ; 它在主機機器 ( 通常是 i386 機器, 本文中我們把一台 i386 機器稱為主機 ) 上執行並通過 JTAG 介面使用平行埠取用目標的快閃記憶體晶片 當然, 這意味著目標需要有一個平行介面使它能與主機通訊 Jflash-linux 在 Linux 和 Windows 版本中都可使用, 可以在命令行中用以下命令啟動它 : Jflash-linux <bootloader> 某些種類的嵌入式設備具有微小的引導程式碼根據幾個位元組的指令, 它將初始化一些 DRAM 設定並啟用目標上的一個串列 ( 或者 USB, 或者乙太網路 ) 埠與主機程式通訊 然後, 主機程式或裝入程式可以使用這個連接將引導裝載程式傳送到目標上, 並將它寫入快閃記憶體 在安裝它並給予其控制後, 這個引導裝載程式執行下列各類功能 : 11

13 DMA270 Linux 操作流程 初始化 CPU 速度 初始化記憶體, 包括啟用記憶體庫 初始化記憶體配置暫存器等 初始化序列埠 ( 如果在目標上有的話 ) 啟用指令 / 資料快取記憶體 設定堆疊指標 設定參數區域並構造參數結構和標記 ( 這是重要的一步, 因為核心在標示根設備 頁面大小 記憶體大小以及更多內容時要使用引導參數 ) 執行 POST 來讓標示存在設備並報告任何問題 為電源管理提供待機 / 喚醒支援 跳躍到核心的開始 帶有引導裝載程式 參數結構 核心和檔案系統的系統典型記憶體佈局可能如下所示 : 清單 1. 典型記憶體佈局 /* Top Of Memory */ Bootloader Parameter Area Kernel Filesystem /* End Of Memory */ 嵌入式設備上一些流行的並可免費使用的 Linux 引導裝載程式有 Blob Redboot 和 Bootldr( 請參閱參考資料獲得鏈結 ) 所有這些引導裝載程式都用於 ARM 設備上的 Linux, 並需要 Jflash-linux 工具用於安裝 一旦將引導裝載程式安裝到目標的快閃記憶體中, 它就會執行我們上面提到的所有初始化工作 然後, 它準備接收來自主機的核心和檔案系統 一旦裝入了核心, 引導裝載程式就將控制轉給核心 設定工具鏈設定工具鏈在主機機器上建立一個用於編譯將在目標上運作的核心和應用程式的構建環境, 這是因為目標硬體可能沒有與主機相容的二進位執行級別 12

14 第一章 基礎篇 工具鏈由一套用於編譯 組譯和鏈結核心及應用程式的元件組成 這些組件包括 : Binutils 用於操作二進位檔的實用程式集合 它們包括諸如 ar as objdump objcopy 這樣的實用程式 Gcc GNU C 編譯器 Glibc 所有用戶應用程式都將鏈結到的 C 函式庫 讓使用任何 C 函式庫的核心和其他應用程式, 可以在沒有該函式庫的情況下進行編譯 構建工具鏈建立了一個交叉編譯器環境 本地編譯器編譯與本機同類的處理器的指令 交叉編譯器運作在某一種處理器上, 卻可以編譯另一種處理器的指令 重頭設定交叉編譯器工具鏈可不是一項簡單的任務 : 它包括下載來源程式碼 修正補強 配置 編譯 設定標頭檔 安裝以及很多很多的操作 另外, 這樣一個徹底的構建過程對記憶體和硬碟的需求是巨大的 如果沒有足夠的記憶體和硬碟空間, 那麼在構建階段由於相關性 配置或標頭檔設定等問題會突然冒出許多問題 因此能夠從網際網路上獲得已預先編譯的二進位檔是一件好事 ( 但不太好的一點是, 目前它們大多數只限於基於 ARM 的系統, 但遲早會改變的 ) 一些比較流行的已預先編譯的工具鏈包括那些來自 Compaq(Familiar Linux ) LART(LART Linux) 和 Embedian( 基於 Debian 但與它無關 ) 的工具鏈 所有這些工具鏈都用於基於 ARM 的平台 核心設定 Linux 社區正積極地為新硬體添加功能部分和支援, 在核心中修正錯誤並且及時地進行常規改進 這導致大約每 6 個月 ( 或 6 個月不到 ) 就有一個穩定的 Linux 的新發行版 不同的維護者維護針對特定體系結構的不同核心和補強 當為一個專案選擇了一個核心時, 您需要評估最新發行版的穩定性如何, 它是否符合專案要求和硬體平台 從編寫程式角度來看它的舒適程度以及其他難以確定的方面 還有一點也非常重要, 找到需要應用於基本核心的所有補強, 以便為特定的體系結構調整核心 核心佈局核心佈局分為特定於體系結構的部分和與體系結構無關的部分 核心中特定於體系結構的部分首先執行, 設定硬體暫存器 配置記憶體映射 執行特定於體系結構的初始化, 然後將控制轉給核心中與體系結構無關的部分 系統的其餘部分在這第二個階段期間進行初始化 主目錄下的 arch/ 由不同的子目錄組成, 每個子目錄用於一個不同的體系結構 (MIPS ARM i386 SPARC PPC 等 ) 每一個這樣的子目錄都包含 kernel/ 和 13

15 DMA270 Linux 操作流程 mm/ 子目錄, 它們包含特定於體系結構的程式碼來完成像初始化記憶體 設定 IRQ 啟用快取記憶體 設定核心頁面表等操作 一旦裝入核心並給予其控制, 就首先應用這些函數, 然後初始化系統的其餘部分 根據可用的系統資源和引導裝載程式的功能, 核心可以編譯成 vmlinux Image 或 zimage vmlinux 和 zimage 之間的主要區別在於 vmlinux 是實際的 ( 未壓縮的 ) 可執行檔, 而 zimage 是或多或少包含相同資訊的自解壓縮檔, 只是壓縮它以處理 ( 通常是 Intel 強制的 )640 KB 引導時間的限制 有關所有這些的權威性解釋, 請參閱 Linux Magazine 的文章 Kernel Configuration: dealing with the unexpected"( 請參閱參考資料 ) 核心鏈結和載入一旦為目標系統編譯了核心後, 通過使用引導裝載程式 ( 它已經被裝入到目標的快閃記憶體中 ), 核心就被裝入到目標系統的記憶體 ( 在 DRAM 中或者在快閃記憶體中 ) 通過使用串列埠 USB 或乙太網路埠, 引導裝載程式與主機通訊以將核心傳送到目標的快閃記憶體或 DRAM 中 在將核心完全裝入目標後, 引導裝載程式將控制傳遞給載入核心的位址 核心可由執行檔由許多鏈結在一起的物件檔組成 物件檔有許多節, 如文本 資料 init 資料 bass 等等 這些物件檔案都是由一個稱為鏈結器腳本的檔案鏈結並裝入的 這個鏈結器腳本的功能是將輸入物件檔的各節映射到輸出檔中 ; 換句話說, 它將所有輸入物件檔都鏈結到單一的可執行檔中, 將該可執行檔的各節載入到指定位址處 vmlinux.lds 是存在於 arch/<target>/ 目錄中的核心鏈結器腳本, 它負責鏈結核心的各個節並將它們裝入記憶體中特定偏移量處 典型的 vmlinux.lds 看起來像這樣 : 清單 2. 典型的 vmlinux.lds 文件 OUTPUT_ARCH(<arch>) /* <arch> includes architecture type */ ENTRY(stext) /* stext is the kernel entry point */ SECTIONS /* SECTIONS command describes the layout of the output file */ {. = TEXTADDR; /* TEXTADDR is LMA for the kernel */.init:{ /* Init code and data*/ _stext =.; /* First section is stext followed 14

16 第一章 基礎篇 } by init data section */ init_begin =.; *(.text.init) init_end =.; }.text:{ /* Real text segment follows init_data section */ _text =.; *(.text) _etext =.; /* End of text section*/ }.data:{ _data=.; /* Data section comes after text section */ *(.data) _edata=.; } /* Data section ends here */.bss:{ /* BSS section follows symbol table section */ bss_start =.; *(.bss) _end =.; /* BSS section ends here */ } LMA 是裝入模組位址 ; 它表示將要裝入核心的目標虛擬記憶體中的位址 TEXTADDR 是核心的虛擬起始位址, 並且在 arch/<target>/ 下的 Makefile 中指定它的值 這個位址必須與引導裝載程式使用的位址相匹配 一旦引導裝載程式將核心複製到快閃記憶體或 DRAM 中, 核心就被重新定位到 TEXTADDR 它通常在 DRAM 中 然後, 引導裝載程式將控制轉給這個位址, 以便核心能開始執行 參數傳遞和核心引導 stext 是核心進入點, 這意味著在核心引導時將首先執行這一節下的程式碼 它通常用組合語言編寫, 並且通常它在 arch/<target>/ 核心目錄下 這個程式碼設定核心頁 15

17 DMA270 Linux 操作流程 面目錄 建立身份核心映射 標示體系結構和處理器以及執行分支 start_kernel ( 初始化系統的主程式 ) Start_kernel 調整 setup_arch 作為執行的第一步, 在其中完成特定於體系結構的設定 這包括初始化硬體暫存器 標示根設備和系統中可用的 DRAM 和快閃記憶體的數量 指定系統中可用頁面的數目 檔案系統大小等等 所有這些資訊都以參數形式從引導裝載程式傳遞到核心 將參數從引導裝載程式傳遞到核心有兩種方法 :parameter_structure 和標記列表 在這兩種方法中, 不贊成使用參數結構, 因為它強加了限制 : 指定在記憶體中, 每個參數必須位於 param_struct 中的特定偏移量處 最新的核心期望參數作為標記列表的格式來傳遞, 並將參數轉化為已標記格式 param_struct 定義在 include/asm/setup.h 中 它的一些重要欄位是 : 清單 3. 樣本參數結構 struct param_struct { unsigned long page_size; /* 0: Size of the page */ unsigned long nr_pages; /* 4: Number of pages in the system */ unsigned long ramdisk /* 8: ramdisk size */ unsigned long rootdev; /* 16: Number representing the root device */ unsigned long initrd_start; /* 64: starting address of initial ramdisk */ /* This can be either in flash/dram */ unsigned long initrd_size; /* 68: size of initial ramdisk */ } 請注意 : 這些數表示定義欄位的參數結構中的偏移量 這意味著如果引導裝載程式將參數結構放置在位址 0xc , 那麼 rootdev 參數將放置在 0xc , initrd_start 將放置在 0xc 等等, 否則核心將在解釋正確的參數時遇到困難 正如上面提到的, 因為從引導裝載程式到核心的參數傳遞會有一些約束條件, 所以大多數 2.4.x 系列核心期望參數已標記的列表格式傳遞 在已標記的列表中, 每個標記由標示被傳遞參數的 tag_header 以及其後的參數值組成 標記列表中標記的常規格式可以如下所示 : 16

18 第一章 基礎篇 清單 4. 樣本標記格式 核心通過 <ATAG_TAGNAME> 頭來標示每個標記 #define <atag_tagname> <Some Magic number> struct <tag_tagname> { u32 <tag_param>; u32 <tag_param>; }; /* Example tag for passing memory information */ #define ATAG_MEM 0x /* Magic number */ struct tag_mem32 { u32 size; /* size of memory */ u32 start; /* physical start address of memory*/ }; setup_arch 還需要對快閃記憶體儲存庫 系統暫存器和其他特定設備執行記憶體映射 一旦完成了特定於體系結構的設定, 控制就返回到初始化系統其餘部分的 start_kernel 函數 這些附加的初始化任務包含 : 設定陷阱 初始化中斷 初始化計時器 初始化控制台 應用 mem_init, 它計算各種區域 高記憶體區等內的頁面數量 初始化 slab 分配器並為 VFS 緩衝區快取記憶體等建立 slab 快取記憶體 建立各種檔案系統, 如 proc ext2 和 JFFS2 建立 kernel_thread, 它執行檔案系統中的 init 命令並顯示 lign 提示符號 如果在 /bin /sbin 或 /etc 中沒有 init 程式, 那麼核心將執行檔案系統的 /bin 中的 shell 17

19 DMA270 Linux 操作流程 設備驅動程式嵌入式系統通常有許多設備用於與用戶交互, 像觸控螢幕 小鍵盤 滾動輪 感測器 RA232 介面 LCD 等等 除了這些設備外, 還有許多其他專用設備, 包括快閃記憶體 USB GSM 等 核心通過所有這些設備各自的設備驅動程式來控制它們, 包括 GUI 用戶應用程式也通過取用這些驅動程式來取用設備 本節著重討論通常幾乎在每個嵌入式環境中都會使用的一些重要設備的設備驅動程式 封包緩衝區驅動程式這是最重要的驅動程式之一, 因為通過這個驅動程式才能使系統螢幕顯示內容 封包緩衝區驅動程式通常有三層 最底層是基本控制台驅動程式 drivers/char/console.c, 它提供了文本控制台常規介面的一部分 通過使用控制台驅動程式函數, 我們能將文本列印到螢幕上, 但圖形或動畫還不能 ( 這樣做需要使用視訊模式功能, 通常出現在中間層, 也就是 drivers/video/fbcon.c 中 ) 這個第二層驅動程式提供了視訊模式中繪圖的常規介面 封包緩衝區是顯卡上的記憶體, 需要將它記憶體映射到用戶空間以便可以將圖形和文本能寫到這個記憶體區段上 : 然後這個資訊將反映到螢幕上 封包緩衝區支援提高了繪圖的速度和整體性能 這也是頂層驅動程式引人注意之處 : 頂層是非常特定於硬體的驅動程式, 它需要支援顯示卡不同的硬體方面, 像啟用 / 禁用顯示卡控制器 深度和模式的支援以及調色板等 所有這三層都相互依賴以實現正確的視訊功能 與封包緩衝區有關的設備是 /dev/fb0( 主設備號 29, 次設備號 0) 輸入設備驅動程式可觸控板是用於嵌入式設備的最基本的用戶交互設備之一小鍵盤 感測器和滾動輪也包含在許多不同設備中以用於不同的用途 觸控版設備的主要功能是隨時報告用戶的觸控, 並標示觸控的座標 這通常在每次發生觸控時, 通過產生一個中斷來實現 然後, 這個設備驅動程式的角色是每當出現中斷時就查詢觸控螢幕控制器, 並請求控制器發送觸控的座標 一旦驅動程式接收到座標, 它就將有關觸控和任何可用資料的信號發送給用戶應用程式, 並將資料發送給應用程式 ( 如果可能的話 ) 然後用戶應用程式根據它的需要處理資料 幾乎所有輸入設備, 包括小鍵盤都是類似原理工作 18

20 第一章 基礎篇 快閃記憶體 MTD 驅動程式 MTD 設備是像快閃記憶體晶片 小型快閃記憶體卡等之類的設備, 它們在嵌入式設備中的使用正在不斷增長 MTD 驅動程式是在 Linux 下專門為嵌入式環境開發的新的一類驅動程式 相對於常規設備驅動程式, 使用 MTD 驅動程式的主要優點在於 MTD 驅動程式是專門為基於快閃記憶體的設備所設計的, 所以它們通常有更好的支援 更好的管理和基於磁區的抹除和讀寫操作的更好的介面 Linux 下的 MTD 驅動程式介面被劃分為兩類模組 : 用戶模組和硬體模組 用戶模組這些模組提供從用戶空間直接使用的介面 : 原始字元取用 原始區塊取用 FTL( 快閃記憶體轉換層,Flash Transition Layer 用在快閃記憶體上的一種檔案系統 ) 和 JFS ( 即日誌檔案系統,Journaled File System 在快閃記憶體上直接提供檔案系統而不是類比區塊設備 ) 用於快閃記憶體的 JFS 的當前版本是 JFFS2( 稍後將在本文中描述 ) 硬體模組這些模組提供對記憶體設備的物理取用, 但並不直接使用它們 通過上述的用戶模組來取用它們 這些模組提供了在快閃記憶體上讀取 抹除和寫入操作的實際常式 MTD 驅動程式設定為了取用特定的快閃記憶體設備並將檔案系統置於其上, 需要將 MTD 子系統編譯到核心中 這包括選擇適當的 MTD 硬體和用戶模組 當前,MTD 子系統支援為數眾多的快閃記憶體設備, 並且有越來越多的驅動程式正被添加進來以用於不同的快閃記憶體晶片 有兩個流行的用戶模組可啟用對快閃記憶體的取用 : MTD_CHAR 和 MTD_BLOCK MTD_CHAR 提供對快閃記憶體的原始字元取用, 而 MTD_BLOCK 將快閃記憶體設計為可以在上面建立檔案系統的常規區塊設備 ( 像 IDE 磁片 ) 與 MTD_CHAR 關聯的設備是 /dev/mtd0 mtd1 mtd2( 等等 ), 而與 MTD_BLOCK 關聯的設備是 /dev/ mtdblock0 mtdblock1( 等等 ) 由於 MTD_BLOCK 設備提供像區塊設備那樣的類比, 通常更可取的是在這個模擬基礎上建立像 FTL 和 JFFS2 那樣的檔案系統 為了進行這個操作, 可能需要建立分區表將快閃記憶體設備分拆到引導裝載程式節 核心節和檔案系統節中 樣本分區表可能包含以下資訊 : 19

21 DMA270 Linux 操作流程 清單 5. MTD 的簡單快閃記憶體設備分區 struct mtd_partition sample_partition = { { /* First partition */ name : bootloader, /* Bootloader section */ size : 0x , /* Size */ offset : 0, /* Offset from start of flash- location 0x0*/ mask_flags : MTD_WRITEABLE /* This partition is not writable */ }, { /* Second partition */ name : Kernel, /* Kernel section */ size : 0x , /* Size */ offset : MTDPART_OFS_APPEND, /* Append after bootloader section */ mask_flags : MTD_WRITEABLE /* This partition is not writable */ }, { /* Third partition */ name : JFFS2, /* JFFS2 filesystem */ size : MTDPART_SIZ_FULL, /* Occupy rest of flash */ offset : MTDPART_OFS_APPEND /* Append after kernel section */ } } 上面的分區表使用了 MTD_BLOCK 介面對快閃記憶體設備進行分區 這些分區的設備節點是 : 簡單快閃記憶體分區的設備節點 User device node Major number Minor number Bootloader /dev/mtdblock Kernel /dev/mtdblock Filesystem /dev/mtdblock

22 第一章 基礎篇 在本例中, 引導裝載程式必須將有關 root 設備節點 (/dev/mtdblock2) 和可以在快閃記憶體中找到檔案系統的位址 ( 本例中是 FLASH_BASE_ADDRESS + 0x ) 的正確參數傳遞到核心 一旦完成分區, 快閃記憶體設備就準備載入或掛載檔案系統 Linux 中 MTD 子系統的主要目標是在系統的硬體驅動程式和上層或用戶模組之間提供通用介面 硬體驅動程式不需要知道像 JFFS2 和 FTL 那樣的用戶模組使用的方法 所有它們真正需要提供的就是一組對底層快閃記憶體系統進行 read write 和 erase 操作的簡單常式 嵌入式設備的檔案系統系統需要一種以結構化格式儲存和檢索資訊的方法 ; 這就需要檔案系統的參與 Ramdisk( 請參閱參考資料 ) 是通過將電腦的 RAM 用作設備來建立和掛載檔案系統的一種機制, 它通常用於無硬碟系統 ( 當然包括微型嵌入式設備, 它只包含作為永久儲存媒質的快閃記憶體晶片 ) 用戶可以根據可靠性和或增強的功能的需求來選擇檔案系統的類型 下一節將討論幾個可用選項及其優缺點 第二版擴充檔案系統 (Ext2fs) Ext2fs 是 Linux 事實上的標準檔案系統, 它已經取代了它的前任擴充檔案系統 ( 或 Extfs) Extfs 支持的檔案大小最大為 2 GB, 支持的最大檔案名稱大小為 255 個字元, 而且它不支援索引節點 ( 包括資料修改時間標記 ) Ext2fs 做得更好 ; 它的優點是 : Ext2fs 支援達 4 TB 的記憶體 Ext2fs 檔案名稱最長可以到 1012 個字元 當建立檔案系統時, 管理員可以選擇邏輯區塊的大小 ( 通常大小可選擇 和 4096 位元組 ) Ext2fs 了實現快速符號鏈結 : 不需要為此目的而分配資料區塊, 並且將目標名稱直接儲存在索引節點 (inode) 表中 這使性能有所提高, 特別是在速度上 因為 Ext2 檔案系統的穩定性 可靠性, 所以幾乎在所有基於 Linux 的系統 ( 包括桌上型機器 伺服器和工作站並且甚至一些嵌入式設備 ) 上都使用 Ext2 檔案系統 然而, 當在嵌入式設備中使用 Ext2fs 時, 它有一些缺點 : 21

23 DMA270 Linux 操作流程 Ext2fs 是為像 IDE 設備那樣的區塊設備設計的, 這些設備的邏輯塊大小是 512 位元組,1 K 位元組等這樣的倍數 這不太適合於磁區大小因設備不同而不同的快閃記憶體設備 Ext2 檔案系統沒有提供對磁區的抹除 / 寫入操作的良好管理 在 Ext2fs 中, 為了在一個磁區中抹除單個位元組, 必須將整個磁區複製到 RAM, 然後抹除, 然後重新寫入 考慮到快閃記憶體設備具有有限的抹除壽命 ( 大約能進行 100,000 次抹除 ), 在此之後就不能使用它們, 所以這不是一個特別好的方法 在出現電源故障時,Ext2fs 沒有過電流保護的 Ext2 檔案系統不支援損耗平衡, 因此縮短了磁區 / 快閃記憶體的壽命 ( 損耗平衡確保將位址範圍的不同區域輪流用於寫和抹除操作以延長快閃記憶體設備的壽命 ) Ext2fs 沒有特別完美的磁區管理, 這使設計區塊驅動程式十分困難 由於這些原因, 通常相對於 Ext2fs, 在嵌入式環境中使用 MTD/JFFS2 組合是更好的選擇 用 Ramdisk 掛載 Ext2fs 通過使用 Ramdisk 的概念, 可以在嵌入式設備中建立並掛載 Ext2 檔案系統 ( 以及用於這一目的的任何檔案系統 ) 清單 6. 建立一個簡單的基於 Ext2fs 的 Ramdisk mke2fs -vm0 /dev/ram 4096 mount -t ext2 /dev/ram /mnt cd /mnt cp /bin, /sbin, /etc, /dev... files in mnt cd../ umount /mnt dd if=/dev/ram bs=1k count=4096 of=ext2ramdisk mke2fs 是用於在任何設備上建立 ext2 檔案系統的實用程式, 它建立超級區塊 索引節點以及索引節點表等等 在上面的用法中, /dev/ram 是上面構建有 4096 個區塊的 ext2 檔案系統的設備 然後, 將這個設備 ( /dev/ram ) 掛載在名為 /mnt 的臨時目錄上並且複製所有必需的檔 22

24 第一章 基礎篇 案 一旦複製完這些檔案, 就卸裝這個檔案系統並且設備 ( /dev/ram ) 的內容被轉儲存到一個檔案 (ext2ramdisk) 中, 它就是所需的 Ramdisk(Ext2 檔案系統 ) 上面的順序建立了一個 4 MB 的 Ramdisk, 並用必需的檔案實用程式來填充它 一些要包含在 Ramdisk 中的重要目錄是 : /bin 儲存大多數像 init busybox shell 檔案管理實用程式等二進位檔 /dev 包含用在設備中的所有設備節點 /etc 包含系統的所有配置檔案 /lib 包含所有必需的函式庫, 如 libc libdl 等 日誌快閃記憶體檔案系統, 版本 2(JFFS2) 瑞典的 Axis Communications 開發了最初的 JFFS,Red Hat 的 David Woodhouse 對它進行了改進 第二個版本,JFFS2, 作為用於微型嵌入式設備的原始快閃記憶體晶片的實際檔案系統而出現 JFFS2 檔案系統是日誌結構化的, 這意味著它基本上是一長列節點 每個節點包含有關檔案的部分資訊, 可能是檔案的名稱 也許是一些資料 相對於 Ext2fs,JFFS2 因為有以下這些優點而在無硬碟嵌入式設備中越來越受歡迎 : JFFS2 在磁區級別上執行快閃記憶體抹除 / 寫入 / 讀取操作要比 Ext2 檔案系統好 JFFS2 提供了比 Ext2fs 更好的過電保護 / 斷電安全保護 當需要更改少量資料時,Ext2 檔案系統將整個磁區複製到記憶體 (DRAM) 中, 在記憶體中合併新資料, 並寫回整個磁區 這意味著為了更改單個字, 必須對整個磁區 (64 KB) 執行讀取 / 抹除 / 寫入這樣做的效率非常低 要是運氣差, 當正在 DRAM 中合併資料時, 發生了電源故障或其他事故, 那麼將丟失整個資料集合, 因為在將資料讀入 DRAM 後就抹除了快閃記憶體磁區 JFFS2 附加檔而不是重新寫入整個磁區, 並且具有過電 / 斷電安全保護這一功能 這可能是最重要的一點 :JFFS2 是專門為像快閃記憶體晶片那樣的嵌入式設備建立的, 所以它的整個設計提供了更好的快閃記憶體管理 因為本文主要是寫關於快閃記憶體設備的使用, 所以在嵌入式環境中使用 JFFS2 的缺點很少 : 當檔案系統已滿或接近滿時,JFFS2 會大大放慢運作速度 這是因為垃圾收集的問題 ( 更多資訊, 請參閱參考資料 ) 23

25 DMA270 Linux 操作流程 建立 JFFS2 檔案系統在 Linux 下, 用 mkfs.jffs2 命令建立 JFFS2 檔案系統 ( 基本上是使用 JFFS2 的 Ramdisk) 清單 7. 建立 JFFS2 檔案系統 mkdir jffsfile cd jffsfile /* copy all the /bin, /etc, /usr/bin, /sbin/ binaries and /dev entries that are needed for the filesystem here */ /* Type the following command under jffsfile directory to create the JFFS2 Image */./mkfs.jffs2 -e 0x p -o../jffs.image 上面顯示了 mkfs.jffs2 的典型用法 -e 選項確定快閃記憶體的抹除磁區大小 ( 通常是 64K 千位元組 ) -p 選項用來在映射的剩餘空間用零填充 -o 選項用於輸出檔案, 通常是 JFFS2 檔案系統映射 在本例中是 jffs.image 一旦建立了 JFFS2 檔案系統, 它就被裝入快閃記憶體中適當的位置 ( 引導裝載程式告知核心找尋檔案系統的位址 ) 以便核心能掛載它 tmpfs 當 Linux 運作於嵌入式設備上時, 該設備就成為功能齊全的單元, 許多守護處理程序會在後台運作並產生許多日誌消息 另外, 所有核心日誌記錄機制, 像 syslogd dmesg 和 klogd, 會在 /var 和 /tmp 目錄下產生許多消息 由於這些處理程序產生了大量資料, 所以允許將所有這些寫入操作都發生在快閃記憶體是不可取的 由於在重新引導時這些消息不需要持久儲存, 所以這個問題的解決方案是使用 tmpfs tmpfs 是基於記憶體的檔案系統, 它主要用於減少對系統的不必要的快閃記憶體寫入操作這是唯一目的 因為 tmpfs 駐留在 RAM 中, 所以寫入 / 讀取 / 抹除的操作發生在 RAM 中而不是在快閃記憶體中 因此, 日誌消息寫入 RAM 而不是快閃記憶體中, 在重新引導時不會保留它們 tmpfs 還使用磁片交換空間來儲存, 並且當為儲存檔案而請求頁面時, 使用虛擬記憶體 (VM) 子系統 24

26 第一章 基礎篇 tmpfs 的優點包括 : 動態檔案系統大小 檔案系統大小可以根據被複製 建立或刪除的檔或目錄的數量來縮放 使得能夠最理想地使用記憶體 速度 因為 tmpfs 駐留在 RAM, 所以讀和寫幾乎都是暫態的 即使以交換的形式儲存檔案,I/O 操作的速度仍非常快 tmpfs 的一個缺點是當系統重新引導時會丟失所有資料 因此, 重要的資料不能儲存在 tmpfs 上 掛載 tmpfs 諸如 Ext2fs 和 JFFS2 等大多數其他檔案系統都駐留在底層塊設備之上, 而 tmpfs 與它們不同, 它直接位於 VM 上 因而, 掛載 tmpfs 檔案系統是很簡單的事 : 清單 8. 掛載 tmpfs /* Entries in /etc/rc.d/rc.sysinit for creating/using tmpfs */ # mount -t tmpfs tmpfs /var -o size=512k # mkdir -p /var/tmp # mkdir -p /var/log # ln -s /var/tmp /tmp 上面的命令將在 /var 上建立 tmpfs 並將 tmpfs 的最大大小限制為 512 K 同時, tmp/ 和 log/ 目錄成為 tmpfs 的一部分以便在 RAM 中儲存日誌消息 如果您想將 tmpfs 的一個項添加到 /etc/fstab, 那麼它可能看起來像這樣 : tmpfs /var tmpfs size=32m 0 0 這將在 /var 上掛載一個新的 tmpfs 檔案系統 圖形用戶介面 (GUI) 選項從用戶的觀點來看, 圖形用戶介面 (GUI) 是系統的一個最至關重要的方面 : 用戶通過 GUI 與系統進行交互作用 所以 GUI 應該易於使用並且非常可靠 但它還需要是有記憶體意識的, 以便在記憶體受限的 微型嵌入式設備上可以無縫執行 所以, 它應該是輕量級的, 並且能夠快速裝入 25

27 DMA270 Linux 操作流程 另一個要考慮的重要方面涉及許可認證問題 一些 GUI 開發版具有允許免費使用的許可證, 甚至在一些商業產品中也是如此 另一些許可證要求如果想將 GUI 合併入項目中則要支付版稅 最後, 大多數開發人員可能會選擇 XFree86, 因為 XFree86 為他們提供了一個能使用他們喜歡的工具的熟悉環境 但是市場上較新的 GUI, 像 Century Software 的 Micro windows(nano-x) 和 Trolltech 的 QT/Embedded, 與 X 在嵌入式 Linux 的競技舞台中展開了激烈競爭, 這主要是因為它們佔用很少的資源 執行的速度很快並且具有定制視窗構件的支援 讓我們看一看這些選項中的每一個 Xfree864.X( 帶封包緩衝區支持的 X11R6.4) XFree86 Project, Inc. 是一家生產 XFree86 的公司, 該產品是一個可以免費重複分發 開放來源碼的 X Window 系統 X Window 系統 (X11) 為應用程式以圖形方式進行顯示提供了資源, 並且它是 UNIX 和類 UNIX 的機器上最常用的視窗系統 它很小但很有效, 它運作在為數眾多的硬體上, 它對網路透明並且有良好的文件檔說明 X11 為視窗管理 事件處理 同步和客戶機間通訊提供強大的功能, 並且大多數開發人員已經熟悉了它的 API 它具有對核心封包緩衝區的內部支持, 並佔用非常少的資源, 這非常有助於記憶體相對較少的設備 X 伺服器支援 VGA 和非 VGA 圖形卡, 它對顏色深度 和 32 提供支援, 並對渲染提供內部支援 最新的發行版是 XFree 它的優點包括 : 封包緩衝區體系結構的使用提高了性能 佔用的資源相對很小, 大小在 600 K 到 700 K 位元組的範圍內, 這使它很容易在小型設備上運作 非常好的支持 : 線上有許多文件檔可用, 還有許多專用於 XFree86 開發的郵遞列表 X API 非常適合擴充 它的缺點包括 : 比最近出現的嵌入式 GUI 工具性能差 26

28 第一章 基礎篇 此外, 當與 GUI 中最新的開發像專門為嵌入式環境設計的 Nano-X 或 QT/Embedded, 相比時 XFree86 似乎需要更多的記憶體 Microwindows Microwindows 是 Century Software 的開放來源程式碼項目, 設計用於帶小型顯示單元的微型設備 它有許多針對現代圖形視窗環境的功能零件 像 X 一樣, 有多種平台支持 Microwindows Microwindows 體系結構是基於客戶機 / 伺服器的並且具有分層設計 最底層是螢幕和輸入設備驅動程式 ( 關於鍵盤或滑鼠 ) 來與實際硬體交互作用 在中間層, 可移植的圖形引擎提供對線的繪製 區域的填充 多邊形 裁剪以及顏色模型的支援 在最上層,Microwindows 支援兩種 API:Win32/WinCE API 實現, 稱為 Micro windows; 另一種 API 與 GDK 非常相似, 它稱為 Nano-X Nano-X 用在 Linux 上 它是像 X 的 API, 用於佔用資源少的應用程式 Microwindows 支援 和 8 bpp( 每圖元的位元數 ) 的 palletized 顯示, 以及 和 32 bpp 的真彩色顯示 Microwindows 還支援使它速度更快的封包緩衝區 Nano-X 伺服器佔用的資源大約在 100 K 到 150 K 位元組 原始 Nano-X 應用程式的平均大小在 30 K 到 60 K 由於 Nano-X 是為有記憶體限制的低端設備設計的, 所以它不像 X 那樣支援很多函數, 因此它實際上不能作為微型 X(Xfree86 4.1) 的替代品 可以在 Microwindows 上運作 FLNX, 它是針對 Nano-X 而不是 X 進行修改的 FLTK( 快速輕巧工具箱 (Fast Light Toolkit)) 應用程式開發環境的一個版本 本文中描述 FLTK Nano-X 的優點包括 : 與 Xlib 實現不同,Nano-X 仍在每個客戶機上同步運作, 這意味著一旦發送了客戶機請求封包, 伺服器在為另一個客戶機提供服務之前一直等待, 直到整個封包都到達為止 這使伺服器程式碼非常簡單, 而運作的速度仍非常快 佔用很小的資源 27

29 DMA270 Linux 操作流程 Nano-X 的缺點包括 : 連網功能零件至今沒有經過適當地調整 ( 特別是網路透明性 ) 還沒有太多現成的應用程式可用 與 X 相比,Nano-X 雖然近來正在加速開發, 但仍沒有那麼多文件檔說明而且沒有很好的支持, 但這種情形會有所改變 Microwindows 上的 FLTK API FLTK 是一個簡單但靈活的 GUI 工具箱, 它在 Linux 世界中贏得越來越多的關注, 它特別適用於佔用資源很少的環境 它提供了您期望從 GUI 工具箱中獲得的大多數視窗構件, 如按鈕 對話方塊 文本框以及出色的 運算器 " 選擇 ( 用於輸入數值的視窗構件 ) 還包括滑動器 捲軸 刻度盤和其他一些構件 針對 Microwindows GUI 引擎的 FLTK 的 Linux 版本被稱為 FLNX FLNX 由兩個組件構成 :Fl_Widget 和 FLUID Fl_Widget 由所有基本視窗構件 API 組成 FLUID ( 快速輕巧的用戶介面設計器 (Fast Light User Interface Designer, FLUID)) 是用來產生 FLTK 來源程式碼的圖形編輯器 總體來說,FLNX 是能用來為嵌入式環境建立應用程式的一個出色的 UI 構件器 Fl_Widget 佔用的資源大約是 40 K 到 48 K, 而 FLUID( 包括了每個窗口構件 ) 大約佔用 380 K 這些非常小的資源佔用率使 Fl_Widget 和 FLUID 在嵌入式開發世界中非常受歡迎 優點包括 : 習慣於在像 Windows 這樣已建立得較好的環境中開發基於 GUI 的應用程式的任何人都會非常容易地適應 FLTK 環境 它的文件檔案包括一本十分完整且編寫良好的手冊 它使用 LGPL 進行分發, 所以開發人員可以靈活地發放他們應用程式的許可證 FLTK 是一個 C++ 函式庫 (Perl 和 Python 綁定也可用 ) 面向物件模型的選擇是一個好的選擇, 因為大多數現代 GUI 環境都是面向物件的 ; 這也使將編寫的應用程式移植到類似的 API 中變得更容易 Century Software 的環境提供了幾個有用的工具, 諸如 ScreenToP 和 ViewML 瀏覽器 28

30 第一章 基礎篇 它的缺點是 : 普通的 FLTK 可以與 X 和 Windows API 一同工作, 而 FLNX 不能 它與 X 的不相容性阻礙了它在許多項目中的使用 Qt/Embedded Qt/Embedded 是 Trolltech 新開發的用於嵌入式 Linux 的圖形用戶介面系統 Trolltech 最初建立 Qt 作為跨平台的開發工具用於 Linux 桌上型機器 它支援各種有 UNIX 特點的系統以及 Microsoft Windows KDE 最流行的 Linux 桌面環境之一, 就是用 Qt 編寫的 Qt/Embedded 以原始 Qt 為基礎, 並做了許多出色的調整以適用於嵌入式環境 Qt Embedded 通過 Qt API 與 Linux I/O 設施直接連接 那些熟悉並已適應了面向物件編寫程式的人員將發現它是一個理想環境 而且, 面向物件的體系結構使程式碼結構化 可重用並且運作快速 與其他 GUI 相比,Qt GUI 非常快, 並且它沒有分層, 這使得 Qt/Embedded 成為用於運作基於 Qt 的程式的最緊湊環境 Trolltech 還推出了 Qt 掌上機環境 (Qt Palmtop Environment, 俗稱 Qpe) Qpe 提供了一個基本桌面視窗, 並且該環境為開發提供了一個易於使用的介面 Qpe 包含全套的個人資訊管理 (Personal Information Management (PIM)) 應用程式 網際網路客戶機器 實用程式等等 然而, 為了將 Qt/Embedded 或 Qpe 整合到一個產品中, 需要從 Trolltech 獲得商業許可證 ( 原始 Qt 自版本 2.2 以後就可以根據 GPL 獲得 ) 它的優點包括 : 面向物件的體系結構有助於更快地執行 佔用很少的資源, 大約 800 K 抗鋸齒文本和混合視訊的像素映射 它的缺點是 : Qt/Embedded 和 Qpe 只能在獲得商業許可證的情況下才能使用 29

31 DMA270 Linux 操作流程 30

32 第二章 實驗篇 第二章實驗篇 實驗 1 嵌入式 Linux 開發環境建立及核心編譯運作實驗 實驗目的 瞭解嵌入式開發環境及交叉編譯器 瞭解嵌入式 linux 的相關特性 掌握如何建立一個嵌入式 Linux 開發環境 如何利用交叉編譯器來編譯核心 實驗內容 開發環境的建立過程, 編譯嵌入式 linux 核心 實驗設備 DMA-PXA270 實驗平台 PC 機器 網路線 串列埠連接線 電源 一台運作 LINUX 桌面作業系統的 PC 機器 31

33 DMA270 Linux 操作流程 實驗原理 1. 嵌入式 linux 簡介 LINUX 是一個類似 UNIX 的作業系統, 其程式碼是完全開放的, 核心功能強大, 實現簡潔 它提供了類似 UNIX 的編寫程式介面和系統應用, 可以方便的將 UNIX 系統上的應用程式, 移植到 Linux 上運作 Linux 核心支援多種體系結構的處理器, 包括目前流行的 Intel x86,motorola/ibm PowerPC,ARM,Compaq Alpha,Sun SRARC 等處理器體系結構 要把 Linux 用於嵌入式環境, 就必須修改 Linux 滿足嵌入式系統的要求 主要集中在兩個方面 : 一是體積, 二是即時性 與目前上的眾多商業的 RTOS( 即時操作系統 ) 相比, 嵌入式 Linux 擁有以下的特點 : (1) 完全開放來源程式碼嵌入式 Linux 開放來源程式碼, 這使得學習, 修改, 剪裁 Linux 成為可能, 嵌入式系統的設計者可以對嵌入式 Linux 進行二次開發, 去掉作業系統的附加功能, 只保留必須的作業系統功能, 並且可以根據實際應用的需要優化作業系統的來源程式碼, 從而降低整個作業系統開銷與消耗 (2) 成本低 GPL 協定保證了源自 Linux 的嵌入式 Linux 也是開放來源程式碼的自由軟體, 也就是說, 只要遵守 GPL 協議, 嵌入式 Linux 作業系統的來源程式碼可以自由獲得 另外, 大多數嵌入式 Linux 使用的開發工具也是遵守 GPL 協議的, 同樣可以免費獲得 (3) 豐富的實用軟體支援 Linux 作業系統是一個完整的 功能強大的作業系統, 提供了大量的實用程式和各種各樣的應用軟體 這些軟體的正確性和有效性都經過了實際應用檢驗, 可以根據需要, 利用 Linux 提供的豐富的軟體支援, 迅速構建嵌入式應用的軟體環境 這樣可以極大地減小嵌入式系統軟體發展的時間和費用, 提高系統的可靠性 (4) 嵌入式 LINUX 的可攜性將 LINUX 移植到新的微處理器體系非常快捷, 一般是將其移植到一種新型的目標板, 其中包含有獨特的外部設計 大部分的核心程式碼都是相同的, 因為它們與微處理器無關, 所以移植的工作多集中在一些記憶體管理及中斷處理程式上 一旦完成, 它們將非常穩定 (5) 嵌入式 LINUX 的應用嵌入式系統的涵蓋面是非常廣泛的, 其中, 家電市場包括機頂盒 數位電視 視 32

34 第二章 實驗篇 訊電話 家庭網路等資訊家電 ; 工業市場包括工業控制設備 儀器 ; 商用市場包括掌上電腦 受客戶機 POS 終端等 ; 通訊市場包括 WAP 手機 無線 PDA 等 目前被廣泛看好的是資訊家電市場, 國內有很多開發廠商正加大投入 開發和研製新的產品, 嵌入式 LINUX 將是他們首選的作業系統 下面是嵌入式 Linux 的基本示意圖 : Boot Loader: 負責 Linux 核心的啟動, 它用於初始化系統資源, 包括 SDRAM 這部分程式碼用於建立 Linux 核心運作環境和從 Flash 中裝載初始化 ramdisk 核心初始化 :Linux 核心的進入點是 start_kernel() 函數 它初始化核心的其他部分, 包括捕獲 IRQ 通道 調度 設備驅動 標定延遲迴圈, 最重要的是能夠 fork init" 處理程序, 以啟動整個多工環境 系統應用函數 / 捕獲函數 : 在執行完 init" 程式後, 核心對程式不再有直接的控制權, 此後, 它的作用僅僅是處理非同步事件 ( 例如硬體中斷 ) 和為系統應用提供處理程序 設備驅動 : 設備驅動佔據了 Linux 核心很大部分 同其他作業系統一樣, 設備驅動為它們所控制的硬體設備和作業系統提供介面 檔案系統 :Linux 最重要的特性之一就是對多種檔案系統的支援 這種特性使得 Linux 很容易地同其他作業系統共存 檔案系統的概念使得用戶能夠查看儲存設備上的檔案和路徑而無須考慮實際物理設備的檔案系統類型 Linux 透明的支援許多不同的檔案系統, 將各種安裝的檔和檔案系統以一個完整的虛擬檔案系統的形式呈現給用戶 33

35 DMA270 Linux 操作流程 2. 交叉編譯器介紹 1) 交叉編譯器概述交叉編譯就是在一個平台上產生可以在另一個平台上執行的程式碼 注意這裡的平台, 實際上包含兩個概念 : 體系結構 (Architecture) 作業系統(Operating System) 同一個體系結構可以運作不同的作業系統 ; 同樣, 同一個作業系統也可以在不同的體系結構上運作 舉例來說, 我們常說的 x86 Linux 平台實際上是 Intel x86 體系結構和 Linux for x86 作業系統的統稱 ; 而 x86 WinNT 平台實際上是 Intel x86 體系結構和 Windows NT for x86 作業系統的簡稱 就本書所涉及到的目標硬體 PXA270 而言, 之所以使用交叉編譯是因為在該硬體上無法安裝我們所需的編譯器, 只好借助於宿主機器, 在宿主機器上對即將運作在目的機上的應用程式進行編譯, 產生可在目的機器上運作的程式碼格式 2)GNU 工具簡介這裡介紹在嵌入式系統開發中用得最多的 GNU 開發工具 GNU 開發工具包括 C 編譯器 GCC,C++ 編譯器 G++, 組語編譯器 AS, 鏈結器 LD, 二進位轉換工具 (OBJCOPY,OBJDUMP), 調整測試工具 (GDB,GDBSERVER,KGDB) 和基於不同硬體平台的開發函式庫 在 GNU GCC 支援下用戶可以使用流行的 C/C++ 語言開發應用程式, 滿足產生高效率運作程式碼 易掌握的編寫程式語言的用戶需求 這些工具都是按 GPL 版權聲明發佈, 任何人可以從網上獲取全部的來源程式碼, 無需使用任何費用 關於 GNU 和公共許可證協定的詳細資料, 讀者可以參看 GNU 網站的介紹, 運作於 Linux 作業系統下的自由軟體 GNU gcc 編譯器, 不僅可以編譯 Linux 作業系統下運作的應用程式, 還可以編譯 Linux 核心本身, 甚至可以作交叉編譯, 編譯運作於其他 CPU 上的程式 在這裡我們用的是 arm-linux- 工具鏈 3. 嵌入式 Linux 核心程式碼結構下面介紹的是嵌入 Linux 核心程式碼的組織結構 /arch 子目錄包含了所有硬體結構特定的核心程式碼 如 i386,alpha 和 arm. /drivers 子目錄包含了核心中所有的設備驅動程式, 如 usb 和 sound /fs 子目錄包含了所有的檔案系統的程式碼 如 nfs,ext3 和 jffs2 等 /include 子目錄包含了建立核心程式碼時所需的大部分函式庫檔案, 這個模組利用其他模組重建核心 該目錄也包括了不同平台需要的函式庫檔案 比如,asm-arm 是 arm 平台需要的函式庫檔案 34

36 第二章 實驗篇 /init 子目錄包含了核心的初始化程式碼, 核心從此處工作 /ipc 子目錄包含了處理程序間通訊程式碼 /kernel 子目錄包含了主核心程式碼 /mm 子目錄包含了所有核心管理程式碼 /net 子目錄包含了和網路相關的程式碼, 如 atm,ipv6 等 一般在每個目錄下都有一個 depend 檔和一個 Makefile 檔 這兩個檔都是編譯時使用的輔助檔 其中 Makefile 檔中指出了編譯時需要用到的編譯器, 也是移植核心過程中不可缺少的 4. 建立交叉編譯環境下面的步驟是在 LINUX 作業系統平台下做的,redhat 9.0. 建立交叉編譯環境步驟如下 : (1) 編譯工具壓縮檔 cross tar.bz2 在 DMA-PXA270 平台的配套光碟中提供了 (2) 解壓縮編譯工具檔案先進入 /usr/local 目錄, 建立一個 arm 的子目錄 ( 如果 /usr/local/arm 目錄不存在的話 ), 再進入 arm 的子目錄, 接著將光碟目錄下的 Linux 來源碼和工具 " 的 toolchain" 文件夾下的 cross tar.bz2 複製到剛剛進入的 arm 目錄下, 然後進入這個目錄, 執行命令 : tar xjvf cross tar.bz2 解壓縮後在 cross tar.bz2 的同一目錄下出現一個 的目錄, 該目錄下面有 gcc, g++, binutils, genromfs, flthdr 和 elf2flt 等各種實用工具 就這樣, 交叉編譯工具就安裝好了 (3) 將該交叉編譯工具的路徑添加到環境變數解壓縮後, 交叉編譯工具中的可執行檔在 3.4.1/bin 目錄下, 此目錄不在 LINUX 系統的可執行程式搜索目錄中, 因此需要在啟動設定裡手動添加進去, 具體做法是修改 /etc/bashrc 或用戶主目錄下的.bashrc 檔, 在檔案的最後一行增加路徑, 增加的文本如下 : export PATH=$PATH:/usr/local/arm/3.4.1/bin 這樣就將交叉編譯工具的路徑添加進去了 35

37 DMA270 Linux 操作流程 5. 編譯核心首先將光碟目錄下的 Linux 來源碼和工具 " 的檔案夾下 kernel" 目錄下的 dma-pxa270-linux cyh.tar.gz 複製到 /home 目錄, 然後進入這個目錄, 解壓縮命令如下 :tar -xzvf dma-pxa270-linux cyh.tar.gz 解壓縮完成後, 將會看到在 dma-pxa270-linux cyh.tar.gz 所在的目錄下產生一個 linux cyh 的檔案目錄 接著執行命令 make zimage 就可以進行核心的編譯了 make zimage 36

38 第二章 實驗篇 編譯過程 : 37

39 DMA270 Linux 操作流程 編譯結束 : 38

40 第二章 實驗篇 39

41 DMA270 Linux 操作流程 實驗 2 嵌入式 Linux 根檔案系統的製作實驗 實驗目的 瞭解嵌入式相關檔案系統 瞭解 Cramfs 檔案系統的相關特性 如何去製作一個 cramfs 根檔案系統 實驗內容 製作一個 cramfs 根檔案系統 實驗設備 DMA-PXA270 實驗平台 PC 機器 網路線 串列埠連接線 電源 一台運作 LINUX 桌面作業系統的 PC 機器 實驗原理 1. 嵌入式檔案系統簡介嵌入式檔案系統的結構與 LINUX 類似, 目前常用的有 EXT2,CRAMFS,JFFS2, YAFFS2 和 RAM 磁片檔案系統等 為了更好的嵌入式系統選擇檔案系統, 一般會考察檔案系統的如下幾個特性 : 可寫入檔案系統是否可以被寫入? 可更新系統重新啟動後, 檔案系統是否能保持重新啟動前的更改? 斷電可靠性檔案系統在發生斷電的時候是否可以恢復原資料? 可壓縮檔案系統內容是否可被壓縮? RAM 啟動在掛載檔案系統前, 其內容是否首先從記憶體中提取到 RAM 中? 還有一個需要考慮的問題, 那就是檔案系統的載入的方式 大多數的檔案系統是從它們的記憶體中直接被載入的, 但有時受到 ROM 或 FLASH 大小的限制, 檔案系統可能要經過壓縮放在記憶體中, 這時就需要在 RAM 中分配一塊區域將檔案系統解壓縮後, 再將這區塊記憶體載入到系統中, 這就需要一個稱為 RAM Disk" 的技術 40

42 第二章 實驗篇 核心可以從記憶體中導出 RAM 的映像檔, 作為它的根檔案系統來使用 在啟動時, 核心首先檢查引導選項是否存在一個 initird 如果有, 核心就從指定的儲存介質中獲得壓縮或是未壓縮的檔案系統的映像檔, 並且導入到 RAM 中, 將其掛載作為自己的根檔案系統 2. 嵌入式 Linux 檔案系統分類說明下面主要介紹幾種比較常用的檔案系統 : ROMfs 檔案系統 : ROMfs 是使用最多的檔案系統, 它是一種簡單 緊湊和唯讀的檔案系統 ROMfs 順序儲存檔資料, 並可以在 uclinux 支援的儲存設備上直接運作檔案系統, 這樣可以在系統運作時節省許多 RAM 空間 Cramfs 檔案系統 : Cramfs 是針對 Linux 核心 2.4 之後的版本所設計的一種新型檔案系統, 也是壓縮和唯讀格式的 它主要的優點是將檔案資料以壓縮形式儲存, 在需要運作的時候進行解壓縮 由於它儲存的檔形式是壓縮的格式, 所以檔案系統不能直接在 Flash 上運作 雖然這樣可以節約很多 Flash 儲存空間, 但是檔案系統運作需要將大量的資料複製進 RAM 中, 消耗了 RAM 空間 JFFS2 日誌檔案系統 : JFFS2 是專門針對快閃記憶體的檔案系統, 除了有日誌功能, 還有負載平衡, 垃圾收集等, 並且來源碼公開 YAFFS2(Yet Another Flash File System) 檔案系統 : YAFFS2 是一種和 JFFSx 類似的快閃記憶體檔案系統, 和 JFFS2 相比它減少了一些功能, 所以速度更快, 而且對記憶體的佔用比較小.YAFFS 自已 NAND 晶片驅動, 並且為嵌入式系統提供了直接取用檔案系統的 API 除了上面介紹的檔案系統之外, 還有 RAMDISK( 一種基於記憶體的檔案系統 ), TrueFFS 等等 3. 根檔案系統相關說明 Linux 核心在系統啟動時的最後操作之一就是載入根檔案系統 根檔案系統中存放了嵌入式系統使用的所有應用程式庫以及一些需要用到的服務 由於 Linux 受到 UNIX 系統發展的影響,Linux 檔案系統的組織和 UNIX 相同 根檔案系統的結構根檔案系統中每一個最上層目錄都有特定的用途和目的 有些目錄是為了多用戶模 41

43 DMA270 Linux 操作流程 式服務 在大多數沒有用戶和管理員的嵌入式 Linux 中, 建立一個根檔案系統可以 不考慮大部分在多用戶下需要注意的問題, 下表列出了根檔案系統頂層目錄大致結 構 目錄 內容 bin 基本命令的可執行檔 boot 核心及啟動需要用到的一些檔 Dev 設備檔 Etc 系統配置檔, 包括啟動檔 Home 用戶目錄 Lib 基本函式庫, 例如 c 庫和核心模組 Mnt 臨時映射檔案系統的映射點 ( 映射目標 ) Proc 核心及處理程序資訊的虛擬檔案系統 Root Root 用戶目錄 Sbin 用於系統管理的可執行程式 Tmp 暫存檔案, 在 SDRAM 中建立 Usr 該目錄的二級目錄包含大部分對大多數用戶很有 用的應用程式和文件檔 Var 存放系統日誌或一些服務程式的暫存檔案 實驗步驟 下面的步驟主要是介紹如何來製作一個 cramfs 根檔案系統 (1) 將 PXA270P_camare_demo.cramfs 複製到任意目錄下 (2) 在該目錄下建立兩個檔案 : mkdir chang mkdir guo (3) 將 PXA270P_camare_demo.cramfs 掛載到 chang 目錄 mount PXA270P_camare_demo.cramfs chang o loop (4) 將 chang 目錄下的內容壓縮 cd chang tar cvf /chang 的上一級目錄 /1.tar./ 這樣將在 chang 的上一級目錄產生一個 1.tar 的壓縮檔 42

44 第二章 實驗篇 (5) 將壓縮檔解壓縮到 guo 目錄下 umount chang ; 卸載掛載 cd.. ; 進入上一級目錄 mv 1.tar guo ; cd guo ; tar xvf 1.tar ; 將壓縮檔的根檔案系統的裡的內容解壓縮 rm 1.tar (6) 將自己的驅動 gpiodrv.o 和應用程式 gpio_test 複製到相對應的目錄下將 gpiodrv.o 複製到 guo/usr/ 目錄下將 gpio_test 複製到 gpio_test 下 (7) 經過上面的步驟就可以將自己的驅動和應用程式添加到 cramfs 根檔案系統中了現在將開始製作 cramfs 根檔案系統先將 mkcramfs 檔複製到 guo 所在的目錄在這個目錄下運作命令 : mkcramfs guo root_tmp.cramfs 運作成功後, 會在該目錄下產生 PXA270P_camare_demo1.cramfs 根檔案系統 (8) 上面的步驟教你如何將自己的驅動和引用程式添加到根檔案系統中 43

45 DMA270 Linux 操作流程 實驗 3 嵌入式 Linux 驅動程式添加實驗 實驗目的 瞭解嵌入式 Linux 系統中驅動程式的開發過程 掌握如何來運作和載入驅動程式 實驗內容 在嵌入式 Linux 系統中, 添加一個驅動程式 實驗設備 DMA-PXA270 實驗平台 PC 機器 網路線 串列埠連接線 電源 一台運作 LINUX 桌面作業系統的 PC 機器 實驗原理 1.linux 設備驅動程式概述設備驅動可以理解為作業系統的一部分, 對於一個特定的硬體設備來說, 其對應的設備驅動程式是不同的 比如網路卡, 音效卡, 鍵盤, 滑鼠, 顯卡等 對於作業系統來說, 掛載的設備越多, 所需要的設備驅動程式也越多 對於嵌入式系統設計過程中, 沒有通用的驅動程式可使用 設備驅動程式是 Linux 核心的重要組成部分 像作業系統的其他部分一樣, 驅動程式在一個高優先順序的環境下工作, 如果發送錯誤則可能會引起嚴重的問題 設備驅動程式控制了作業系統和硬體設備之間的交互作用 2.Linux 設備驅動程式介面系統應用是作業系統核心與應用程式之間的介面, 驅動程式則是作業系統核心與機器硬體的介面 設備驅動程式能夠直接取用硬體的程式碼, 必須為應用程式提供系統應用 以便應用程式能取用設備 在 LINUX 中, 主要有三種設備即 : 字元設備 區塊設備和網路設備, 與此相關主要有三類設備驅動程式 : 字元設備驅動程式 區塊設備驅動 44

46 第二章 實驗篇 程式和網路設備驅動程式. 他們的系統是一致的, 採用統一的介面 ( 在資料結構 file_operations 中 ) 應用程式使用設備就像使用讀寫普通的檔案一樣方便, 使用相同的 open( ),close(),read(),write() 等, 真正做到了與設備無關 通常 Linux 驅動程式介面分為如下四層 : (1) 應用程式處理程序與核心的介面 ; (2) 核心與檔案系統的介面 ; (3) 檔案系統與設備驅動程式的介面 ; (4) 設備驅動程式與硬體設備的介面 每個驅動程式都有個 file_operations 的資料結構, 包含了一系列的函數指標, 可以指向自己所開發的介面如 open() 等 核心中有兩個表, 一個用於字元設備驅動程式, 一個用於區塊設備驅動程式 這個兩個表用於儲存指向 file_operation 資料結構的指標, 驅動程式內部函數的位址儲存在這一結構 字元設備字元設備 (char device) 和普通檔案系統的區別 : 普通檔案系統可以來回讀 / 寫, 而大多字元設備僅僅是資料通道, 只能順序讀 / 寫 字元設備上 Linux 最簡單的取用, 可以像檔案一樣取用 應用程式使用標準系統應用打開, 讀取, 寫入和關閉, 完全好像這個設備是一個普通檔案一樣 初始化字元設備時, 它的設備驅動程式向 Linux 登記, 並在字元設備向量表中增加一個 device_struct 資料結構條目, 這個設備的主設備識別字 ( 例如, 對於 tty 設備的主設備識別字是 4) 用做這個向量表的索引 一個設備的主設備識別字是固定的 Chrdevs 向量表維護已經登記的字元設備檔 區塊設備區塊設備 (block device) 是檔案系統的物質基礎, 它也支援像檔案一樣取用 這種為打開的區塊特殊檔提供正確的檔案系統操作組的機制和字元設備的十分相似 Linux 用 blkdevs 向量表維護已經登記的區塊設備檔 它像 chrdevs 向量表一樣, 使用設備的主設備號作為索引 與字元設備不同, 區塊設備進行分類,SCSI 是其中一類, 而 IDE 是另一類 網路設備驅動對於每一個網路介面, 都用一個 device 的資料結構表示 通常, 網路設備是一個物理設備, 如乙太網路卡, 但軟體也可以作為網路設備, 典型的是回送設備 (loopback). 在核心啟動時, 系統通過網路設備驅動程式登記已經存在的網路設備 設備用標準的支援網路的機制來把收到的資料轉送到相對應的網路層 關於網路設備驅動更詳細的資訊請查看相關資料 45

47 DMA270 Linux 操作流程 3. 設備驅動程式的設備號和進入點 Linux 系統通過設備號來區分不同設備 設備號由兩部分組成 : 主設備號和次設備號 主設備號指明對應哪些設備驅動, 這種對應關係是固定不變並作為核心資源的一部分存在 需要注意的是, 同一個主設備號可以對應兩個不同的設備驅動, 一個可以是字元設備另一個可以是區塊設備 次設備號區分被一個設備驅動控制下的某個獨立的設備 比如, 同一個類型的 USB 設備可以在系統中有幾個, 它們通過次設備好加以區分, 而設備驅動可以只對應一個 在 /proc/devices 中列出了系統中處於活動狀態設備的主設備號, 所謂的活動狀態是指與該設備對應的設備驅動已經被系統核心裝載 設備進入點也可以理解為 設備檔控制碼 ", 一個設備的進入點和磁片上的普通檔案系統一樣, 可以刪除 (rm), 移動 (mv) 和複製 (cp) 等 我們可以在檔案系統中使用 mknod 命令建立一個設備進入點或者通過系統應用 mknof 來建立 在檔案系統中建立了設備進入點並沒有代表回應的設備驅動和硬體已經準備好, 只是代表了和設備驅動通訊的一部分 下面給一個建立字元設備進入點的實例 : Mknod /dev/testchar c 其中 c 代表字元設備, 如果想建立區塊設備則用 b 代替 c 參數 100 代表該設備的主設備號,0 代表該設備的次設備號 對於現有 Linux 作業系統,/dev 目錄是必不可少的, 這個目錄包含了所有 Linux 系統所知道的字元設備, 區塊設備和網路設備 操作字元設備的方法非常簡單 打開一個字元設備就像打開一個文字檔案一樣, 只不過讀 / 寫 檔案 " 的操作實際上是操作設備的過程, 可以使用正常的檔案操作命令 cat 或者外殼重置向語法實現和設備的資料交換 4.Linux 驅動程式的載入在 LINUX 下載入驅動程式可以採用動態和靜態兩種方式 靜態載入就是把驅動程式直接編譯到核心裡, 系統啟動後可以直接應用 靜態載入的缺點是調整測試起來比較麻煩, 每次修改一個地方都要重新編譯下載核心, 效率較低 動態載入利用了 LINUX 的 module 特性, 可以在系統啟動後用 insmod 命令把驅動程式 (.o 檔 ) 添加上去, 在不需要的時候用 rmmod 命令來卸載 在桌上型機器上一般採用動態載入的方式 在嵌入 46

48 第二章 實驗篇 式產品裡可以先用動態載入的方式來調整測試, 調整測試完畢後再編譯到核心裡 設備驅動程式在載入時首先需要應用入口函數 init_module(), 該函數完成設備驅動的初始化工作, 比如暫存器設置位元, 結構體附值等一系列工作 其中最重要的一個工作就是向核心註冊該設備, 對於字元設備應用 register_chrdev() 完成註冊, 對於區塊設備需要應用 register_blkdev() 完成註冊 註冊成功後, 該設備獲得了系統分配的主設備號, 自定義的次設備號, 並建立起與檔案系統的關聯 設備在卸載的時候, 需要回收回應的資源, 令設備的回應暫存器值重置並從系統中登出該設備 系統應用部分則是對設備的操作過程, 比如 open,read,write,ioctl 等操作 Linux 下字元設備驅動的添加本節將以實例的方式介紹如何在一個字元設備驅動裡面實現對 GPIO 埠的操作 功能說明 : 在模組載入的時候跑馬燈運作起來 模組卸載的時候, 跑馬燈停止 DMA-PXA270 上的 2 個 LED 指示燈 LED3 和 LED5 由 2 個 I/O 埠控制, 它們分別是 : GPIO97,GPIO107 當 GPIO97,GPIO107 輸出低電位的時候, 相對應的 LED 指示燈亮 1. 字元設備的驅動根源程式 gpiodrv.c 編寫符合上面功能的驅動根源程式 gpiodrv.c, 根源程式的程式碼如下 : #include <linux/config.h> #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/iobuf.h> #include <linux/kernel.h> #include <linux/major.h> #include <asm/uaccess.h> #include <asm/hardware.h> #include <asm/arch/mainstone.h> #include <asm/io.h> #include <linux/vmalloc.h> #define IOPORT_MAJOR 220 /* 定義主設備號 */ 47

49 DMA270 Linux 操作流程 int gpio_open(struct inode*,struct file*); // 函數聲明 int gpio_release(struct inode*,struct file*); int gpio_ctl_ioctl(struct inode*,struct file*,unsigned int,unsigned long); static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, }; /* 所有的作業系統將硬體設備當作檔案處理, 所有外部設備的操作就封裝在這個 file_operations 結構體裡面就是檔案的 open/read/write/close 等操作, 剩餘的都放到一個 ioctl 函數裡面做處理 /******************************************************************/ ** 函數名稱 : LedOn ** 功能描述 : 使相對應的 LED 燈亮 ** 輸入 : 無 ** 輸出 : 無 ** 總體變數 : 無 ** 應用模組 : 無 *******************************************************************/ void LedOn(int led) { switch(led) { case 0: GPCR3 = 1<<10; break; case 1: GPCR3 = 1<<1; break; case 2: GPCR3 = 1<<6; 48

50 第二章 實驗篇 break; case 3: GPCR3 = 1<<11; break; case 4: GPCR3 = 1<<11; break; case 5: GPCR3 = 1<<12; break; default: break; } } static int LedStatus; void LedSet(int led) { LedStatus = led; if(ledstatus&1) LED1_ON(); else LED1_OFF(); if(ledstatus&2) LED2_ON(); else LED2_OFF(); if(ledstatus&4) LED3_ON(); else LED3_OFF(); if(ledstatus&8) LED4_ON(); else 49

51 DMA270 Linux 操作流程 LED4_OFF(); } //LED 顯示 /************************************************************************* **** ** 函數名稱 : LedOff ** 功能描述 : 使相對應的 LED 燈滅 ** 輸入 : 無 ** 輸出 : 無 ** 總體變數 : 無 ** 應用模組 : 無 ************************************************************************** ***/ void LedOff(int led) { switch(led) { case 0: GPSR3 = 1<<10; break; case 1: GPSR3 = 1<<1; break; case 2: GPSR3 = 1<<6; break; case 3: GPSR3 = 1<<11; break; case 4: GPSR3 = 1<<11; break; case 5: 50

52 第二章 實驗篇 } GPSR3 = 1<<12; break; default: break; } static int init gpio_init(void) { int err=0; printk("gpio_init\n"); err=register_chrdev(ioport_major,"gpio",&gpio_ctl_fops); if(err) { printk("fail to register\n"); return -1; } printk("success to register\n"); return 0; } int gpio_open(struct inode *inode,struct file *fllp) { //D4,D5 in cpu board GAFR0_L &= ~((3<<6) (3<<8)); GPDR0 = (1<<3) (1<<4); GPSR0 = (1<<3) (1<<4); //D1,D2,D3,D4 in device board GAFR2_U &= ~(3<<18); GPDR2 = 1<<25; GPSR2 = 1<<25; GAFR3_L &= ~((3<<0) (3<<22) (3<<24)); GPDR3 = (1<<0) (1<<11) (1<<12); GPSR3 = (1<<0) (1<<11) (1<<12); 51

53 DMA270 Linux 操作流程 } printk("open gpio devices\n"); return 0; int gpio_release(struct inode *inode,struct file *filp) { printk("release this device\n"); return 0; } int gpio_ctl_ioctl(struct inode *inode,struct file *flip,unsigned int command,unsigned long arg) { int err=0; if(command==1){ while(arg--) { while(1) { LedOn(i); Sleep(100); LedOff(i); Sleep(100); i++; if(i>=6) i = 0; } printk("..."); } printk("\n"); return 0; } return err; 52

54 第二章 實驗篇 } module_init(gpio_init); module_exit(gpio_release); 2. 驅動根源程式中相關函數函數說明 file_operations 資料結構,inode 資料結構和 file 資料結構核心通過 file 結構識別設備, 通過 file_operations 資料結構提供檔案系統的進入點函數, 也就是取用設備驅動的函數 file_operations 定義在 <linux/fs.h> 中的函數指標表 這個結構中的每一個成員的名字都對應著一個系統應用 在用戶處理程序利用系統應用對設備檔進行諸如 read/write 操作時, 系統應用通過設備檔的主設備好找到相對應的設備驅動程式, 然後讀取這個資料結構相對應的函數指標, 接著把控制權交給該函數, 這是 Linux 的設備驅動程式工作的基本原理 從某種意義上說, 寫驅動程式的任務之一就是完成 file_operations 中的函數指標 檔案系統處理的檔案所需要的資訊在 inode( 索引結點 ) 資料結構中 inode 資料結構提供了關於特別設備檔 /dev/drivername( 這裡的 DriverName 可能是任何一個設備檔, 如 hda0) 的資訊 file 資料結構主要用於與檔案系統對應的設備驅動程式使用 當然, 其他設備驅動程式也可以使用, 它提供有關被打開的檔案的資訊 register_chrdev 函數設備驅動程式所提供的進入點, 在設備驅動程式初始化的時候向系統進行登記, 以便系統適當的時候應用 在 Linux 系統中, 通過應用 register_chrdev 向系統註冊字元型設備驅動程式 register_chrdev 在 fs/devices.c 文件中的定義如下 int register_chrdev(unsigned int major,const char *name,struct file_operations *fops) 參數中的 major 是為設備驅動程式向系統申請的主設備, 如果 major 為 0, 則系統為該設備驅動程式動態分配一個主設備號, 不過系統分配的這個主設備是臨時的 在這裡我們的 major 為 220(IOPORT_MAJOR), 這樣該字元設備驅動程式的主設備號為 220, name 是設備名, 這裡設備名為 gpio fops 就是前面所說的對各個應用的入口的說明, 在這裡,fops 為 gpio_ctl_fops register_chrdev 函數返回 0 表示成功, 返回 -INVAL 表示申請的主設備號非法, 一般來說是主設備號大於系統所允許的最大設備號 返回 -EBUSY 表示所申請的主設備號正被其他設備驅動程式使用 如果動態分配主設備號成功, 則此函數將返回所分配的主設備號 如果 register_chardev 操作成功, 則設備名就會出現在 /proc/devices( 教學平台的嵌入式 Linux 平台下 ) 檔案中, 可以通過 cat /proc/devices 來查看工作設備的資訊 53

55 DMA270 Linux 操作流程 3. 該驅動程式的 Makefile 檔該驅動程式的 Makefile 的檔如下 : ################################################################### CROSS= /usr/local/arm/3.3.2/bin/arm-linux- CFLAGS=-D KERNEL CFLAGS+=-DMODULE CFLAGS+=-I/work/cgf/DMA-PXA270/linux cyh/include CFLAGS+=-I/work/cgf/DMA-PXA270/linux cyh /include/linux CFLAGS+=-I/usr/local/arm/3.3.2/arm-linux/include CFLAGS+=-Wall -Wstrict-prototypes -Wno-trigraphs -Os -mapcs CFLAGS+=-fno-strict-aliasing -fno-common -fno-common -pipe -mapcs-32 CFLAGS+=-march=armv4 -mtune=arm9tdmi -mshort-load-bytes -msoft-float CFLAGS+=-DKBUILD_BASENAME=gpiodrv all:gpiodrv.o gpiodrv.o:gpiodrv.c $(CROSS)gcc $(CFLAGS) -c -o gpiodrv.o gpiodrv.c clean: rm -f *.o ########################################################################## ## 注意 :(1)CROSS=/usr/local/arm/3.3.2/bin/arm-linux- 交叉編譯器的位置要設定正確 (2)CFLAGS+=-I/work/cgf/DMA-PXA270/linux cyh/include CFLAGS+=-I/work/cgf/DMA-PXA270/linux cyh /include/linux CFLAGS+=-I/usr/local/arm/3.3.2/arm-linux/include 這幾個函式庫檔的路徑也要設定正確將 gpiodrv.c 和這個 Mafile 放置在同一個新建目錄下, 進入這個目錄, 輸入 make 後, 編譯成功後將在這個目錄下產生一個 gpiodrv.o 的文件 將 gpiodrv.o 下載到 /tmp 目錄下 ( 可以通過 ftp,zx 下載 ) 動態載入設備驅動模組 :insmod gpiodrv.o 如果載入成功, 可以通過 cat /proc/devices 查看該設備的相關資訊 54

56 第二章 實驗篇 卸載設備驅動模組 :rmmod gpiodrv 4. 該驅動相對應的測試程式 gpio_test.c gpio_test.c 測試程式的來源碼如下 : #include <stdio.h> #include <stdlib.h> //system #include <fcntl.h> #include <errno.h> #include <unistd.h> #include <linux/delay.h> #include <sys/ioctl.h> #define DEVICE_GPIOTEST "/dev/gpio" // 設備節點 int main(int argc, char *argv[]) { int fd; int val=-1; fd=open(device_gpiotest,o_rdonly);// 打開設備 if(fd<0) { perror("can not open device"); exit(1); } while(1){ printf("please select number to run program\n"); printf("1:led on \n2:quit "); scanf("%d",&val); if(val==1) ioctl(fd,1,10); else if(val==2){ close(fd); } } return 0; 55

57 DMA270 Linux 操作流程 } 將 gpio_test.c 放置在一個新建目錄下, 進入該目錄下, 輸入命令 : /usr/local/arm/3.3.2/bin/arm-linux-gcc o gpio_test gpio_test.c 編譯成功後, 將在該目錄下產生 gpio_test 可執行檔, 要注意交叉編譯工具 arm-linux-gcc 的路徑要設定正確, 這裡是 /usr/local/arm/3.3.2/bin 5. 實驗過程下面將介紹該驅動的測試過程, 步驟如下 : (1) 先讓 DMA-PXA270 教學平台進入 Linux 環境, 利用超級終端來顯示,Linux 進入命令行的模式下 (2) 輸入命令 cd /tmp, 進入 tmp 目錄, 因為 /tmp 是在 SDRAM 中, 可以放資料 (3) 將 gpiodrv.o 和 gpio_test 下載到 /tmp 目錄下 在這裡我們採用的的 rz 命令來傳輸的, 也可以利用 ftp 來傳輸,rz 命令是通過 Zmodem 協議來傳輸的 先在教學平台的下輸入 rz 命令 (Linux 環境下 ), 接著以滑鼠按下超級終端的 傳送 " > 傳送檔案 ", 在彈出的對話方塊中設定如下 : 然後以滑鼠按下發送 資料傳輸完後, 再按下 ENTER, 接著通過 ls 來查看 /tmp 目錄下是否有 gpiodrv.o 檔,gpio_test 的下載過程是一樣的 (4) gpiodrv.o 和 gpio_test 下載成功後, 接下來我們要進行真正的載入和運作的工作了 改變 gpio_test 的屬性, 命令如下 : chmod 755 gpio_test (5) 載入 gpiodrv.o 模組 :insmod gpiodrv.o (6) 建立 gpio 設備節點 :mknod /dev/gpio c

58 第二章 實驗篇 /dev/gpio 為該設備驅動程式的設備名稱,c 表明該設備為字元設備,220 為該設備的主設備號,0 為從設備號 (7) 執行 gpio_test 程式 :./gpio_test gpio_test 程式運作起來後, 有相對應的功能選項說明 6. 將應用程式添加到根檔案系統上面的過程主要用於調整測試, 斷電之後不能儲存, 要將程式燒錄, 需要將該程式和模組添加到根檔案系統中 這裡我們以向 PXA270 光碟附帶的 root_tmp.cramfs 根檔案系統的添加為例 (1) 將 root_tmp.cramfs 複製到任意目錄下 (2) 在該目錄下建立兩個檔 : mkdir chang mkdir guo (3) 將 root_tmp.cramfs 掛載到 chang 目錄 mount chang root_tmp.cramfs o loop (4) 將 chang 目錄下的內容壓縮 cd chang tar cvf /chang 的上一級目錄 /1.tar./ 這樣將在 chang 的上一級目錄產生一個 1.tar 的壓縮檔 (5) 將壓縮檔解壓縮到 guo 目錄下 cd.. ; 進入上一級目錄 mv 1.tar guo ; cd guo ; tar xvf 1.tar ; 將壓縮檔的根檔案系統的東西解壓縮 rm 1.tar (6) 將自己的 gpiodrv.o 和 gpio_test 複製到相對應的目錄下 將 gpiodrv.o 複製到 guo/usr/ 目錄下將 gpio_test 複製到 gpio_test 下 (7) 經過上面的步驟就可以將自己的驅動和應用程式添加到 cramfs 根檔案系統中了現在將開始製作 cramfs 根檔案系統先將 mkcramfs 檔複製到 guo 所在的目錄在這個目錄下運作命令 : mkcramfs guo root_tmp.cramfs 57

59 DMA270 Linux 操作流程 運作成功後, 會在該目錄下產生 root_tmp.cramfs 根檔案系統 (8) 根檔案系統製作成功後, 就可以將它燒寫到相對應的地方, 關於根檔案系統的燒寫, 在前面的章節有詳細說明 (9) 上面的步驟只是教你如何將自己的驅動和引用程式添加到根檔案系統中, 如果需要自動載入驅動, 則需要將相關命令添加到 linuxrc 文件中 58

60 第二章 實驗篇 實驗 4 嵌入式 Linux 下彩色 LCD 驅動的設計與實現 實驗目的 瞭解 PXA270 的 LCD 介面 介紹了如何在嵌入式 Linux 下開發彩色 LCD 顯示驅動的方法 瞭解 Linux 下的顯示驅動結構和框架 實驗內容 嵌入式 Linux 下 LCD 驅動程式的添加, 以及圖形介面的載入 實驗設備 DMA-PXA270 實驗平台 PC 機器 網路線 串列埠連接線 電源 VGA 資料線 VGA 顯示器 VGA 電源 實驗原理 1.PXA270 的 LCD 控制器介紹 PXA270 的 LCD 控制器支持 DSTN,TFT 以及帶內部 frame buffering 的 LCD 功能 : 顯示模式 支援單或雙掃描顯示模式 ; 可以支援單色到 256 色灰階模式 ; TFT 模式下可以支援到 色 (24 位 ); DSTN 模式下可以支援到 色 (24 位 ); 支援帶內部封包緩衝區的 LCD 顯示面板 支援 8 位元被動的雙掃描彩色顯示 ; 對於沒有內部封包緩衝區的 LCD, 最高可以支援 18bpp 單掃描彩色顯示 ; 對於帶內部封包緩衝區的 LCD, 最高可以支援 24bpp 的單掃描彩色顯示 支援的顯示大小範圍從 1x1 到 800x600 像素 64 個 (24 位 ) 輸出 FIFO 入口 59

61 DMA270 Linux 操作流程 支援 2,4,8,16,18 和 24 的 RGB 顯示格式 在單掃描方式下可以支援一個基本層疊加二個另外的兩個層 整合七個 DMA 通道 ( 一個通道為基本面, 一個通道為覆蓋面 1, 三個通道為覆 蓋面 2, 一個通道為硬體游標, 和一個通道為命令資料 ) 支援硬體游標 硬體支援 YcbCr 到 RGB 顏色的轉換 可編寫程式的像素時脈可以從 52MHz 到 25.4kHz(104.0MHz/2 到 13MHz/512) 六個 16x64 位元輸入 FIFOS 等等其他的功能 PXA270 的 LCD 控制器的接腳說明 : 信號名稱 類型 說明 LDD<17:0> 雙向 像素資料線 ( 可以傳輸 4,8,16 或 18) L_PCLK_WR 輸出 像素時脈, 在 DSTN 模式下, 像素時脈只需在資料接 腳的資料有效的時候穩定就可以了 ; 在 TFT 模式下, 當資料在資料線上有效時, 像素時脈必須一直有效, 並且 AC 編轉接腳被用作輸出信號 L_LCLK_A0 輸出 線時脈信號 在 TFT 模式下, 作為水平同步信號 如果使用內部封包緩衝區的 LCD, 這個信號線可以作為指定命令和資料傳輸的控制信號 L_FCLK_RD 輸出 封包時脈, 一個新封包的開始信號, 重置指示器到螢幕的頂部 在 TFT 顯示模式下, 該信號作為垂直同步信號 對於帶內部封包緩衝的 LCD, 該信號位元讀取信號 L_BIAS 輸出 AC 偏轉信號, 切換電源的極性使螢幕的行列像素線來中和直流偏移量 在 TFT 模式下, 當資料通過像素時脈在資料接腳上被鎖存的時候, 這個信號被用來輸出致能信號 L_CS 輸出 用於內部緩衝區的 LCD, 這個信號作為晶片選擇信號 L_VSYNC 輸入 由內部緩衝區的 LCD 產生的刷新同步信號 60

62 第二章 實驗篇 LCD 控制器提供多種可編寫程式的選項, 比如顯示類型, 解析度, 封包緩衝, 像素深度, 疊加, 硬體滑鼠和輸出資料模式 儘管所有的可編寫程式組合使可能, 但有效的顯示選擇需要這些可編寫程式的選項進行實踐的 外部記憶體系統的類型限制了 LCD DMA 控制器的頻帶寬, 依次限制了被控制的解析度和顯示螢幕的類型 不像其他外部設備,LCD 控制器連接到 PXA27X 處理器的系統匯流排 功能塊圖 LCD 控制器支援硬體游標和三個圖像層, 基本, 疊加 1, 和疊加 2 三個圖像層的聯合允許多幅圖同時顯示在軟體控制的視窗大小和位置 LCD 控制器的功能圖如下 : 像素時脈頻率計算對於 pssive(dstn) 和 active(tft) 顯示, 像素時脈分頻域 (LCCR[PCD]), 以及 PCD 除數選擇 (LCCR4[PCDIV]) LCCR3[PCD] 的取值範圍從 0 到 255, 產生的頻率範圍從 61

63 DMA270 Linux 操作流程 LCLK/2 到 LCLK/512 正常操作模式下 LCLK 頻率變化可以從 26.0MHz 到 104.0MHz 當工作在深度空閒模式或者 PLL 被禁止的正常模式下,LCLK 工作在 13MHz 另外, 在深度空閒模式下, 通過設定 CCCR[26MHz]LCLK 可以被配置工作在 26MHz 像素時脈頻率被調節用來滿足螢幕需求的刷新頻率 刷新頻率依賴幾個因素 : 目標顯示螢幕需要的像素的數目 ; 選擇的是單掃描還是雙掃描模式 ; 選擇的是單色還是彩色模式 ; 在每一行的開始和結束, 像素時脈的等待週期數目 ; 在 active(tft) 模式下, 垂直同步信號的寬度 ; 封包時脈的寬度 在封包傳輸的過程中所有的這些因素改變時脈週期 不同的顯示螢幕廠家要求不同的封包刷新速率, 依賴於顯示螢幕的物理特性 使用 LCCR3[PCD] 和 LCCR4[PCDDIV] 來改變像素時脈頻率來滿足這些需求 如果 LCCR4[PCDDIV] 被清除, 那麼像素時脈頻率能夠使用下面的兩個公式來計算 像素時脈頻率 =LCLK/2(PCD+1) PCD=LCLK/2( 像素時脈頻率 )-1 如果 LCCR4[PCDDIV] 被設定, 像素時脈頻率可以由下面的兩個等式來計算 像素時脈頻率 =LCLK/(PCD+1) PCD=LCLK( 像素時脈頻率 )-1 像素格式 PXA270 的 LCD 控制器基本的調色點陣圖格式和幾種原始的 RGB 資料格式 調色板和 RGB 格式都支援透明格式 關於詳細的像素格式, 請查看 PXA270 的手冊 Active(TFT) 模式時序對於 active(tft)lcd 控制面板, 控制線和像素線的時序圖如下 : 62

64 第二章 實驗篇 在 Active 模式下的接腳配置說明 63

65 DMA270 Linux 操作流程 2.Linux 下的 LCD 設備驅動介紹封包緩衝 (framebuffer) 是 Linux 為顯示設備提供的一個介面, 把顯存抽像的一種設備, 他允許上層應用程式在圖形模式下直接對顯示緩衝區進行讀寫操作 這種操作是抽像的 統一的 用戶不必關心物理顯存的位置 換頁機制等等具體細節 這些都是由 Framebuffer 設備驅動程式來完成的 封包緩衝驅動的應用廣泛, 在 linux 的桌面系統, Xwindow 伺服器就是利用封包緩衝進行視窗的繪製 尤其是通過封包緩衝可顯示漢字點陣, 成為 Linux 漢化的唯一可行方案 封包緩衝設備對應的設備檔為 /dev/fb*, 如果系統有多個顯示卡,Linux 下還可支援多個封包緩衝設備, 最多可達 32 個, 分別為 /dev/fb0 到 /dev/fb31, 而 /dev/fb 則為當前預設的封包緩衝設備, 通常指向 /dev/fb0 當然在嵌入式系統中支援一個顯示設備就夠了 封包緩衝設備為標準字元設備, 主設備號為 29, 次設備號則從 0 到 31 分別對應/dev/fb0 ~/dev/fb31 通過/dev/fb, 應用程式的操作主要有這幾種 : (1) 讀 / 寫 (read/write)/dev/fb: 相當於讀 / 寫螢幕緩衝區 例如用 cp /dev/fb0 tmp 命令可將當前螢幕的內容複製到一個檔案中, 而命令 cp tmp>/dev/fb0 則將圖形檔案 tmp 顯示在螢幕上 (2) 映射 (map) 操作 : 由於 Linux 工作在保護模式, 每個應用程式都有自己的虛擬位址空間, 在應用程式中是不能直接取用物理緩衝區位址的 為此,Linux 在檔案操作 file_operations 結構中提供了 mmap 函數, 可將檔案的內容映射到用戶空間 對於封包緩衝設備, 則可通過映射操作, 可將螢幕緩衝區的物理位址映射到用戶空間的一段虛擬位址中, 之後用戶就可以通過讀寫這段虛擬位址取用螢幕緩衝區, 在螢幕上繪圖了 實際上, 使用封包緩衝設備的應用都是通過映射操作來顯示圖形的 由於映射操作都是由核心來完成, 下面我們將看到, 封包緩衝驅動需要做的工作不多 (3) I/O 控制 : 對於封包緩衝設備, 對設備檔案的 ioctl 操作可讀取 / 設定顯示設備及螢幕的參數, 如解析度, 顯示顏色數, 螢幕大小等等 Ioctl 的操作是由底層的驅動程式來完成的 在應用程式中, 操作 /dev/fb 的一般步驟如下 : a. 打開 /dev/fb 設備檔案 b. 用 ioctrl 操作取得當前顯示螢幕的參數, 如螢幕解析度, 每個像素點的 Bit 數 根據螢幕參數可計算螢幕緩衝區的大小 c. 將螢幕緩衝區映射到用戶空間 d. 映射後就可以直接讀寫螢幕緩衝區, 進行繪圖和圖片顯示了 64

66 第二章 實驗篇 典型程式段如下 : #include <linux/fb.h> int main() { int fbfd = 0; struct fb_var_screeninfo vinfo; struct fb_fix_screeninfo finfo; long int screensize = 0; /* 打開設備文件 */ fbfd = open("/dev/fb0", O_RDWR); /* 取得顯示螢幕相關參數 */ ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo); ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo); /* 計算顯示螢幕緩衝區大小 */ screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; /* 映射螢幕緩衝區到用戶地址空間 */ fbp=(char*)mmap(0,screensize,prot_read PROT_WRITE,MAP_SHARED, fbfd, 0); /* 下面可通過 fbp 指針讀寫緩衝區 */ } 3. 封包緩衝區驅動的編寫封包緩衝設備屬於字元設備, 採用 檔案層 - 驅動層 " 的介面方式 在檔案層次上,Linux 為其定義為 : static struct file_operations fb_fops = { owner: THIS_MODULE, read: fb_read, /* 讀取操作 */ write: fb_write, /* 寫入操作 */ ioctl: fb_ioctl, /* 控制操作 */ mmap: fb_mmap, /* 映射操作 */ open: fb_open, /* 打開操作 */ release: fb_release, /* 關閉操作 */ }; 65

67 DMA270 Linux 操作流程 其中的成員函數都在檔案 linux/driver/video/fbmem.c 中定義 由於顯示設備的特殊性, 在驅動層的介面中不但要包含底層函數, 還要有一些記錄設備狀態的資料 Linux 為封包緩衝設備定義的驅動層介面為 struct fb_info 結構, 在 include/linux/fb.h 中定義 這個結構比較長, 限於篇幅, 就沒有全部列出了 嵌入式系統要求的顯示操作比較簡單, 只涉及到結構中少數幾個成員, 下面對編寫驅動中要用到的幾個關鍵成員作說明 fb_info 中記錄了封包緩衝設備的全部資訊, 包括設備的設定參數 狀態以及操作函數指標 每一個封包緩衝設備都必須對應一個 fb_info 結構 其中成員變數 Modename 為設備名稱,fontname 為顯示字體,fbops 為指向底層操作的函數的指標, 這些函數是需要驅動程式開發人員編寫的 成員 fb_var_screeninfo 和 fb_fix_screeninfo 也是結構體 其中 fb_var_screeninfo 記錄用戶可修改的顯示控制器參數, 包括螢幕解析度和每個像素點的 Bit 數 fb_var_screeninfo 的 xres 定義螢幕一行有多少個點,yres 定義螢幕一列有多少個點 bits_per_pixel 定義每個點用多少個字元表示 而 fb_fix_screeninfo 中記錄用戶不能修改的顯示控制器的參數, 如螢幕緩衝區的物理位址, 長度 當對封包緩衝設備進行映射操作的時候, 就是從 fb_fix_screeninfo 中取得緩衝區物理位址的 上面所說的資料成員都是需要在驅動程式中設置的 在瞭解了上面所述的概念後, 編寫封包緩衝驅動的實際工作並不複雜, 需要做的工作是 : (1) 編寫初始化函數 : 初始化函數首先初始化 LCD 控制器, 設置顯示模式和顯示顏色數, 然後分配 LCD 顯示緩衝區 在 Linux 可通過 kmalloc 函數分配一片連續的空間 PXA270 採用的 LCD 顯示方式為 640x480,16 位元彩色 需要分配的顯示緩衝區為 640x480x2 = 600k 位元組, 緩衝區通常分配在晶片外 SDRAM 中, 起始位址儲存在 LCD 控制器暫存器中 最後是初始化一個 fb_info 結構, 填充其中的成員變數, 並應用 register_framebuffer(&fb_info) 將 fb_info 登記入核心 (2) 編寫結構 fb_info 中函數指標 fb_ops 對應的成員函數 : 對於嵌入式系統的簡單實現, 只需要下列三個函數就可以了 : struct fb_ops {.. int (*fb_get_fix)(struct fb_fix_screeninfo *fix, int con, struct fb_info *info); int (*fb_get_var)(struct fb_var_screeninfo *var, int con, struct fb_info *info); int (*fb_set_var)(struct fb_var_screeninfo *var, int con,struct fb_info *info);. 66

68 第二章 實驗篇 }; struct fb_ops 在 include/linux/fb.h 中定義 這些函數都是用來設置 / 獲取 fb_info 結構中的成員變數的 當應用程式對設備檔案進行 Ioctl 操作時候會應用它們, 讀者可參考前文中的應用程式例子 例如, 對於 fb_get_fix(), 應用程式傳入的是 fb_fix_screeninfo 結構, 在函數中對其成員變數賦值, 主要是 smem_start( 緩衝區起始位址 ) 和 smem_len ( 緩衝區長度 ), 最終返回給應用程式 而 fb_set_var() 函數的傳入參數是 fb_var_screeninfo, 函數中需要對 xres,yres, 和 bits_per_pixel 賦值 驅動程式編寫完成後, 開發者可選擇將其編譯為動態載入模組, 或靜態地編譯入核心中 由於篇幅所限, 有關這方面的內容請讀者參考相關驅動程式文檔 實驗步驟 啟動 QT 圖形系統, 這時就可以在 LCD 螢幕上看到 QT 的圖形介面 修改 LCD 解析度為 640*480(10'4 吋螢幕 ) (1) 進入 linux cyh 目錄下, 運作 make menuconfig 命令 make menuconfig (2) 在彈出的核心配置框中, 選擇 Graphics support" 選項 67

69 DMA270 Linux 操作流程 (3) 按下 ENTER 鍵, 進入 " Graphics support" 目錄裡, 設定如下 : 68

70 第二章 實驗篇 (4) 按下 ENTER 鍵, 進入 " PXA LCD type" 目錄裡, 設定如下 : 69

71 DMA270 Linux 操作流程 4) 選擇 Select", 按下空白鍵退出 ), 接著會返回到核心配置框 這樣就將 10'4 吋 LCD 的驅動程式添加到 PXA270 的 Linux 核心中了 70

72 第二章 實驗篇 71

73 DMA270 Linux 操作流程 實驗 5 USB Host 掛載實驗 實驗目的 瞭解 USB HOST 相關知識 瞭解 PXA270 的 USB HOST 控制器的編寫程式 實驗內容 通過 USB HOST 下載資料 實驗設備 DMA-PXA270 實驗平台 PC 機器 USB 隨身碟 網路線 串列埠連接線 電源 實驗原理 1.USB HOST 匯流排協定及工作原理 USB(Universal Serial Bus, 通用串列匯流排 ) 介面是由 Compaq IBM Microsoft 等多家公司于 1994 年底聯合提出的介面標準, 其目的是用於取代逐漸不適應外部設備需求的傳統串列埠 並列埠 1996 年業界正式通過了 USB1.0 標準, 但是直到 1998 年 USB1.1 標準確立和 Win98 核心正式提供對 USB 介面的直接支援之後,USB 才真正開始普及, 到今天已經發展到 USB2.0 標準 USB1.1 協定允許 1.5Mbps 和 12Mbps 兩種資料傳送速度規格, 這大概是標準串列埠的 100 倍 (115Kbps) 以及標準並列埠的 10 倍, 而新的 USB2.0 協定已經可以提供速率為 480Mbps 的高速傳輸 USB 匯流排協定定義了四條信號線, 其中兩條負責供電而另外兩條負責資料的傳輸 USB 通訊模型是一種 Host-Slave( 主機 - 外部設備 ) 主從式結構, 因此經由 USB 匯流排進行通訊的雙方必有一方在通訊控制中擔當主機 (HOST) 的角色 USB 資料傳輸方式 : 在 USB 的資料傳送的方式下, 有四種的傳輸方式 : 控制 (Control) 同步 (isochronous) 中 72

74 第二章 實驗篇 斷 (interrupt) 大量 (bulk) 如果你是從硬體開始來設計整個的系統, 你還要正確選擇傳送的方式, 而作為一個驅動程式的書寫者, 就只需要弄清楚他是採用的什麼工作方式就行了 通常所有的傳送方式下的主動權都在 PC 邊, 也就是 host 邊 控制 (Control) 方式傳送 : 控制傳送是雙向傳送, 資料量通常較小 USB 系統軟體用來主要進行查詢 配置和給 USB 設備發送通用的命令 控制傳送方式可以包括 和 64 位元組的資料, 這依賴於設備和傳輸速度 控制傳輸典型地用在主電腦和 USB 外部設備之間的端點 (Endpoint)0 之間的傳輸, 但是指定供應商的控制傳輸可能用到其他的端點 同步 (isochronous) 方式傳送 : 同步傳輸提供了確定的頻帶寬和間隔時間 (latency) 它被用於時間嚴格並具有較強容錯性的資料傳輸, 或者用於要求恆定的資料傳送率的即時應用中 例如執行即時通話的網路電話應用時, 使用同步傳輸模式是很好的選擇 同步資料要求確定的頻帶寬值和確定的最大傳送次數 對於同步傳送來說, 即時的資料傳遞比完美的精度和資料的完整性更重要一些 中斷 (interrupt) 方式傳送 : 中斷方式傳輸主要用於定時查詢設備是否有中斷資料要傳送 設備的端點模式器的結構決定了它的查詢頻率, 從 1 到 255ms 之間 這種傳輸方式典型的應用在少量的分散的 不可預測資料的傳輸 鍵盤 操縱杆和滑鼠就屬於這一類型 中斷方式傳送是單向的並且對於 host 來說只有輸入的方式 大量 (bulk) 傳送 : 主要應用在資料大量傳送和接受資料上, 同時又沒有頻帶寬和間隔時間要求的情況下, 要求保證傳輸 印表機和掃描器屬於這種類型 這種類型的設備適合於傳輸非常慢和大量被延遲的傳輸, 可以等到所有其他類型的資料的傳送完成之後再傳送和接收資料 2.USB 通訊下圖為 USB 的通訊模型示意圖, 從圖中可以看出 USB 通訊的資料流程的結構 主機的每一個層次分別對應設備相對應的層次, 通過邏輯通道連接起來, 客戶軟體通過邏輯連接可以直接控制設備相對應的介面模組 這種連接使得軟體控制與介面一一對應起來, 用戶使用起來可以更加簡單快捷 73

75 DMA270 Linux 操作流程 3.USB 設備的列舉過程當 USB 設備連上主機或是從主機移走時, 以識別和管理設備的狀態變化 其匯流排列舉的過程如下 : (1)USB 設備連上主機, 所有的集線器通知本設備已連接上 此時,USB 設備處於加電狀態, 它所連接的埠是無效的 (2) 主機一旦得知新設備已連上它的某個埠, 它至少要等待 100ms 以確保插入操作的完成以及設備電源穩定工作 然後, 主機向該埠發出埠致能及重置命令 (3) 集線器將發向埠的重置信號持續 10ms, 當重置信號撤銷後, 埠已經變為有效 這時 USB 設備處於預設狀態, 並且可以從主機汲取小於 100mA 的電能, 所有設備暫存器及狀態已經重置, 設備可對預設位址 (00H) 產生響應 (4) 主機給設備分配一個唯一的位址, 設備以後就只對該位址進行回應 (5) 主機讀取 USB 設備描述符號, 確認 USB 設備的屬性 (6) 主機依照讀取的 USB 設備描述符號來進行配置, 如果設備所需的 USB 資源得以滿足, 主機就發送配置命令給 USB 設備, 表示配置完畢 從設備的角度來講, 它已經準備就緒了 74

76 第二章 實驗篇 4.PXA270 的 USB HOST 控制器說明 1)PXA270 的 USB HOST 控制器介紹 PXA270 處理器內部整合的 USB HOST 控制器, 該控制器的特點如下 : 符合 OHCI 1.0 協定規範 符合 USB 1.1 協定規範 同時支援 USB 低速和全速 (12M/S) 設備的連接注意 :PXA27X 支持 3 個 USB HOST 埠, 其中第二個和第三個 USB HOST 埠 (USBH2 和 USBH3) 必須通過 USB client 暫存器來配置 第一個 USB HOST 埠 (USBH1) 完全的被配置為 HOST 一個 USB 系統有四個主要的部分組成 : 其中兩個是設備端軟體和主機控制器驅動, 它們是通過軟體實現的 ; 另外兩個是主機控制器和設備端控制器, 它們是在通過硬體實現的 以下是 USB 主機控制器功能圖 : 75

77 DMA270 Linux 操作流程 2)USB HOST 相關控制暫存器 暫存器的詳細描述請參看 PXA270 手冊的 USB HOST 章節 5.Linux 下 USB 主機端驅動程式 (1) Linux 下 USB 驅動程式結構由於 USB 介面是一個主 - 從方式, 多設備連接的樹狀網路結構, 所以 USB 主機必須具有對所有連接在匯流排上的不同類型 USB 設備進行管理的功能 Linux USB 主機驅動程式可以同時支援多路 USB 匯流排功能, 每路 USB 匯流排獨立工作 Linux USB 主機驅動由三部分組成 :USB 主機控制器驅動 (HCD),USB 驅動 (USBD) 和不同的 USB 設備 76

78 第二章 實驗篇 類驅動 下圖為 Linux USB 驅動程式結構 : 應用軟體 HID 類驅存儲類驅影像類驅印表機類驅 通信類驅 語言類驅 廠商特定設備驅動 通用設備驅動程式 USBD USB 核 USB1.1 HUB 驅動 USB2.0 HUB 驅動 HCD UHCI 驅動 OHCI 驅動 EHCI 驅動 USB 硬件介面 UHCI 控制 OHCI 控制 EHCI 控制器 其他主機控制 USB 主機控制器驅動 (HCD) HCD 是 USB 主機驅動程式中直接與硬體交互的軟體模組, 其主要功能由 : 主機控制器硬體初始化 ; 為 USBD 層提供相對應的介面函數 ; 提供根 HUB(ROOT HUB) 設備配置, 控制功能 ; 完成 4 種類型的資料傳輸等 Linux 2.6.x 版本支援 USB 1.1 和 USB 2.0 規範, 其 USB HCD 部分支援 UHCI,OHCI 以及 EHCI 三種規範 USB 驅動 (USBD) USBD 部分是整個 USB 主機驅動的核心, 其主要實現的功能有 :USB 匯流排管理, USB 匯流排設備,USB 匯流排頻帶寬管理,USB 的 4 種類型資料傳輸,USB HUB 驅動, 為 USB 設備類驅動提供相關介面, 提供應用程式取用的 USB 系統的檔案介面等 其中 USB HUB 作為一類特殊的 USB 設備, 其驅動程式被包含在 USBD 層 77

79 DMA270 Linux 操作流程 USB 設備類驅動 USB 設備類驅動是最終與應用程式交互的軟體模組, 其主要實現的功能有 : 取用特定的 USB 設備, 為應用程式提供取用介面等 Linux 核心支援的 USB 設備類有 :USB 印表機設備類 (PRINTER CLASS), 通訊設備類 (COMMUNICATION DEVICE CLASS), HID 設備類 (HUMAN DEVICE CLASS), 儲存設備類 (MASS STORAGE CLASS), 語音設備類 (AUDIO DEVICE CLASS) 等 USB 資料的傳遞流程 : 應用程式首先通過檔案系統 (POSIX) 介面來取用相對應的 USB 設備類驅動程式和 USBD;USB 設備類驅動程式則通過 USBD 提供的相關介面將資料請求檔案傳遞給 USBD;USBD 通過 HCD 提供的介面, 進一步將資料封包傳遞給 HCD;HCD 最終將資料發送到 USB 匯流排上 Linux 定義了通用的資料結構 URB 用來在 USB 設備類驅動和 USBD,USBD 和 HCD 間進行資料傳輸 從下圖可以看出,USBD 提供了檔案系統的介面 這有利於應用程式通過檔案系統來取用 USBD 層, 以獲得 USB 驅動程式的管理資訊, 如 USB 匯流排狀態, 拓僕結構, 連接在各個匯流排上的 USB 設備狀態 屬性等 應用程式 檔案系統 POSIX 介面 Linux 設備 USB 設備類驅動 USBD HCD 主機控制器物理介面 USB 系統取用 USBD HCD 介面軟體部分 USB 設備軟體 USB 設備硬體 78

80 第二章 實驗篇 6.PXA270 的 USB 主機端驅動程式在 Linux 下的添加對於驅動程式而言, 分為主機端設備驅動程式 (Device Driver), 主機控制器驅動程式 (Host Contronller Driver) 和設備端驅動程式 (Slave Device Driver) 目前,Linux 核心只提供對 USB 主機控制器的開放主機控制器介面 (OHCI) 和通用主機控制器介面 (UHCI) 兩種規格的支援 PXA270 的 USB 主機控制器完全符合 OHCI 規範 下面的步驟介紹如何將 USB 主機端驅動添加到 Linux 核心中 (1) 進入 linux cyh 目錄下, 運作 make menuconfig 命令 make menuconfig (2) 在彈出的核心配置框中, 選擇 USB support" 選項 (3) 按下 ENTER 鍵, 進入 "USB support" 目錄裡, 設定如下 : 79

81 DMA270 Linux 操作流程 80

82 第二章 實驗篇 (4) 然後按 ESC 鍵退出 ( 或者選擇 Exit", 按下 ENTER 退出 ), 接著會返回到核心配置框 這樣就將 USB host 的驅動程式添加到 PXA270 的 Linux 核心中了 USB HOST 實驗操作 1. 掛載 USB 隨身碟 (1) 運作 DMA-PXA270 上的 Linux, 插入 USB 隨身碟,Linux 將檢測 USB 隨身碟, 出現 /dev/scsi/host0/bus0/target0/lun0:p1" 資訊時, 說明 USB 隨身碟被正確識別, 這時就可以進行 USB 隨身碟的掛載了 81

83 DMA270 Linux 操作流程 82

84 第二章 實驗篇 (2)mkdir /tmp/1 (3) 掛載 USB 隨身碟 mount -t vfat /dev/scsi/host0/bus0/target0/lun0/part1 /tmp/1 83

85 DMA270 Linux 操作流程 (4) 這樣就將 USB 隨身碟掛載到 /tmp/1 目錄下了 這是就可以在 /tmp/1 目錄下對 USB 隨身碟裡的檔進行複製, 刪除等操作了 84

86 第二章 實驗篇 85

87 DMA270 Linux 操作流程 實驗 6 嵌入式 Linux 下的音效實驗 實驗目的 嵌入式 Linux 音效播放和音效錄音 瞭解 MP3 編解碼的原理 掌握 Linux 下實現對 MP3 的編解碼 實驗內容 在 Linux 下播放 mp 實驗設備 DMA-PXA270 實驗平台 PC 機器 USB 隨身碟 網路線 串列埠連接線 電源 實驗原理 1.MP3 簡介 MP3 就是採用國際標準 MPEG 中的第三層音效壓縮模式, 對聲音信號進行壓縮的一種格式, 中文也稱 電腦網路音樂 " MPEG 中的第三層音效壓縮模式比第一層和第二層編碼要複雜得多, 但音質最高, 可與 CD 音質相比 為了更深入地理解, 先把 MPEG -1 音效標準的特點作一些介紹 1) MPEG-1 音效標準的特點 MPEG-1 音效壓縮標準是第一個高純真音效資料壓縮標準 除了 AC-3 之外, 其他的音效壓縮演算法只適用於語言 ( 如碼激勵線性預測 CELP) 或只有中等的壓縮質量 ( 如自適應差分脈衝編碼調製 ADPCM) MPEG-1 音效壓縮標準雖然是 MPEG-1 標準的一部分, 但它完全可獨立應用 為保證其普遍適用性,MPEG-1 音效壓縮標準提供了以下壓縮模式 : (1) 音效信號取樣頻率可以是 32kHz,44 1kHz 或 48kHz (2) 壓縮後的位元流可按下列 4 種模式之一支援單聲道或雙聲道 : 提供給音效通道的單聲道模式 (monophonic mode) 86

88 第二章 實驗篇 提供給兩個獨立的單音效通道的雙 - 單聲道模式 (dual-monophonic mode) 提供給立體聲通道的立體聲模式 (stereomode), 通道之間有 Bit 共用 聯合立體聲模式 (joint-stereomode), 利用立體聲之間的關聯或通道之間的相位差的無關性, 或者對兩者同時利用 (3) 壓縮後的位元流具有預定的幾種 BIT 率之一 此外,MPEG-1 音效標準也支援用戶使用預定的 BIT 率之外的 BIT 率 (4) MPEG-1 音效標準提供三個獨立的壓縮層次, 使用戶可在複雜性和壓縮質量之間權衡選擇 層 1 (Layer 1) 最為簡單, 使用的 BIT 率 384kb/s, 主要用於數位小卡座 DCC(Digital Compact Cassette) 層 2 (Layer 2) 的複雜度屬於中等, 使用的 BIT 率 192kb/s 左右 其應用包括 : 數位廣播 (Digital Audio Broadcasting) 的音效編碼,CD-ROM 上的音效信號以及互動式 CD-I(CD-zinteractive) 層 3 (Layer 3) 最為複雜, 但音質最佳, 使用的 BIT 率為 64kb/s, 尤其適用於綜合業務資料網 (ISDN) 上的音效傳輸 (5) 編碼後的位元流支援迴圈冗餘校驗 CRC(Cyclic Redundancy Check) (6) MPEG-1 音效標準還支援在位元流中載帶附加資訊 2) MPEG-1 音效標準的基本原理 MPEG-1 音效標準是一個普遍適用的音效壓縮標準, 它對音效源沒有任何要求 它利用人耳聽覺系統的感知特性, 壓縮率的取得來自去掉人耳聽不到的資訊細節, 即圖 1 和圖 2 曲線以下的部分 雖然壓縮是有失真的, 但對人耳來說這些失真是聽不到的 也即對人耳而言,MPEG-1 音效壓縮是不失真的 因此,MPEG-1 音效標準的應用非常廣泛 3) MPEG-1 聲音的一些性能指標利用 MPEG-1 音效標準一般能達到的壓縮率 ( 以仍能達到 CD 音質為準 ) 如表 1 所示 MPEG 層 3 在各種音質下的性能如表 2 所示 MPEG-1 編碼解碼器的各層延遲時間如表 3 所示 從上述 MPEG-1 音效標準可看出 : 高壓縮比是 MP3 的一個主要特性, 其基本理論就是去除來源中人耳聽覺以外的所有信號, 並將大信號掩蓋下的小信號也加以除去, 因為人耳具有掩蓋效應, 這種變化基本上察覺不出來, 這樣實際記錄的信息量就比壓縮前小得多, 其壓縮比可在 10 1~96 1( 這次新科採用的是 CD 音質的 12 1) 這樣, 一 87

89 DMA270 Linux 操作流程 張只能容納十幾首歌曲的光碟, 就可記錄 150 首以上的 MP3 格式歌曲 MP3 的這一特性, 大大節約了節目成本, 肯定會受用戶歡迎 2. MP3 的優點 MP3 的突出優點是 : 壓縮比高, 音質較好, 製作簡單, 交流方便 壓縮比高上面已述 音質是人們關心的一個焦點 雖然 MP3 對原始信號進行了高壓縮比處理, 但因為去除的大多是一些無關緊要的信號, 因此單純從聽感上說,MP3 壓縮幾乎對音質沒有影響 事實上, 製作精良的 MP3 音樂光碟, 在專門的數位隨身聽 ( 比如 MPMan) 中播放, 完全可以達到普通 CD 唱機播放 CD 唱片的音質水準 3. PXA270 的 AC'97 的控制器 PXA270 的 AC'97 控制器支援 AC97 音效解碼協定 2.0,AC-link 是 AC'97 控制器的一個同步的, 固定速率的串列匯流排界面, 用來傳輸數位音效, 調製, 麥克風輸入 (MIC-in), 解碼暫存器控制, 和狀態資訊 AC'97 的解碼器發送數位化的音效取樣到 AC`97 控制器,AC'97 控制將音效取樣儲存到記憶體中 對於錄音重放或合成音效, 處理器將重新儲存音效取樣並且通過 AC-link 發送它們到解碼器 在解碼器裡的外接 D/A 轉換器將音效取樣轉換為類比音效波形 PXA27x 處理器的 AC'97 控制器支援如下的 AC'97 的功能 : 單獨的立體聲脈衝編碼調製輸入和輸出, 調製輸入和輸入以及 MIC 輸入通道所有上面的這些通道在硬體上只支援 16 位元取樣 取樣少於 16 位元可以通過軟體來支援 多種取樣速率的 AC' 解碼器 (48kHz 和往下 ) AC'97 控制器依賴於解碼器來控制多種速率 對 AC'97 暫存器的讀 / 寫控制 二級解碼器支持 三個接收 FIFOs(32 位,16 入口 ) 兩個傳輸 FIFOs(32 位,16 入口 ) 可配置的 AC97_SYSCLK 輸出 ( 支援沒有時脈源和晶振的解碼器 ) AC'97 的信號接腳描述從 AC-link 的 AC'97 的信號是一個點到點的同步串列互連, 支援全雙工的資料 88

90 第二章 實驗篇 傳輸 所有的數位音效, 線性調製解碼, 和命令 / 狀態資訊通過 AC-link 來通訊的 AC-link 使用通用目的的 I/O(GPIOs). 軟體必須重新配置 GPIO 為 AC-link 功能 AC-link 的接腳如下 : 配置 AC-link, 順序執行如下步驟 : (1) 配置 AC97_SYSCLK,AC97_SYNC,AC97_RESET_n, 和 AC97_SDATA_OUT 為輸出並且配置 AC97_BITCLK,AC97_SDATA_IN_0 和 AC97_SDATA_IN_1 為輸入 (2) 通過設定 GCR[nCRST] 來聲明 AC97_RESET_n 信號 用 AC-Link 的電路互連的電路功能圖如下 : 89

91 DMA270 Linux 操作流程 操作 AC'97 控制器通過處理器或者 DMA 控制器來控制 處理器使用編寫程式 I/O 指令來控制 AC'97 控制器, 能控制四種暫存器類型 : AC'97 控制暫存器 :32 位元邊界取用模式 解碼器暫存器 調製解碼 GPIO 暫存器 AC'97 控制器的 FIFOs 資料 : AC'97 控制器有兩個傳輸 FIFO 用於音效輸入和調製輸出, 有三個接收 FIFOs 用於音效輸入, 調製輸入和麥克風輸入 通過寫 PCM 資料暫存器 (PCDR) 或者調製資料暫存器 (MODR) 來寫傳輸 FIFOs 接收 FIFO 入口可以從 PCDR,MODR 或者麥克風資料暫存器 (MCDR) 來讀取的 初始化 AC'97 解碼和 AC`97 控制器線路在開起電源重置的時候由於 AC97_RESET_n 信號來重置 ( 該信號在音效或調製驅動設定 GCR[nCRST] 位之前要保持為低 ) 編寫程式 GPIO 方向暫存器 (GPDR) 和 GPIO 選擇功能暫存器 (GPAR) 來為 AC'97 控制器埠配置適合的接腳方向 在各自的控制暫存器中致能 DMA 請求或者 PIO 中斷 通過設定 GCR[nCRST] 為 0b1 來聲明 AC97_RESET_n - 使所有其他暫存器處在活動狀態, 來運作它們可編寫程式 當 GCR[nCRST] 為 0 時, 所有其他暫存器都處在它的重置模式 - 用 0 填充的封包被傳輸因為傳輸 FIFO 為空 當然, 這種情形不會引起一個錯誤的狀態 ( 因為沒有什麼被標記為有效 ) - AC'97 控制器不能接收任何資料一直到它從解碼器接收到一各解碼準備的標誌前 接著解碼器將一個輸入封包標籤為有效 在 GCR 中允許初級準備中斷致能 (GCR[PRDY_IE] 和或者次級準備中斷致能 (GCR[SCRDY_IE]) 軟體能夠查詢這些位元 通過觸發 DMA 或 PIO 操作, 軟體可以相對應初級 / 次級準備中斷 AC'97 控制器觸發一個 PCM-Out FIFO 服務請求 DMA 或 PIO 通過填充傳輸 FIFOs 來回應 AC'97 控制器連續傳輸 0 在傳輸 FIFO 為半雙工前 一旦為半雙工, 有效的 FIFO 資料將被發送到 AC-link 90

92 第二章 實驗篇 注意 : 當 AC97_RESET_n 被聲明時, 解碼器混合暫存器 0x00 的讀取將返回在解碼器裡的硬體類型 如果解碼器沒有或者 AC'97 不支持,AC'97 控制器將不設定解碼準備位, 初級解碼器的 GCR[PCRDY] 或者次級解碼器的 GCR[SCRDY] 時脈和取樣頻率預設下,AC'97 控制器在 48KHz 取樣頻率下傳輸和接收資料 當然如果解碼器支持隨意的位置請求, 可以在低於 48KHz 的頻率下取樣資料 暫存器描述 AC'97 控制器和解碼器暫存器被映射到位址 0x4050_0000~0x405F_FFFC 所有 AC'97 控制器暫存器是 32 位控制的 儘管一個解碼器有 64 個 16 位的暫存器, 但他們可以使用 32 位位址映射來取用 可編寫程式 I/O 和 DMA 突發模式能取用下面的暫存器 : 全局暫存器 :AC'97 控制器有三個全局暫存器 : 狀態, 控制, 和音效及解調域共用的解碼器取用暫存器 特定通道的音效 AC'97 控制器暫存器, 涉及的有 PCM-out,PCM-in, 和 MIC-in 通道 特定通道的調製 AC'97 控制器, 涉及的通道有 modem-out 和 modem-in 音效解碼暫存器 ; 調製解碼暫存器 ; 上面簡單的介紹了一下 PXA270 的 AC'97 的控制器模組, 如果需要瞭解得更詳細, 請看 PXA270 得相關手冊 實驗步驟 DMA-PXA270 教學平台使用 AC97 介面的晶片 UCB1400 來播放和錄製音效檔案 其中放音使用 WM9705 的耳機介面, 可直接驅動耳機或來源音箱, 耳機介面可通過程式控制音量, 喇叭驅動口除了程式控制外還可用旋鈕控制, 從擴接口上引出的喇叭驅動口需要外接功放才能驅動喇叭, 具有音量控制功能 錄音使用 WM9705 的 MIC 介面, 直接用底板上的 MIC 測試聲音播放最簡單的辦法是直接將一個檔輸出到音效 CODEC, 在 shell 裡執行 cat /bin/busybox > /dev/sound/dsp, 之後就會有聲音從耳機或音箱發出 另外根檔案系統內帶有一個 mp3 的播放程式 madplay,mp3 檔可以是儲存在 MMC/SD 卡 CF 儲存卡 USB 隨身碟上的, 也可以通過前面說的網路 USB 等方法下載 91

93 DMA270 Linux 操作流程 92

94 第二章 實驗篇 MP3 編解碼器 madplay 部分源碼 1. 編解碼器初始化函數 /* * NAME: player_init() * DESCRIPTION: initialize player structure */ void player_init(struct player *player) { player->verbosity = 0; player->options = 0; player->repeat = 1; player->control = PLAYER_CONTROL_DEFAULT; player->playlist.entries = 0; player->playlist.length = 0; player->playlist.current = 0; player->global_start = mad_timer_zero; player->global_stop = mad_timer_zero; player->fade_in player->fade_out player->gap = mad_timer_zero; = mad_timer_zero; = mad_timer_zero; player->input.path = 0; player->input.fd = -1; # if defined(have_mmap) player->input.fdm = 0; # endif player->input.data = 0; player->input.length = 0; 93

95 DMA270 Linux 操作流程 player->input.eof = 0; tag_init(&player->input.tag); player->output.mode = AUDIO_MODE_DITHER; player->output.voladj_db = 0; player->output.attamp_db = 0; player->output.gain = MAD_F_ONE; player->output.replay_gain = 0; player->output.filters = 0; player->output.channels_in = 0; player->output.channels_out = 0; player->output.select = PLAYER_CHANNEL_DEFAULT; player->output.speed_in = 0; player->output.speed_out = 0; player->output.speed_request = 0; player->output.precision_in = 0; player->output.precision_out = 0; player->output.path = 0; player->output.command = 0; /* player->output.resample */ player->output.resampled = 0; player->ancillary.path = 0; player->ancillary.file = 0; player->ancillary.buffer = 0; player->ancillary.length = 0; player->stats.show = STATS_SHOW_OVERALL; player->stats.label = 0; player->stats.total_bytes = 0; player->stats.total_time = mad_timer_zero; 94

96 第二章 實驗篇 player->stats.global_timer = mad_timer_zero; player->stats.absolute_timer = mad_timer_zero; player->stats.play_timer = mad_timer_zero; player->stats.global_framecount = 0; player->stats.absolute_framecount = 0; player->stats.play_framecount = 0; player->stats.error_frame = -1; player->stats.mute_frame = 0; player->stats.vbr = 0; player->stats.bitrate = 0; player->stats.vbr_frames = 0; player->stats.vbr_rate = 0; player->stats.nsecs = 0; player->stats.audio.clipped_samples = 0; player->stats.audio.peak_clipping = 0; player->stats.audio.peak_sample = 0; } 2. 編解碼器退出函數 /* * NAME: player_finish() * DESCRIPTION: destroy a player structure */ void player_finish(struct player *player) { if (player->output.filters) filter_free(player->output.filters); if (player->output.resampled) { resample_finish(&player->output.resample[0]); resample_finish(&player->output.resample[1]); free(player->output.resampled); player->output.resampled = 0; 95

97 DMA270 Linux 操作流程 } } 96

98 第二章 實驗篇 實驗 7 10M/100M 網路通訊實驗 實驗目的 瞭解在嵌入式 Linux 下網路通訊的實現 瞭解乙太網路協定 如何在嵌入式 Linux 下添加 10/100M 網路卡驅動 實驗內容 在核心中配置網路卡驅動, 進行網路通訊 實驗設備 DMA-PXA270 實驗平台 PC 機器 串列埠連接線 電源 交叉網路線 實驗原理 1. 乙太網路協定 1) 乙太網路物理封包格式 Field Length In Bytes Ethernet Preamble Destination Address Source Address Type Data FCS Preamble : 前導, 由 0 1 間隔程式碼組成 Destination Address: 目的地址, 乙太網路的位址為 48 位元 (6 個位元組 ) 二進位位址, 表明該封包傳輸給哪個網路卡. 如果為 FFFFFFFFFFFF, 則是廣播位址, 廣播位址的資料可以被任何網路卡接收到 Source Address : 來源位址,48 位元, 表明該封包的資料是哪個網路卡發的, 即發送端的網路卡位址, 同樣是 6 個位元組 97

99 DMA270 Linux 操作流程 Type : 類型欄位, 表明該封包的資料是什麼類型的資料, 不同的協定的類型欄位不同 如 :0800H 表示資料為 IP 檔案,0806H 表示資料為 ARP 檔案,814CH 是 SNMP 檔案,8137H 為 IPX/SPX 檔案 ( 小於 0600H 的值是用於 IEEE802 的, 表示資料封包的長度 ) DATA : 資料段, 該段資料不能超過 1500 位元組 因為乙太網路規定整個傳輸檔案的最大長度不能超過 1514 位元組 (14 位元組為 DA,SA,TYPE) FCS :32 位元資料校驗位元. 為 32 位元的 CRC 校驗, 該校驗由網路卡自動計算, 自動產生 自動校驗, 自動在資料段後面填入. 對於資料的校驗演算法, 我們無需瞭解 2. IP,UDP 和 TFTP 協議介紹 1)IP 協議網際協定 IP 是網路層中最重要的協定 IP 層接收由更低層 ( 網路介面層如乙太網路設備驅動程式 ) 發來的資料封包, 並把該資料封包發送到更高層 TCP 或 UDP 層 ; 相反,IP 層也把從 TCP 或 UDP 層接收來的資料封包傳送到更低層 IP 資料封包是不可靠的, 因為 IP 並沒有做任何事情來確認資料封包是按順序發送的或則沒有被破壞的 IP 資料封包中含有發送它的主機的位址 ( 來源位址 ) 和接收它的主機的位址 ( 目的地址 ) 本地媒介頭 IP 頭 UDP 頭 TFTP 壓縮檔 壓縮檔頭次序關於 IP 協定的詳細資料, 請查看相關資料 2)UDP 協議簡介 UDP 與 TCP 位於同一層, 但對於資料封包的順序錯誤或重發不作處理 UDP 主要用於面向查詢 / 應答的服務, 如 NFS 相對於 FTP 或 Telnet, 這些服務需要交換的信息量較少 UDP 協定的資料封包頭格式如下 : UDP 來源埠 UDP 目的埠 UDP 資料報長度 UDP 資料報校驗 98

100 第二章 實驗篇 UDP 資料封包格式 3)FTP 協議簡介大多數的 TCP 服務是使用單個的連接, 一般是客戶向伺服器的一個埠發起連接, 然後使用這個連接進行通訊 但是,FTP 協定卻有所不同, 它使用雙向的多個連接, 而且使用的埠很難預計 一般,FTP 連接包括 : 一個控制連接 (control connection) 這個連接用於傳遞用戶端的命令和伺服器端對命令的回應 它使用伺服器的 21 埠, 生存期是整個 FTP 會話時間 幾個資料連接 (data connection) 這些連接用於傳輸檔案和其他資料, 例如 : 目錄列表等 這種連接在需要資料傳輸時建立, 而一旦資料傳輸完畢就關閉, 每次使用的埠也不一定相同 而且, 資料連接既可能是用戶端發起的, 也可能是伺服器端發起的 在 FTP 協定中, 控制連接使用埠 21, 因此使用 SSH 的標準埠轉發就可以這種連接進行很好的安全保護 相反資料傳輸連接的目地埠通常實現無法知道, 因此處理這樣的埠轉發非常困難 FTP 協議使用一個標準的埠 21 作為 ftp-data 埠, 但是這個埠只用於連接的來源位址是伺服器端的情況, 在這個埠上根本就沒有監聽處理程序 FTP 的資料連接和控制連接的方向一般是相反的, 也就是說, 是伺服器向用戶端發起一個用於資料傳輸的連接 連接的埠是由伺服器端和用戶端協商確定的 FTP 協定的這個特徵對 SSH 轉發以及防火牆和 NAT 的配置增加了很多困難 除此之外, 還有另外一種 FTP 模式, 叫做被動模式 (passive mod) 在這種模式下, 資料連接是由客戶程式發起的, 和剛才討論過的模式 ( 我們可以叫做主動模式 ) 相反 是否採取被動模式取決於客戶程式, 在 ftp 命令行中使用 passive 命令就可以關閉 / 打開被動模式 網路設備驅動程式 1. 網路設備驅動程式簡介 Linux 網路設備驅動程式是 Linux 網路應用的重要組成部分, 所有的 Linux 網路驅動程式遵循通用的介面 對於每個網路介面, 都用一個 device 的資料結構表示 通常, 網路設備是一個物理設備, 如乙太網路卡, 但軟體也可以作為網路設備, 典型的是回送設備 (loopback) 在核心啟動時, 系統通過網路設備驅動程式登記已經存在的網路設備 設備用標準的支援網路的機制來把收到的資料送到相對應的網路層 所有被發送和接收的封包都用資料結構 sk_buff 表示 這是一個很好靈活性的資料結構, 可以很容易增加或刪除網路 99

101 DMA270 Linux 操作流程 協定資料封包的首部 網路設備使用網路介面管理表 dev_base 來管理 device 資料結構 dev_base 實際上是一條 device 結構鏈表的表頭, 在系統初始化完成以後, 系統檢測到的網路設備將自動儲存在這張鏈表中, 其中每一個鏈表單元表示一個存在的物理網路設備 2.Linux 網路設備驅動程式的體系結構 dev_queue_xmit netif_rx( ) 網路協定介面層 struct device 網路設備介面層 資料封包發送 hard_start_xmit( ) 中斷處理 ( 資料封包接收 ) 設備驅動功能層 網路物理設備媒介 ( 乙太網卡 ) 設備媒介 一個網路設備最基本的方法有初始化, 發送和接收 初始化完成硬體的初始化 device 中變數的初始化和系統資源的申請 發送程式是在驅動程式的上層協定層有資料要發送時自動應用的 一般驅動程式中不對發送資料進行緩存, 而是直接使用硬體的發送功能把資料發送出去 接收資料一般是通過硬體中斷來通知的 在中斷處理程式裡, 把硬體封包資訊填入一個 skbuff 結構中, 然後應用 netif_rx() 傳遞給上層處理 3. 網路驅動程式的基本方法網路設備作為一個物件, 提供了一些方法供系統取用 正是這些有統一介面的方法, 遮罩了硬體的具體細節, 讓系統對各種網路設備的取用都採用統一的形式, 做到硬體無關性 (1) 初始化函數 100

102 第二章 實驗篇 設備的初始化主要是由 device 資料結構中的 init 函數指標所指的初始化函數來完成的 載入網路驅動模組後, 就會應用初始化過程 在初始化程式裡你可以根據硬體的特徵檢查硬體是否存在, 然後決定是否啟動這個驅動程式的工作 配置和初始化硬體 在初始化程式裡你可以完成對硬體資源的配置, 比如中斷, 配置好硬體佔用的資源後, 就可以向系統申請這些資源 有些資源是可以和別的設備共用的, 如中斷 有些是不能共用的, 如 IO DMA 接下來就要構造設備的 device 資料結構, 用檢測到的資料初始化 device 中的相關變數, 最後向 Linux 核心註冊該設備並申請記憶體空間 在 PXA270 的教學實驗中, 我們採用的了兩個網路介面,CS8900(10M net MAC) 和 DM9000(100M net MAC) CS8900 的驅動程式主要在 drivers/net/cs89x0.c 檔案裡面, 初始化函數 cs89x0_probe1, 在這個網路設備驅動程式中, 設備的 device 資料結構是 dev_cs89x0 DM9000 的驅動程式主要在 drivers/net/dm9ks.c 檔中, 初始化函數為 smc_probe 函數 (2) 打開函數 (open) open 函數在網路設備驅動程式裡是網路設備被啟動的時候被應用, 即設備狀態由 down 至 up 所以實際上有些初始化的工作可以放到這裡來作 比如資源的申請, 硬體的啟動 CS8900 的 open 函數為 net_open() DM9000 的 open 函數為 smc_open() (3) 關閉函數 (stop) 關閉函數釋放資源以減少系統負擔, 在設備狀態由 up 轉為 down 時被應用 另外, 如果是作為模組裝入的驅動程式, 那麼 close 裡還需要應用 MOD_DEC_USE_COUNT 巨集, 減少設備被引用的次數, 以便卸載驅動程式 Close 方法必須返回成功 (0== success) (4) 發送函數所有的網路設備驅動程式都必須有這個發送方法 在系統應用驅動程式的 xmit 時, 發送的資料放在一個 sk_buff 結構中 一般的驅動程式把資料傳給硬體發出去 也有一些特殊的設備比如 loopback 把資料組成一個接收資料再回送給系統, 或者 dummy 設備直接丟棄資料 如果發送成功,hard_start_xmit 方法裡釋放 sk_buff, 返回 0( 發送成功 ) 如果設備暫時無法處理, 比如硬體忙, 則返回 1 這時如果 dev->tbusy 設為非 0, 則系統認為硬 101

103 DMA270 Linux 操作流程 體忙, 要等到 dev->tbusy 設 0 以後才會再次發送 Tbusy 的設 0 任務一般由中斷完成 硬體在發送結束產生中斷, 這時可以把 tbusy 設 0, 然後用 mark_bh() 應用通知系統可以再次發送 在發送不成功的情況下, 也可以不設置 dev->tbusy 為非 0, 這樣系統會不斷嘗試重發 如果 hard_start_xmit 發送不成功, 則不要釋放 sk_buffs 傳送下來的 sk_buffs 中的資料已經包含硬體需要的封包頭 所以在發送方法裡不需要再填充硬體封包頭, 資料可以直接提交給硬體發送 sk_buff 是被鎖住的 (locked), 確保其他程式不會存取它 CS8900A 的驅動程式中, 該網路設備的傳輸函數 dev->hard_start_xmit 為 net_send_packet DM9000 的驅動程式中, 該網路設備的傳輸函數 dev->hard_start_xmit 為 smc_hard_start_xmit (5) 接收函數驅動程式並不存在一個接收方法 有資料收到應該是驅動程式來通知系統的 一般設備收到資料後都會產生一個中斷, 在中斷處理程式中驅動程式申請一區塊 sk_buff(skb), 從硬體讀出資料放置到申請好的緩衝區裡 接下來填充 sk_buff 中的一些資訊 Skb->dev=dev, 判斷收到封包的協定類型, 填入 skb->protocol( 多協定的支援 ) 把指針 skb->mac.raw 指向硬體資料丟棄硬體封包頭 (skb_pull) 還要設定 skb->pkt_type, 標明第二層 ( 鏈路層 ) 資料類型 可以是以下類型 : PACKET_BROADCAST: 鏈路層廣播 PACKET_MULTICASE: 鏈路層組播 PACKET_SELF: 發給自己的封包 PACKET_OTHERHOST: 發給別人的封包 ( 監聽模式時會有這種封包 ) 最後應用 netif_rx() 把資料傳送給協定層 netif_rx() 裡資料放入處理佇列然後返回, 真正的處理是在中斷返回以後, 這樣可以減少中斷時間 應用 netif_rx() 以後, 驅動程式就不能再存取資料緩衝區 skb 在協定層, 接收資料封包的流程控制分兩個層次 : 首先 netif_rx() 函數限制了從物理層到協定層的資料封包的數量 ; 然後, 每個套接字都有一個佇列, 限制從協定層到套接子層的資料封包的數量 在傳輸方面, 驅動程式的 dev->tx_queue_len 參數限制佇列的長度 (6) 中斷處理函數在 open 函數中申請了中斷, 中斷處理函數是 net_interrupt 在網路設備發出一個中 102

104 第二章 實驗篇 斷時, 核心將應用中斷處理程式 驅動程式需要確定產生這個中斷的原因並進行相對應的操作 一般的中斷條件是接收到資料, 發送完成, 報告出錯狀態 需要瞭解相關的中斷狀態位元以進行相對應的操作 4. 網路驅動程式中用到的資料結構網路設備介面層有一個非常重要的資料結構 device 這個資料結構是在系統中每一個設備的代表, 它提供了多個設備方法, 供作業系統或協定層應用 這其中就包括設備初始化時應用的 init 函數, 打開和關閉網路設備的 open 和 stop 函數, 處理資料封包發送的 hard_start_xmit 函數等等 net_device 用來抽像一個資料連結層的具體網路介面卡, 為 IP 層取用該設備提供介面 對於 IP 層來說, 它能看到的就是該設備的 net_device{},net_device{} 就像是 IP 與鏈路層交流的一座橋樑 Devcie 資料結構, 在核心中也就是 net_device 這個資料結構主要定義在 include/linux/netdevice.h 裡, 那裡面有詳細的介紹 struct device { /* * This is the first field of the "visible" part of this structure * (i.e. as seen by users in the "Space.c" file). It is the name * the interface. */ char *name; /* I/O specific fields - FIXME: Merge these and struct ifmap into one */ unsigned long rmem_end; /* shmem "recv" end */ unsigned long rmem_start; /* shmem "recv" start */ unsigned long mem_end; /* shared mem end */ unsigned long mem_start; /* shared mem start */ unsigned long base_addr; /* device I/O address */ unsigned char irq; /* device IRQ number */ /* Low-level status flags. */ volatile unsigned char start, /* start an operation */ interrupt; /* interrupt arrived */ 103

105 DMA270 Linux 操作流程 /* 在處理中斷時 interrupt 設為 1, 處理完清為 0 */ unsigned long tbusy; /* transmitter busy must be longg for bitops */ struct device *next; /* The device initialization function. Called only once. */ /* 指向驅動程式的初始化方法 */ int (*init)(struct device *dev); /* Some hardware also needs these fields, but they are not part of the usual set specified in Space.c. */ /* 一些硬體可以在一塊板上支援多個介面, 可能用到 if_port */ unsigned char if_port; /* Selectable AUI, TP,..*/ unsigned char dma; /* DMA channel */ struct enet_statistics* (*get_stats)(struct device *dev); /* * This marks the end of the "visible" part of the structure. All * fields hereafter are internal to the system, and may change at * will (read: may be cleaned up at will). */ /* These may be needed for future network-power-down code. */ /* trans_start 記錄最後一次成功發送的時間 可以用來確定硬體是否工作正常 */ unsigned long trans_start; /* Time (in jiffies) of last Tx */ unsigned long last_rx; /* Time of last Rx */ /* flags 裡面有很多內容, 定義在 include/linux/if.h 裡 */ unsigned short flags; /* interface flags (a la BSD) */ unsigned short family; /* address family ID (AF_INET) */ 104

106 第二章 實驗篇 unsigned short metric; /* routing metric (not used) */ unsigned short mtu; /* interface MTU value */ /* type 標明物理硬體的類型 主要說明硬體是否需要 arp 定義在 include/linux/if_arp.h 裡 */ unsigned short type; /* interface hardware type */ /* 上層協定層根據 hard_header_len 在發送資料緩衝區前面預留硬體封包頭空間 */ unsigned short hard_header_len; /* hardware hdr length */ /* priv 指向驅動程式自己定義的一些參數 */ void *priv; /* pointer to private data */ /* Interface address info. */ unsigned char broadcast[max_addr_len]; /* hw bcast add */ unsigned char pad; /* make dev_addr alignedd to 8 bytes */ unsigned char dev_addr[max_addr_len]; /* hw address */ unsigned char addr_len; /* hardware address length */ unsigned long pa_addr; /* protocol address */ unsigned long pa_brdaddr; /* protocol broadcast addr */ unsigned long pa_dstaddr; /* protocol P-P other side addr */ unsigned long pa_mask; /* protocol netmask */ unsigned short pa_alen; /* protocol address length */ struct dev_mc_list *mc_list; /* Multicast mac addresses */ int mc_count; /* Number of installed mcasts */ struct ip_mc_list *ip_mc_list; /* IP multicast filter chain */ u32 tx_queue_len; /* Max frames per queue allowed */ /* For load balancing driver pair support */ 105

107 DMA270 Linux 操作流程 unsigned long pkt_queue; /* Packets queued */ struct device *slave; /* Slave device */ struct net_alias_info *alias_info; /* main dev alias info */ struct net_alias *my_alias; /* alias devs */ /* Pointer to the interface buffers. */ struct sk_buff_head buffs[dev_numbuffs]; /* Pointers to interface service routines. */ int (*open)(struct device *dev); int (*stop)(struct device *dev); int (*hard_start_xmit) (struct sk_buff *skb, struct device *dev); int (*hard_header) (struct sk_buff *skb, struct device *dev, unsigned short type, void *daddr, void *saddr, unsigned len); int (*rebuild_header)(void *eth, struct device *dev, unsigned long raddr, struct sk_buff *skb); #define HAVE_MULTICAST void (*set_multicast_list)(struct device *dev); #define HAVE_SET_MAC_ADDR int (*set_mac_address)(struct device *dev, void *addr); #define HAVE_PRIVATE_IOCTL int (*do_ioctl)(struct device *dev, struct ifreq *ifr, intt cmd); #define HAVE_SET_CONFIG int (*set_config)(struct device *dev, struct ifmap *map); #define HAVE_HEADER_CACHE void (*header_cache_bind)(struct hh_cache **hhp, struct devvice *dev, unsigned short htype, u32 daddr); 106

108 第二章 實驗篇 void (*header_cache_update)(struct hh_cache *hh, struct devvice *dev, unsigned char * haddr); #define HAVE_CHANGE_MTU int (*change_mtu)(struct device *dev, int new_mtu); struct iw_statistics* (*get_wireless_stats)(struct device *dev); }; 這個資料結構中最有用的部分是描述傳輸層檔案頭, 網路層檔案和鏈路層檔案這三個聯合 (h,nh 和 mac) 這些聯合包含了幾個結構, 依賴於具體的資料封包中使用的協定 應該注意的是, 傳輸層檔案和網路層檔案可能是指向記憶體中的同一個位置 另一個重要部分是 len 和 data 這兩個域 Len 指定了從 data 開始的資料封包中資料的總長度 5. 在核心中添加網路驅動設備過程進入 linux cyh 目錄後, 運作 make menuconfg 命令, 將會彈出 PX270 Linux 的核心配置功能表欄 在彈出的核心配置功能表欄中選擇 Networking support" 目標 107

109 DMA270 Linux 操作流程 接著按 Enter 鍵進入 Networking support" 子目錄, 在子目錄中, 選擇 [*]Networking support 選中 Networking support" 後, 彈出如下選單欄 這時進入 Networking options" 目錄選擇相關的網路協定, 比如 TCP/IP 協定之類的 進入 Networking options" 選項後, 設定如下 : 108

110 第二章 實驗篇 設定好後, 返回到圖 5-2 介面, 接著選擇 [*]Networking options 選項, 接著進入在 []Networking options 選項下的 Ethernet (10 or 100Mbit)" 選項, 在 Ethernet (10 or 100Mbit)" 目錄下設定如下 : 109

111 DMA270 Linux 操作流程 經過上面的設定後, 我們就在 PXA270 的 Linux 核心中支持了 CS8900 和 DM9000 網路周邊設備, 同時支援了 TCP/IP 協定 實驗步驟 1. 10M 網路實驗步驟用交叉網路線連接教學平台的 10M 網路介面 (CON4) 和 PC 的網路介面 在 Linux 系統啟動過程中網路卡晶片驅動載入成功後, 輸入查看網路卡 IP 的命令 ifconfig, 按下 ENTER 即可查看網路卡的相關資訊 只有在確保 DMA-PXA270 實驗平台上網路卡 IP 跟電腦主機上網路卡 IP 位址在同一個網段內, 才能 ping 通 在 Linux 命令提示符號下輸入命令 ifconfig eth , 即把網路卡的 IP 位址設為 , 如果電腦主機上網路卡的 IP 為 , 在命令提示符下輸入命令 ping 如果可以收到從 發過來的資料封包, 即可以 ping 通 110

112 第二章 實驗篇 根檔案系統在 INIT 時啟動了 FTP 處理程序, 因此在網路連通後可在 PC 與開發板之間進行檔傳輸 在 PC 機器的命令行下執行 ftp , 用戶名為 root, 密碼為 linux, 用 bye 命令可斷開連接 111

113 DMA270 Linux 操作流程 M NET 實驗步驟用交叉網路線連接教學平台的 100M 網路介面和 PC 的網路介面 在 Linux 系統啟動過程中網路卡晶片驅動載入成功後, 輸入查看網路卡 IP 的命令 ifconfig, 按下 ENTER 即可查看網路卡的相關資訊 只有在確保 DMA-PXA270 實驗上網路卡 IP 跟電腦主機上網路卡 IP 位址在同一個網段內, 才能 ping 通 在 Linux 命令提示符號下輸入命令 ifconfig eth , 即把網路卡的 IP 位址設為 , 並把 10M 的網路介面 (eth0 設備 ) 的 IP 設為其他的區段 ( 如 X), 如果電腦主機上網路卡的 IP 為 , 在命令提示符下輸入命令 ping 如果可以收到從 發過來的資料封包, 即可以 ping 通 112

114 第二章 實驗篇 根檔案系統在 INIT 時啟動了 FTP 處理程序, 因此在網路連通後可在 PC 與開發板之間進行檔案傳輸 在 PC 機器的命令行下執行 ftp , 用戶名為 root, 密碼為 linux, 用 bye 命令可斷開連接 113

115 DMA270 Linux 操作流程 114

116 第二章 實驗篇 實驗 8 WEB SERVER 網頁伺服器實驗 實驗目的 瞭解在嵌入式系統中 WEB 伺服器的實現 瞭解 HTTP 協議 實驗內容 建立 WEB 伺服器實現網頁的流覽 實驗設備 DMA-PXA270 實驗平台 PC 機器 串列埠連接線 電源 交叉網路線 實驗原理一個 Web 伺服器也被稱為 HTTP 伺服器, 它通過 HTTP 協定與用戶端通訊 這個用戶端通常指的是 Web 瀏覽器 因此, 本文從討論 HTTP 開始, 然後將解釋一個與本文相關的簡單的 Web 應用 The Hypertext Transfer Protocol(HTTP) HTTP 是一種讓 Web 伺服器與瀏覽器 ( 用戶端 ) 通過 Internet 發送與接收資料的協定 它是一個請求 回應協定 -- 用戶端發出一個請求, 伺服器回應這個請求 HTTP 運用可靠的 TCP 連接, 通常用的 TCP 80 埠 它的第一個版本是 HTTP/0.9, 然後被 HTTP/1.0 取代 當前的版本是 HTTP/1.1, 由 RFC2616(.pdf) 定義 本節主要對應 HTTP 1.1, 足夠使你充分理解由 Web 伺服器程式發出的消息 如果你對更加詳細的知識有興趣, 可以參考 RFC2616 在 HTTP 中, 用戶端總是通過建立一個連接與發送一個 HTTP 請求來發起一個事務 伺服器不能主動去與用戶端聯繫, 也不能給用戶端發出一個回叫連接 用戶端與伺服器端都可以提前中斷一個連接 例如, 當用一個瀏覽器下載一個檔案時, 你可以通過以滑鼠按下 停止 " 鍵來中斷檔案的下載, 關閉與伺服器的 HTTP 連接 115

117 DMA270 Linux 操作流程 HTTP 請求 : 一個 HTTP 請求包含三個部分 : Method-URI-Protocol/Version 方法 - 位址 - 版本 Request header 請求頭 Entity body 請求實體下面是一個 HTTP 請求實例 : POST /servlet/default.jsp HTTP/1.1 Accept: text/plain; text/html Accept-Language: en-gb Connection: Keep-Alive Host: localhost Referer: User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98) Content-Length: 33 Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate LastName=Franks&FirstName=Michael The Method-URI-Protocol/Version 在這個請求的第一行 : POST /servlet/default.jsp HTTP/1.1 其中 POST 是請求的類型 每個用戶端 HTTP 請求可以是 HTTP 規範中指定的許多請求類型中的一種 HTTP 1.1 支援七種類型的請求, 它們是 GET,POST,HEAD, OPTIONS,PUT,DELETE,TRACE 其中 GET 與 POST 是 Internet 應用中經常用到的二種請求類型 URI 完整地指定了 Internet 資源 一個 URI 通常被解析為相對伺服器的根目錄 這樣, 它應該總是以一個 '/' 首碼開始 一個 URL 實際上是 URI 的一種類型 Version 指的是該 HTTP 請求所用到的 HTTP 協定版本 請求頭包含了用戶端環境與請求實體的一些有用的資訊 例如它包含瀏覽器設定的語言 實體的長度等等 每條請求頭用按下 ENTER 換行符號 (CRLF) 分開 一個非常重要的空行分開了請求頭與實體, 它標誌著實體內容的開始 一些 Internet 開發書籍認為這個 CRLF 空行是 HTTP 請求的第四個部分 在上面的 HTTP 請求中, 實體只是簡單以下的一行 : LastName=Franks&FirstName=Michael 116

118 第二章 實驗篇 在一個典型的 HTTP 請求中, 請求實體內容會長得多 HTTP 回應 : 與請求相似,HTTP 回應也由三部分組成 : Protocol-Status code-description 協定狀態描述程式碼 Response headers 回應頭 Entity body 回應實體以下是一個 HTTP 響應的實例 : HTTP/ OK Server: Microsoft-IIS/4.0 Date: Mon, 3 Jan :13:33 GMT Content-Type: text/html Last-Modified: Mon, 11 Jan :23:42 GMT Content-Length: 112 <html> <head> <title>http Response Example</title></head><body> Welcome to Brainy Software </body> </html> 回應頭的第一行類似請求頭的第一行, 告訴你所用的協議是 HTTP 1.1, 請求成功 (200=success), 以及沒有任何問題 回應頭類似請求頭也包含了一些有用的資訊 回應的實體回應本身的 HTML 內容 頭與實體之間由按下 ENTER 換行的空行 (CRLF) 分開 Socket 類 : 一個 socket 是一個網路連接的端點, 它使得一個應用可以從網路讀與寫 在不同電腦上的二個應用軟體能夠通過收發位元組介面而彼此通訊 要發一個資訊到另一個應用程式, 你需要知道它的 IP 位址, 以及它的 socket 埠號 要建立一個 socket, 你可以用 Socket 類中幾個建立方法中的一個 其中一個接受主機名與埠號作為參數 : new Socket("yahoo.com", 80); 一旦你成功地建立了一個 Socket 類的實例, 你就可以用它去發送與接收位元組介面了 以下程式碼建立一個可以與本地 HTTP 伺服器通訊的 socket ( 表示一個 117

119 DMA270 Linux 操作流程 本地的主機 ), 發送一個 HTTP 請求, 並接收從伺服器的回應 它還建立一個 StringBuffer 物件來接受響應, 並列印到控制台 Socket socket = new Socket(" ", "8080"); OutputStream os = socket.getoutputstream(); boolean autoflush = true; PrintWriter out = new PrintWriter( socket.getoutputstream(), autoflush ); BufferedReader in = new BufferedReader( new InputStreamReader( socket.getinputstream() )); // send an HTTP request to the web server out.println("get /index.jsp HTTP/1.1"); out.println("host: localhost:8080"); out.println("connection: Close"); out.println(); // read the response boolean loop = true; StringBuffer sb = new StringBuffer(8096); while (loop) { if ( in.ready() ) { int i=0; while (i!=-1) { i = in.read(); sb.append((char) i); } loop = false; } Thread.currentThread().sleep(50); } // display the response to the out console System.out.println(sb.toString()); socket.close(); 注意要從 web 伺服器得到正確的回應, 你必須要發送用 HTTP 協定編譯了的 HTTP 請求 如果你看了上面的 HTTP 部分, 你應該能夠理解上面程式碼中的 HTTP 請求 118

120 第二章 實驗篇 實驗步驟利用 BUSYBOX 所帶的 HTTPD 可在開發板上建立一個簡單的 WEB 伺服器, 在 shell 下執行 httpd h /home/httpd 就可以啟動 WEB 服務了, 在 PC 上打開網路瀏覽器, 在位址欄裡直接輸入開發板的 IP 位址 再按下 ENTER 即可看到開發板上的網頁 119

121 DMA270 Linux 操作流程 實驗 9 瀏覽器取用外部 Internet 實驗 實驗目的 瞭解如何在嵌入 Linux 下設定 DNS, 閘道等等 掌握在嵌入式 Linux 下取用外部 Internet 的操作 實驗內容 設定 DNS 和閘道來連接 Internet 實驗設備 DMA-PXA270 實驗平台 PC 機器 串列埠連接線 電源 交叉網路線 實驗原理 1.DNS 簡介 DNS 分為 Client 和 Server,Client 扮演發問的角色, 也就是問 Server 一個 Domain Name, 而 Server 必須要回答此 Domain Name 的真正 IP 地址 而當地的 DNS 先會查自己的資料庫 如果自己的資料庫沒有, 則會往該 DNS 上所設的的 DNS 詢問, 依此得到答案之後, 將收到的答案存起來, 並回答客戶 DNS 伺服器會根據不同的授權區 (Zone), 記錄所屬該網域下的各名稱資料, 這個資料封包括網域下的次網功能變數名稱稱及主機名稱 在每一個名稱伺服器中都有一個快取緩存區 (Cache), 這個快取緩存區的主要目的是將該名稱伺服器所查詢出來的名稱及相對的 IP 位址記錄在快取緩存區中, 這樣當下一次還有另外一個用戶端到次伺服器上去查詢相同的名稱時, 伺服器就不用在到別台主機上去尋找, 而直接可以從緩存區中找到該筆名稱記錄資料, 傳回給用戶端, 加速用戶端對名稱查詢的速度 例如 : 當 DNS 用戶端向指定的 DNS 伺服器查詢網際網路上的某一台主機名稱 DNS 伺服器會在該資料庫中找尋用戶所指定的名稱如果沒有, 該伺服器會先在自己的快取緩存區中 120

122 第二章 實驗篇 查詢有無該筆紀錄, 如果找到該筆名稱記錄後, 會從 DNS 伺服器直接將所對應到的 IP 位址傳回給用戶端, 如果名稱伺服器在資料記錄查不到且快取緩存區中也沒有時, 伺服器首先會才會向別的名稱伺服器查詢所要的名稱 例如 : DNS 用戶端向指定的 DNS 伺服器查詢網際網路上某台主機名稱, 當 DNS 伺服器在該資料記錄找不到用戶所指定的名稱時, 會轉向該伺服器的快取緩存區找尋是否有該資料, 當快取緩存區也找不到時, 會向最接近的名稱伺服器去要求幫忙找尋該名稱的 IP 地址, 在另一台伺服器上也有相同的動作的查詢, 當查詢到後會回復原本要求查詢的伺服器, 該 DNS 伺服器在接收到另一台 DNS 伺服器查詢的結果後, 先將所查詢到的主機名稱及對應 IP 位址記錄到快取緩存區中, 最後在將所查詢到的結果回復給用戶端 實驗步驟手動設定 DNS 伺服器的 IP 位址需要修改 /etc/resolv.conf 文件, 在 root_tmp.cramfs 根檔案系統裡這是一個連接檔, 可以在開發板上用 VI 直接編輯修改, 對 vi 編輯不熟可先在 PC 上編輯好再通過 rz 或 FTP 傳到開發板上來, 缺省閘道可用 route 命令設定 設定 IP 位址, 增加閘道 : ifconfig eth route add default gw

123 DMA270 Linux 操作流程 進入 /etc 下修改 DNS vi /etc/resolv.conf 之後就可以用 nslookup ftp wget 等取用 internet 了 122

124 第二章 實驗篇 123

125 DMA270 Linux 操作流程 實驗 10 CCD 攝影機拍攝實驗 實驗目的 瞭解 Camera 的相關特性 掌握 PXA270 對 Camera 的實現 瞭解 Linux 下 PXA270 的 Camera 驅動程式的實現 實驗內容 在 Linux 下啟動 CCD 攝影機 實驗設備 DMA-PXA270 實驗平台 PC 機器 網路線 串列埠連接線 電源 實驗原理 1. CCD 攝影機簡介 CCD 攝影機作為一種視訊輸入設備, 已經誕生了很久了, 在它被廣泛普及之前, 一般都是用於視訊會議, 遠端醫療以及實施監控 隨著 CCD 攝影機成像技術的不斷進步和成熟, 加上互連網的推波助瀾, 它的普及率越來越高, 價格也降到了一般人所能承受的水平 下面先介紹幾個有關 CCD 攝影機的技術參數名詞 : 圖元 :CCD 攝影機的圖元數包括有效圖元 (Effective Pixels) 和最大圖元 (Maximum Pixels) 與最大圖元不同的是有效圖元數是指真正參與感光成像的圖元值, 而最高圖元的數值是感光器件的真實圖元, 這個資料通常包含了感光器件的非成像部分, 而有效圖元是在鏡頭變焦倍率下所換算出來的值 CCD 攝影機的圖元數越大, 所拍攝的靜態圖像的解析度也越大, 相對應的一張圖片所佔用的空間也會增大 有效圖元 : 有效圖元數英文名稱為 Effective Pixels 與最大圖元不同, 有效圖元數是指真正參與感光成像的圖元值 最高圖元的數值是感光器件的真實圖元, 這個資料通常包含了感光器件的非成像部分, 而有效圖元是在鏡頭變焦倍率下所換算出來的值 數碼圖片的儲存方式一般以圖元 (Pixel) 為單位, 每個像素是數碼圖片裡面積最小的單位 124

126 第二章 實驗篇 圖元越大, 圖片的面積越大 要增加一個圖片的面積大小, 如果沒有更多的光進入感光器件, 唯一的辦法就是把圖元的面積增大, 這樣一來, 可能會影響圖片的銳力度和清晰度 所以, 在圖元面積不變的情況下,CCD 攝影機能獲得最大的圖片圖元, 即為有效圖元 最大圖元 : 最大圖元英文名稱為 Maximum Pixels, 所謂的最大圖元是經過插值運算後獲得的 插值運算通過設在數碼相機內部的 DSP 晶片, 在需要放大圖像時用最臨近法插值 線性插值等運算方法, 在圖像內添加圖像放大後所需要增加的圖元 插值運算後獲得的圖像質量不能夠與真正感光成像的圖像相比 以最大圖元拍攝的圖片清晰度比不上以有效圖元拍攝的 感測器 : 感光器是 CCD 攝影機的核心, 也是最關鍵的技術 目前 CCD 攝影機的核心成像部件有兩種 : 一種是廣泛使用的 CCD( 電荷藕合 ) 元件 ; 另一種是 CMOS( 互補金屬氧化物導體 ) 器件 CCD 攝影機基本有兩種 : 一種是數位 CCD 攝影機, 可以獨立與微處理機配合使用, 另一種是類比 CCD 攝影機, 要配合視訊捕捉卡一起使用 一般我們所購買的都是前者, 所以這篇文章將著重介紹是數位 CCD 攝影機 CCD 攝影機的核心就是鏡頭, 現在市面上的分別有兩種感光元器件的鏡頭 : 一種是電荷藕合器件圖像感測器 CCD(Charge Coupled Device), 它使用一種高感光度的半導體材料製成, 能把光線轉變成電荷, 通過模數轉換器晶片轉換成數位信號, 數位信號經過壓縮以後由 CCD 攝影機內部的閃速記憶體或內部硬碟卡儲存, 因而可以輕而易舉地把資料傳輸給電腦, 並借助於電腦的處理手段, 根據需要和想像來修改圖像 CCD 由許多感光單位組成, 通常以百萬圖元為單位 當 CCD 表面受到光線照射時, 每個感光單位會將電荷反映在元件上, 所有的感光單位所產生的信號加在一起, 就構成了一幅完整的畫面 一般是用於攝影攝像方面的高端技術元件, 應用技術成熟, 成像效果較好, 但是價格相對而言較貴 另外一種是比較新型的感光器件互補性氧化金屬半導體 CMOS(Complementary Metal-Oxide Semiconductor) 和 CCD 一樣同為在 CCD 攝影機中可記錄光線變化的半導體 CMOS 的製造技術和一般電腦晶片沒什麼差別, 主要是利用矽和鍺這兩種元素所做成的半導體, 使其在 CMOS 上共存著帶 N( 帶 電 ) 和 P( 帶 + 電 ) 級的半導體, 這兩個互補效應所產生的電流即可被處理晶片紀錄和解讀成影像 然而,CMOS 的缺點就是太容易出現雜點, 這主要是因為早期的設計使 CMOS 在處理快速變化的影像時, 由於電流變化過於頻繁而會產生過熱的現像 它相對於 CCD 來說價格低, 功耗小 較早期的 CMOS 對光源的要求比較高, 現在在採用 CMOS 為感光元器件的產品中, 通過採用影像光源自動增益補強技術, 自動亮度 白平衡控制技術, 色飽和度 對比度 邊緣 125

127 DMA270 Linux 操作流程 增強以及伽馬矯正等先進的影像控制技術, 可以接近 CCD 攝影機的效果 2. PXA270 的 CAMERA 介面介紹 PXA270 整合了一個 CCD 攝影機介面, 只要支援 CMOS 類型的 CCD 攝影機 當然也可以支援一些特定的 CCD 類型 CCD 攝影機 CCD 攝影機介面從圖像感測器獲得資料和控制信號, 並將適當的資料格式的資料通過 DMA 方式放置到記憶體中 寬度範圍的介面和信號的選擇提供了直接的連接 圖像感測器能夠通過不同的並和串列格式提供原始資料 對於支援預處理功能的感測器, CCD 攝影機介面支援幾種 RGB 和 YcbCr 格式 介面支援國際電訊聯合協定 ITU-R BT 功能特性 CCD 攝影機介面支援如下功能 : 平行介面支援 8,9 和 10 位元模式 串列介面支援 4 位元 5 位元設備連接 ; 支持 ITU-R BT SAV 和 EAV 內部同步 ; 預處理捕捉模式 : RGB 8:8:8,RGBT 8:8:8, RGB 6:6:6,RGB 5:6:5,RGB 5:5:5, RGBT 5:5:5,RGB 4:4:4 資料格式 - YcbCr4:2:2 資料格式 ; - 等 原始捕捉模式 - 共同的原始圖像資料格式是 RGGB 只要運作在 PXA270 處理器上的軟體能正確的解析特殊的圖形資料格式,CCD 攝影機介面就能夠捕捉絕大部分的原始圖形資料格式 支持壓縮檔的 8,9 和 10 位元原始像素精度 ; 可以支援的垂直和水平的 2048x2048 解析度 ; 兩個 8 入口 (64 位元 ) 和 1 個 16 個 (64 位元 )FIFOs; 可編寫程式的感測器時脈輸出 : 從 KHz 到 52MHz; 可編寫程式介面時序信號 ; 可編寫程式的 FIFO 溢出, 線結束以及封包結束中斷 ; 可編寫程式封包捕捉速率允許用戶來捕捉所有的封包或者 2 到 8 封包 126

128 第二章 實驗篇 信號描述 CCD 攝影機介面的 I/O 信號描述 接腳名稱 類型 定義 CIF_DD<9:0> 輸入 資料線, 每個像素時脈週期可以傳輸 4,5,8, 9, 或者 10 位元資料 ; CIF_MCLK 輸出 由圖像感測器來使用的可編寫程式時脈輸出 ; CIF_PCLK 輸入 由 CCD 攝影機介面來使用的像素時脈來將像素資料鎖存到輸入 FIFO 不能超過 1/4 CICLK, 這裡 CICLK 與 LCD 時脈是一樣的頻率 對於 104-MHz CICLK, 最大的 CIF_PCLK 是 26MHz CIF_Lv 輸入 / 輸出線起始或可選擇的同步信號, 用在感測器的讀 出信號, 或者外部水平同步 CIF_FV 輸入 / 輸出封包起始或可改變的同步信號, 用在感測器的 封包讀出信號, 或者外部垂直同步 操作 CCD 攝影機介面可以支援來自於不同製造廠家的多種攝像圖像感測器 圖像感測器根據不同的介面模式, 提供的圖像預處理的程度以及直接連接需要的接腳數來變化 PXA27x 處理器的 CCD 攝影機介面為信號的連接提供了高度的彈性 PXA270 的 CCD 攝影機介面接收來自於圖像感測器的視訊 / 圖像資料介面, 並且為不管是主還是從設備提供所有操作感測器的控制信號 在感測器主模式下, 處理器的 CCD 攝影機介面從感測器接收同步信號 在感測器從模式下,CCD 攝影機介面為感測器傳輸同步信號 幾種簡化接腳的選擇被作為主模式操作的子操作 這些包括了關於 4 位和 5 位元方案的連續的資料, 以及在資料流程中嵌入 SAV 和 EAV 的感測器的同步信號的消除 感測器的 CIF_MCLK 輸出時脈是可以編寫程式的 時序信號 CIF_FV 和 CIF_LV, 由感測器提供, 來啟動和重置 CCD 攝影機介面 PXA270 的 CCD 攝影機介面能夠配置成在每行和每封包的結束提供中斷 它包含了為特定的感測器提供模式操作的設定配置的暫存器 當同步封包的控制序列和電位時序被嵌入在資料流程中的時候,SAV/EAV 解碼功能被使用 許多圖像感測器提供由 ITU-R BT 協定定義的 SAV/EAV 解碼功能 嵌入時序的使用減少了同步信號的接腳數量 接收的像素資料可以有幾種可能的格式 : 原始的 RGGB, YcbCr4:2:2, RGB 8:8:8, 127

129 DMA270 Linux 操作流程 RGB 6:6:6, RGB 5:6:5,RGB 5:5:5, RGBT 5:5:5, 和 RGB 4:4:4 當原始的 RGGB 捕獲 模式被致能, 資料可以是 8 位元,9 位或者 10 位格式 如果需要, 原始的資料可以是 不連續的, 並且這時不管檔案是 8 還是 16 位大小都預先傳輸到記憶體 在一個類似的 模式下, 預處理圖像格式被壓縮成 16 位或 32 位大小 預處理格式能夠在記憶體中以幾種不同的形式被操作 YcbCr4:2:2 格式不管是在壓縮檔或單個模式下能夠被組織 ; RGB 8:8:8 和 RGB 6:6:6 模式能夠在記憶體以非壓縮檔或者壓縮檔格式來組織 RGB 的精度可以支援到 24bpp CCD 攝影機介面的操作模式 模型名稱 模式 資料匯流排同步 S= 串列信號 P= 並行 定義 主 - 並行 MP 8P,9P,10P CIF_LV CIF_FV 圖像感器產生同步信號 資料線是並行的, 可以是 8,9, 或者 10 位元寬度 從 - 並行 SP 8P,9P,10P CIF_LV CIF_FV CCD 攝影機介面產生同步信號 資料線是並行的, 可以是 8, 9, 或者 10 位元寬度 主 - 串列 MS 4S,5S CIF_LV CIF_FV 圖像感測器產生同步信號 資料線是串列的,4 或 5 位元寬度 嵌入 - 並行 EP 8P - 圖像感測器產生同步信號,SAV ( 視訊啟動起始 ) 和 EAV( 視訊終止 ) 被嵌入到資料流程中 資料線是並行的,8 位元寬度 嵌入 - 串列 ES 4S - 圖像感測器產生同步信號 SAV 和 EAV 被嵌入在資料流程中 資料線是串列的,4 位元寬度 對於大部分感測器的曝光, 封包頻率以及於曝光控制和圖像處理相關的參數是可編寫程式的 一旦感測器被配置, 感測器開始向介面提供資料 如果感測器工作在主模式下, 它也產生封包和線同步信號 在從模式下, 同步信號由 PXA270 的 CCD 攝影機介面向感測器提供 128

130 第二章 實驗篇 時脈 (CICLK 和 MCLK) 產生為了產生可編寫程式頻率的感測器主時脈 (MCLK), 時脈產生器通過可編寫程式分頻值 CICR4[DIV] 來對內部輸入時脈 CICLK 進行分頻 CICLK 與內部的 LCD 時脈是同樣的頻率, 下面的等式用來計算 MCLK 頻率 : MCLK= CICLK/2(DIV+1) 注意 : 感測器可以使用由 PXA270 的 CCD 攝影機介面提供的 MCLK, 也可以在主模式下使用自己的時脈 當然, 由感測器向 CCD 攝影機介面提供的像素頻率不能超過 CICLK 的 1/4 如果感測器不支援到 CCD 攝影機介面的時脈,MCLK 頻率不能超過 CICLK 的 1/4 像素格式 CCD 攝影機支持 RAW,RGB 8:8:8, RGBT 8:8:8, RGB 6:6:6, RGB 5:5:5, RGBT 5:5:5,RGB 5:6:5,RGB 4:4:4, 和 YcbCr4:2:2 視訊取樣格式 功能時序 主 - 並行模式功能時序主 - 並行模式的介面時序如下 BLW = 線開始像素時脈等待數 從 - 並行模式功能時序從 - 並行模式的介面時序圖如下 : VSW = 垂直同步脈衝寬度

131 DMA270 Linux 操作流程 HSW = 水平同步脈衝寬度 -1 BFPW = 封包開始像素等待數 -1 BLW = 線等待開始 ELW = 線結束像素時脈等待數 EFW = 封包結束線時脈等待數 嵌入 - 並行模式功能時序嵌入 - 並行模式的時序圖如下 : 嵌入 - 串列模式功能時序嵌入 - 串列模式介面時序圖如下 : 主 - 串列模式功能時序主 - 串列模式介面時序圖如下 : BLW = 線開始像素時脈等待數 130

132 第二章 實驗篇 3. Linux 下的 CAMERA 驅動程式 Linux 的設備分為 3 類 : 字元設備, 區塊設備和網路設備 對於用戶來說, 字元設備和區塊設備的取用介面都是一組基於檔案系統的應用, 其實現的區別主要在二者的核心和驅動程式的軟體介面上, 這一章節討論的 CCD 攝影機驅動實質屬於字元設備 I/O 子系統通過資料結構 file_operations( 見 include/linux/fs.h) 向其核心的其他部分提供了一個統一的標準設備介面 當應用程式對設備檔進行如 open/close,read/write 操作時, 核心使用 file_operations 結構取用驅動程式的函數 也就是說, 如果應用程式對設備執行操作, 核心將執行 file_operations 結構中的程式 因此, 寫驅動程式的任務之一就是完成 file_operations 結構中的函數指標 Linux 的設備驅動程式大致可分為如下幾個部分 : 驅動程式的註冊與登出, 設備的打開與釋放, 設備的讀寫操作, 設備的打開與釋放, 設備的讀寫操作, 設備的控制操作, 設備的中斷和輪詢處理 PXA270 的 CCD 攝影機驅動程式要實現設備的註冊登出, 還實現攝像頭的打開模組,CCD 攝影機控制模組 ( 初始化在該模組中實現 ) 和 CCD 攝影機關閉模組 在應用程式中, 首先應用 open() 打開 CCD 攝影機, 然後應用 ioctl() 進行 CCD 攝影機參數設定及一系列初始化 程式運作完畢後, 關閉 CCD 攝影機 驅動程式使用 video_register_device (&vd,vfl_type_grabber,minor) pxa_camera_fops 是一個指向跳躍表 file_operations 的指標,file_operations 的結構如下 : static struct file_operations pxa_camera_fops = {.owner = THIS_MODULE,.open = pxa_camera_open,.release = pxa_camera_close,.ioctl = pxa_camera_ioctl,.read = pxa_camera_read,.mmap = pxa_camera_mmap,.poll = pxa_camera_poll,.llseek = no_llseek, }; 131

133 DMA270 Linux 操作流程 4. 在 PXA270 的 Linux 核心裡添加 CAMERA 驅動這一章節主要介紹如何向 Linux 核心中添加 PXA270 的 CAMERA 驅動 (1) 進入 linux cyh 目錄下, 運作 make menuconfig 命令 make menuconfig (2) 在彈出的核心配置框中, 選擇 "Multimedia devices" (3) 按下 ENTER, 進入 "Multimedia devices", 在 "Multimedia devices" 的目錄下, 選擇 Video For Linux" 選項, 接著又選擇 Video For Linux" 選項, 設定如下 : 132

134 第二章 實驗篇 (4) 在選中 Video For Linux" 後, 按下 ENTER, 進入 Video For Linux" 目錄後, 設定如下 : 133

135 DMA270 Linux 操作流程 (5) 設定好後, 按 ESC 鍵退出 這樣就將 PXA270 的 CAMERA 的介面添加到 Linux 中了 實驗步驟 在 shell 下執行 testcamera m 就可以啟動 CCD 攝影機測試程式, 啟動成功後會顯示如下資訊 : 134

136 第二章 實驗篇 這時在 LCD 上會動態顯示 CCD 攝影機捕捉到的畫面, 在控制台下按 d 鍵可以致能 / 禁止顯示,c 鍵可將捕捉的畫面儲存到 jpg 檔裡,Esc 鍵可退出測試 上圖顯示的 jpgfile0000.jpg 就是測試程式儲存的圖片檔 135

137 DMA270 Linux 操作流程 實驗 11 Qt/Embedded 嵌入式圖形開發實驗 實驗目的 瞭解 Qt/Embedded 在嵌入式系統中圖形介面的實現 學習嵌入式系統中應用程式的開發 實驗內容 編寫一個 Hello,World 應用程式 實驗設備 DMA-PXA270 實驗平台 PC 機器 串列埠連接線 源 交叉網路線 實驗原理 1. Qt/Embedded 介紹 Qt/Embedded 是一個為嵌入式設備上的圖形用戶介面和應用開發而訂做的 C++ 工具開發檔案 它通常可以運作在多種不同的處理器上部署的嵌入式 Linux 作業系統上 如果不考慮 X 視窗系統的需要, 基於 Qt/Embedded 的應用程式可以直接對緩衝封包進行寫入操作 除了類別函式庫以外,Qt/Embedded 還包括了幾個提高開發速度的工具, 使用標準的 Qt API, 我們可以非常熟練的在 Windows 和 Unix 編寫程式環境裡開發應用程式 Qt/Embedded 是一組用於取用嵌入式設備的 Qt C++ API;Qt/Embedded 的 Qt/X11, Qt/Windows 和 Qt/Mac 版本提供的都是相同的 API 和工具 Qt/Embedded 還包括類別函式庫以及支援嵌入式開發的工具 Qt/Embedded 提供了一種類型安全被稱之為信號與插槽的真正元件化編寫程式機制, 這種機制和以前的回調函數有所不同 Qt/Embedded 還提供了一個通用的 widgets 類, 這個類可以很容易的被子類化為客戶自己的元件或是對話方塊 針對一些通用的任務,Qt 還預先為客戶定制了類似於訊息方塊和嚮導這樣的對話方塊 136

138 第二章 實驗篇 運作 Qt/Embedded 所需的系統資源可以很小, 相對 X 視窗下的嵌入解決方案而言, Qt/Embedded 只要求一個較小的儲存空間 (Flash) 和記憶體 Qt/Embedded 可以運作在不同的處理器上部署的 Linux 系統, 只要這個系統有一個線性位址的緩衝封包並支援 C++ 的編譯器 您可以選擇不編譯 Qt/Embedded 某些你不需要的功能, 從而大大減小了它的記憶體佔有量 Qt/Embedded 包括了它自身的視窗系統, 並支援多種不同的輸入設備 開發者可以使用他們熟悉的開發環境來編寫程式碼 Qt 的圖形設計器 (designer) 可以用來視覺化地設計用戶介面, 設計器中有一個佈局系統, 它可以使您設計的視窗和元件自動根據螢幕空間的大小而改變佈局 開發者可以選擇一個預先定義的視覺風格, 或是建立自己獨特的視覺風格 使用 UNIX/LINUX 作業系統的用戶, 可以在工作站上通過一個虛擬緩衝封包的應用程式模擬嵌入式系統的顯示終端 Qt/Embedded 也提供了許多特定用途的非圖形元件, 例如國際化 網路和資料庫交互元件 Qt/Embedded 是成熟可靠的工具開發擋案, 它在世界各地被廣泛使用 除了在商業上的許多應用以外,Qt/Embedded 還是為小型設備提供的 Qtopia 應用環境的基礎 Qt/Embedded 以簡潔的系統, 視覺化的表單設計和詳細的 API 讓編寫程式碼變得愉快和舒暢 實驗步驟下面將通過編寫一個跳動的 Hello,World" 字串, 來講解 Qt 嵌入式應用的開發過程 1). 產生一個專案檔 (.pro 文件 ) 一個應用通常對應一個專案檔, 產生一個專案檔, 並對它做一些簡單的編輯, 然後使用一個專門的工具 ( 例如 tmake) 處理這個專案檔, 就可以產生一個 Makefile 檔 產生一個專案檔的其中一個方法是使用 progen 命令 (progen 程式可在 tmake 的安裝路徑下找到 ) 下面使用 progen 產生一個名為 hello 的專案檔 progen t app o hello.pro 產生的 hello.pro 專案檔並不完整, 開發者還需手動添加專案所包含的標頭檔, 原始檔案等資訊 2). 新建一個表單在 qt-2.3.x for x11 的安裝路徑的 bin 目錄下運作./designer" 命令, 就啟動了一個 Qt 圖形編輯器 以滑鼠按下編輯器的 new" 功能表, 彈出了一個 new Form" 對話方塊, 137

139 DMA270 Linux 操作流程 在這個對話方塊裡選擇 Widget", 然後以滑鼠按下 OK" 按鈕, 這樣就新建立了一個表單 接著對這個表單的屬性進行設定, 注意把表單的 name" 屬性設為 Hello"; 表單的各種尺寸設為寬 240", 高 320", 目的是使表單大小和 PXA270 的顯示螢幕大小一致 ; 表單背景顏色設定為白色 具體設定可參見下圖 : Hello 表單的屬性設定設定完成後, 將其儲存為 hello.ui 檔, 這個檔就是 Hello 表單的介面儲存檔案 3). 產生 Hello 表單類的標頭檔和實現檔下面根據上述的介面檔 hello.ui 使用 uic 工具產生出 Hello 表單類的標頭檔和實現檔, 具體方法是 : cd qt-2.3.7/bin uic o hello.h hello.ui uic o hello.cpp impl hello.h hello.ui 這樣就得到了 Hello 表單類的標頭檔 hello.h 和實現檔 hello.cpp 下面就可以根據我們要實現的具體功能, 在 hello.cpp 文件裡添加相對應的程式碼 比如要在 Hello 的表單上顯示一個動態的字串 Hello,World", 那麼需要重新實現 paintevent( QPaintEvent * ) 方法, 同時還需要添加一個計時器 Qtimer 實例, 以週期性刷新螢幕, 從而得到動畫得效果 下面是修改後的 hello.h 和 hello.cpp 文件 138

140 第二章 實驗篇 /************************************************************************* ** 以下是 hello.h 的程式碼 *************************************************************************/ #ifndef HELLO_H #define HELLO_H #include <qvariant.h> #include <qwidget.h> class QVBoxLayout; class QHBoxLayout; class QGridLayout; class Hello : public QWidget { Q_OBJECT public: Hello( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); ~Hello(); // 以下是手動添加的程式碼 signals: void clicked(); protected: void mousereleaseevent( QMouseEvent * ); void paintevent( QPaintEvent *); private slots: void animate(); private: QString t; int b; }; #endif // HELLO_H 139

141 DMA270 Linux 操作流程 /************************************************************************* ** 以下是 hello.cpp 來源程式碼 *************************************************************************/ #include "hello.h" #include <qlayout.h> #include <qvariant.h> #include <qtooltip.h> #include <qwhatsthis.h> #include <qpushbutton.h> #include <qtimer.h> #include <qpainter.h> #include <qpixmap.h> /* * Constructs a Hello which is a child of 'parent', with the * name 'name' and widget flags set to 'f' */ Hello::Hello( QWidget* parent, const char* name, WFlags fl ) : QWidget( parent, name, fl ) { if (!name) setname( "Hello" ); resize( 240, 320 ); setminimumsize( QSize( 240, 320 ) ); setmaximumsize( QSize( 240, 320 ) ); setsizeincrement( QSize( 240, 320 ) ); setbasesize( QSize( 240, 320 ) ); QPalette pal; QColorGroup cg; cg.setcolor( QColorGroup::Foreground, black ); cg.setcolor( QColorGroup::Button, QColor( 192, 192, 192) ); 140

142 第二章 實驗篇 cg.setcolor( QColorGroup::Light, white ); cg.setcolor( QColorGroup::Midlight, QColor( 223, 223, 223) ); cg.setcolor( QColorGroup::Dark, QColor( 96, 96, 96) ); cg.setcolor( QColorGroup::Mid, QColor( 128, 128, 128) ); cg.setcolor( QColorGroup::Text, black ); cg.setcolor( QColorGroup::BrightText, white ); cg.setcolor( QColorGroup::ButtonText, black ); cg.setcolor( QColorGroup::Base, white ); cg.setcolor( QColorGroup::Background, white ); cg.setcolor( QColorGroup::Shadow, black ); cg.setcolor( QColorGroup::Highlight, black ); cg.setcolor( QColorGroup::HighlightedText, white ); pal.setactive( cg ); cg.setcolor( QColorGroup::Foreground, black ); cg.setcolor( QColorGroup::Button, QColor( 192, 192, 192) ); cg.setcolor( QColorGroup::Light, white ); cg.setcolor( QColorGroup::Midlight, QColor( 220, 220, 220) ); cg.setcolor( QColorGroup::Dark, QColor( 96, 96, 96) ); cg.setcolor( QColorGroup::Mid, QColor( 128, 128, 128) ); cg.setcolor( QColorGroup::Text, black ); cg.setcolor( QColorGroup::BrightText, white ); cg.setcolor( QColorGroup::ButtonText, black ); cg.setcolor( QColorGroup::Base, white ); cg.setcolor( QColorGroup::Background, white ); cg.setcolor( QColorGroup::Shadow, black ); cg.setcolor( QColorGroup::Highlight, black ); cg.setcolor( QColorGroup::HighlightedText, white ); pal.setinactive( cg ); cg.setcolor( QColorGroup::Foreground, QColor( 128, 128, 128) ); cg.setcolor( QColorGroup::Button, QColor( 192, 192, 192) ); cg.setcolor( QColorGroup::Light, white ); cg.setcolor( QColorGroup::Midlight, QColor( 220, 220, 220) ); cg.setcolor( QColorGroup::Dark, QColor( 96, 96, 96) ); 141

143 DMA270 Linux 操作流程 cg.setcolor( QColorGroup::Mid, QColor( 128, 128, 128) ); cg.setcolor( QColorGroup::Text, black ); cg.setcolor( QColorGroup::BrightText, white ); cg.setcolor( QColorGroup::ButtonText, QColor( 128, 128, 128) ); cg.setcolor( QColorGroup::Base, white ); cg.setcolor( QColorGroup::Background, white ); cg.setcolor( QColorGroup::Shadow, black ); cg.setcolor( QColorGroup::Highlight, black ); cg.setcolor( QColorGroup::HighlightedText, white ); pal.setdisabled( cg ); setpalette( pal ); QFont f( font() ); f.setfamily( "adobe-helvetica" ); f.setpointsize( 29 ); f.setbold( TRUE ); setfont( f ); setcaption( tr( "")); // 以下是手動添加的程式碼 t = "Hello,World"; b = 0; QTimer *timer = new QTimer(this); connect( timer, SIGNAL(timeout()), SLOT(animate()) ); timer->start( 40 ); } /* * Destroys the object and frees any allocated resources */ Hello::~Hello() { } /* 142

144 第二章 實驗篇 */ This private slot is called each time the timer fires. // 以下至結尾是手動添加的程式碼 void Hello::animate() { b = (b + 1) & 15; repaint( FALSE ); } /* Handles mouse button release events for the Hello widget. */ We emit the clicked() signal when the mouse is released inside the widget. void Hello::mouseReleaseEvent( QMouseEvent *e ) { if ( rect().contains( e->pos() )) emit clicked(); } /* Handles paint events for the Hello widget. */ Flicker-free update. The text is first drawn in the pixmap and the pixmap is then blt'ed to the screen. void Hello::paintEvent( QPaintEvent * ) { static int sin_tbl[16] = { 0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38}; 143

145 DMA270 Linux 操作流程 if ( t.isempty() ) return; // 1: Compute some sizes, positions etc. QFontMetrics fm = fontmetrics(); int w = fm.width(t) + 20; int h = fm.height() * 2; int pmx = width()/2 - w/2; int pmy = height()/2 - h/2; // 2: Create the pixmap and fill it with the widget's background QPixmap pm( w, h ); pm.fill( this, pmx, pmy ); } // 3: Paint the pixmap. Cool wave effect QPainter p; int x = 10; int y = h/2 + fm.descent(); int i = 0; p.begin( &pm); p.setfont( font() ); while (!t[i].isnull()){ int i16 = (b+i)& 15; p.setpen( QColor((15-i16)*16,255,255,QColor::Hsv) ); p.drawtext( x, y-sin_tbl[i16]*h/800, t.mid(i,1), 1 ); x += fm.width( t[i] ); i++; } p.end(); // 4: Copy the pixmap to the Hello widget bitblt( this, pmx, pmy, &pm); 144

146 第二章 實驗篇 (4). 編寫主函數 main() 一個 Qt/Embeded 應用程式應該包含一個主函數, 主函數所在的檔案名是 main.cpp 主函數是應用程式執行的進入點 以下是 Hello,World 例子的主函數檔 main.cpp 的實現程式碼 /************************************************************************* ** 以下是 main.cpp 來源程式碼 *************************************************************************/ #include "hello.h" #include <qapplication.h> /* The program starts here. It parses the command line and builds a message string to be displayed by the Hello widget. */ #define QT_NO_WIZARD int main( int argc, char **argv ) { QApplication a(argc,argv); Hello dlg; QObject::connect( &dlg, SIGNAL(clicked()), &a, SLOT(quit()) ); a.setmainwidget( &dlg); dlg.show(); return a.exec(); } (5) 編輯專案檔 hello.pro 文件到目前為止, 為 Hello,World 例子編寫了一個標頭檔和兩個原始檔案, 這 3 個檔應該被包括在專案檔中, 因此還需要編輯 hello.pro 文件, 加入這 hello.h,hello.cpp,main.cpp 這三個檔案名 具體定義如下 : /************************************************************************* ** 以下是 hello.pro 檔的內容 145

147 DMA270 Linux 操作流程 *************************************************************************/ TEMPLATE = app CONFIG = qt warn_on release HEADERS = hello.h SOURCES = hello.cpp \ main.cpp INTERFACES = (6). 產生 Makefile 檔編譯器是根據 Makefile 檔內容來進行編譯的, 所以需要產生 Makefile 檔 Qt 提供的 tmake 工具可以幫助我們從一個專案檔 (.pro 檔 ) 中產生 Makefile 檔 結合當前例子, 要從 hello.pro 產生一個 Makefile 檔的做法是 : 首先查看環境變數 $TMAKEPATH 是否指向 arm 編譯器的配置目錄, 在命令行下輸入以下命令 echo $TMAKEPATH 如果返回的結果的末尾不是 /qws/linux-arm-g++ 的字串, 那您需要把環境變數 $TMAKEPATH 所指的目錄設定為指向 arm 編譯器的配置目錄, 過程如下 : export TMAKEPATH = /tmake 安裝路徑 /qws/linux-arm-g++ 同時, 應確保當前的 QTDIR 環境變數指向 Qt/Embedded 的安裝路徑, 如果不是, 則需要執行以下過程 : export QTDIR = /qt 上述步驟完成後, 就可以使用 tmake 產生 Makefile 檔, 具體做法是在命令行輸入以下命令 : tmake o Makefile hello.pro 這樣就可以看到當前目錄下新產生了一個名為 Makefile 的檔 下一步, 需要打開這個檔, 做一些小的修改 146

148 第二章 實驗篇 (1) 將 LINK = arm-linux-gcc 這句話改為 LINK = arm-linux-g++ 這樣做是因為要是用 arm-linux-g++ 進行鏈結 (2) 將 LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lm lqte 這句話改為 LIBS = $(SUBLIBS) -L/usr/local/arm/3.3.2/lib -L$(QTDIR)/lib -lm lqte 這是因為鏈結時要用到交叉編譯工具 toolchain 的庫 (7). 編譯鏈結整個專案最後就可以在命令行下輸入 make 命令對整個專案進行編譯鏈結了 make make 產生的二進位檔 hello 就是可以在 PXA270 上運作的可執行檔 147

149 DMA270 Linux 操作流程 148

150 附錄一 QT 圖形系統開發 附錄一 QT 圖形系統開發 基礎篇 Qt 是 Trolltech 公司的一個標誌性產品 Trolltech 公司 1994 年成立於挪威, 但是公司的核心開發團隊已經在 1992 年開始了 Qt 產品的研發, 並於 1995 年推出了 Qt 的第一個商業版, 直到現在 Qt 已經被世界各地的跨平台軟體發展人員使用, 而 Qt 的功能也得到了不斷的完善和提高 Qt 是一個支援多作業系統平台的應用程式開發框架, 它的開發語言是 C++ Qt 最初主要是為跨平台的軟體發展者提供統一的 精美的圖形用戶編寫程式介面, 但是現在它也提供了統一的網路和資料庫操作的編寫程式介面 正如微軟當年為作業系統提供了友好, 精緻的用戶介面一樣, 今天由於 Trolltech 的跨平台開發框架 Qt 的出現, 也使得 UNIX LINUX 這些作業系統以更加方便 精美的人機界面走近普通用戶 Qt 是以工具開發檔案的形式提供給開發者, 這些工具開發檔案包括了圖形設計器, Makefile 製作工具, 字體國際化工具,Qt 的 C++ 類別函式庫等等 ; 談到 C++ 的類別函式庫我們自然會想到 MFC, 是的 Qt 的類別函式庫也是等價於 MFC 的開發函式庫, 但是 Qt 的類別函式庫是支援跨平台的類別函式庫, 也就是說 Qt 類別函式庫封裝了適應不同作業系統的取用細節, 這正是 Qt 的魅力所在 目前,Qt 可以支援的作業系統平台如下 : MS/Windows 95 Windows 98 WindowsNT 4.0 Windows 2000 Windows XP Unix/X11 Linux Sun Solaris HP-UX Compaq True64Unix IBM AIX SGI IRIX 和很多其他 X11 平台 Macintoshi Mac OSX 149

151 DMA270 Linux 操作流程 嵌入式的, 包含有 FramBuffer 的 Linux 平台 Qt 的資源 trolltech 的主頁 : trolltech.com/ 支援匿名訪問的 FTP: ftp://ftp.trolltech.com 新聞組伺服器 :nntp.trolltech.com 非官方的 Qt 文檔中文翻譯小組 : 1. 認識 Qt/Embedded 嵌入式工具開發包 1.1 介紹 Qt/Embedded 是一個為嵌入式設備上的圖形用戶介面和應用開發而訂做的 C++ 工具開發包. 它通常可以執行在多種不同的處理器上部署的嵌入式 Linux 作業系統上 如果不考慮 X 視窗系統的需要, 居於 Qt/Embedded 的應用程式可以直接對緩衝封包進行寫操作 除了類別函式庫以外,Qt/Embedded 還包括了幾個提高開發速度的工具, 使用標準的 Qt API, 我們可以非常熟練的在 Windows 和 Unix 編寫程式環境裡開發應用程式 Qt/Embedded 是一組用於取用嵌入式設備的 Qt C++ API;Qt/Embedded 的 Qt/X11, Qt/Windows 和 Qt/Mac 版本提供的都是相同的 API 和工具 Qt/Embedded 還包括類別函式庫以及支援嵌入式開發的工具 Qt/Embedded 提供了一種類型安全的被稱之為信號與插槽的真正的元件化編寫程式機制, 這種機制和以前的回調函數有所不同 Qt/Embedded 還提供了一個通用的 widgets 類, 這個類別可以很容易的被子類別化為客戶自己的元件或是對話方塊 PIN 對一些通用的任務,Qt 還預先為客戶定制了類似于訊息方塊和嚮導這樣的對話方塊 執行 Qt/Embedded 所需的系統資源可以很小, 相對 X 視窗下的嵌入解決方案而言, Qt/Embedded 只要求一個較小的儲存空間 (Flash) 和記憶體 Qt/Embedded 可以執行在不同的處理器上部署的 Linux 系統, 只要這個系統有一個線性位址的緩衝封包並支援 C++ 的編譯器 您可以選擇不編譯 Qt/Embedded 某些你不需要的功能, 從而大大減小了它的記憶體佔有量 Qt/Embedded 包括了它自身的視窗系統, 並支援多種不同的輸入設備 開發者可以使用他們熟悉的開發環境來編寫程式 Qt 的圖形設計器 (designer) 可以用來視覺化地設計用戶介面, 設計器中有一個佈局系統, 它可以使您設計的視窗和元件自動依據螢幕空間的大小而改變佈局 開發者可以選擇一個預先定義的視覺風格, 或是建立自已獨特的視覺風格 使用 UNIX/LINUX 作業系統的用戶, 可以在工作站上通過一個虛擬緩衝封包的應用程式模擬嵌入式系統的顯示終端 150

152 附錄一 QT 圖形系統開發 Qt/Embedded 也提供了許多特定用途的非圖形元件, 例如國際化 網路和資料庫交互元件 Qt/Embedded 是成熟可靠的工具開發檔案, 它在世界各地被廣泛使用 除了在商業上的許多應用以外,Qt/Embedded 還是為小型設備提供的 Qtopia 應用環境的基礎 Qt/Embedded 以簡潔的系統, 視覺化的表單設計和詳致的 API 讓編寫程式變得愉快和舒暢 1.2 系統要求 Qt/Embedded 很省記憶體, 因為它不需要一個 X 伺服器或是 Xlib 庫, 相反它可以直接的寫緩衝區, 它的記憶體消耗可以通過不編譯某些不使用的功能來動態調節, 它甚至可以把全部的應用功能編譯鏈結到一個簡單的靜態鏈結的可執行程式中, 從而能夠最大的節省記憶體 Qt/Embedded 可以執行在被 Linux 支援的所有的處理器上, 當然所說的 Linux 支援某個處理器 " 是指已經有一個 Linux 的 c++ 編譯器支援產生該處理器的目標程式以及 Linux 作業系統已經順利移植到這個處理器上 目前 Qt/Embedded 可以執行在 Intel x86, MIPS, ARM, StrongARM, Motorola and PowerPC 等處理器上 Qt/Embedded 的應用程式可以直接的寫入核心緩衝區, 它支援線性的緩衝區包括 1, 4,8,15,16,24 和 32 位元深度以及 VGA16 的緩衝區, 任何被核心支援的圖形卡也可以工作, 通過對 Qt/Embedded 進行客戶化的定制可以使得它從圖形加速系統獲得好處 Qt/Embedded 對顯示螢幕的尺寸並無限制, 另外它還有許多先進的功能, 例如反別名字體 alpha-blended 點陣圖和螢幕旋轉等 Qt/Embedded 的函式庫可以通過在編譯時去除不需要的功能來進行精簡 例如, 要想不編譯 QlistView, 可以通過定義一個 QT_NO_LISTVIEW 的預處理標記來達到此目的 ; 如果不想編譯支援國際化的功能, 那麼可以定義 QT_NO_I18N 的預處理標 Qt/Embedded 提供了大約 200 個可配置的特徵, 由此在 Intel x86 平台上函式庫的大小範圍會在 700KB 到 5000KB 之間 大部分客戶選擇的配置使得函式庫的大小在 1500 KB 到 4000 KB 之間 Qt/Embedded 還使用了一些節省記憶體空間的技術, 例如隱藏式共用 ( 寫時複製 ) 和緩存 在 Qt 中有超過 20 個類別, 包括 QBitmap, QMap, QPalette, QPicture,QPixmap 和 QString, 使用了隱藏式共用技術, 目的是避免不需要的複製和最小的記憶體需求 隱藏式共用過程會自動的發生, 從而使編寫程式更簡單並且避免了處理指標和最優化時帶來的危險 許多的 Qt 元件都會被編譯成為函式庫的形式或者是插件的形式 客戶視覺元件 資料庫驅動 字體格式讀寫 圖形格式轉換 文本解碼和表單可以被編譯成插件, 從而減 151

153 DMA270 Linux 操作流程 小核心函式庫的大小並提供了更大的彈性 作為一種選擇, 如果對元件和應用瞭解得很深入的話, 它們也可以被編譯並和 Qt/Embedde 的函式庫靜態鏈結到一個簡單的可執行程式, 從而節省 ROM,RAM 和 CPU 的使用 1.3 架構 Qt/Embedded 為帶有輕量級視窗系統的嵌入式設備提供了一個標準的 Qt API. Qt/Embedded 的面向物件的設計使得它一直能不斷的向前支援像鍵盤 鼠和圖形加速卡這樣的額外設備 通過使用 Qt/Embedded, 開發者可以感受到在 Qt/X11, Qt/Windows 和 Qt/Mac 等不同的版本下使用相同的 API 編寫程式帶來的便利 應用源代碼 Qt/Embedded Qt API 緩衝區 Linux 內核 Qt/X11 Qt/XLib X Window server 圖一 :Qt/Embedded 與 Qt/X11 的 Linux 版本的比較 使用單一的 API 進行跨平台的編寫程式可以有很多好處 提供嵌入式設備和桌面電腦環境下應用的公司可以培訓開發人員使用同一套工具開發檔案, 這有利於開發人員之間共用開發經驗與知識, 也使得管理人員在分配開發人員到專案中的時候增加靈活性 更遠一步來說, 針對某個平台而開發的應用和元件也可以銷售到 Qt 支援的其他平台上, 從而以低廉的成本擴大了產品的市場 視窗系統一個 Qt/Embedded 視窗系統包含了一個或多個處理程序, 其中的一個處理程序可作為伺服器 該服務處理程序會分配客戶顯示區域, 以及產生滑鼠和鍵盤事件 該服務處理程序還能夠提供輸入方法和一個用戶介面給執行起來的客戶應用程式 該服務處理程序其實就是一個有某些額外許可權的客戶處理程序 任何程式都可以在命令行上加上 -qws" 的選項來把它作為一個伺服器執行 152

154 附錄一 QT 圖形系統開發 客戶與伺服器之間的通信使用共用記憶體的方法實現, 通訊量應該保持最小, 例如客戶處理程序直接訪問封包緩衝來完成全部的繪製操作, 而不會通過伺服器, 客戶程式需要負責繪製它們自己的標題欄和其他式樣 這就是 Qt/Embedded 函式庫內部層次分明的處理過程 客戶可以使用 QCOP 通道交換消息 服務處理程序簡單的廣播 QCOP 消息給所有監聽指定通道的應用處理程序, 接著應用處理程序可以把一個插槽連接到一個負責接收的信號上, 從而對消息做出回應 消息的傳遞通常伴隨著二進位資料的傳輸, 這是通過一個 QDataStream 類的序列化過程來實現的, 有關這個類的的描述, 見 28 頁的 非圖形類 " QProcess 類提供了另外一種非同步的處理程序間通信的機制 它用於啟動一個外部的程式並且通過寫一個標準的輸入和讀取外部程式的標準輸出和錯誤碼來和它們通信 字體 Qt/Embedded 支援四種不同的字體格式 :True Type 字體 (TTF),Postscript Type1 字體, 點陣圖發佈字體 (BDF) 和 Qt 的預呈現 (Pre-rendered) 字體 (QPF) Qt 還可以通過增加 QFontFactory 的子類來支援其他字體, 也可以支援以插件方式出現的反別名字體 每個 TTF 或者 TYPE1 類型的字體首次在圖形或者文本方式的環境下被使用時, 這些字體的字形都會以指定的大小被預先呈現出來, 呈現的結果會被緩衝 依據給定的字體尺寸 ( 例如 10 或 12 點陣 ) 預先呈現 TTF 或者 TYPE1 類型的字體檔案並把結果以 QPF 的格式保存, 這樣將可以節省記憶體和 CPU 處理時間 QPF 檔案包含了一些必要的字體, 這些字體可以通過 makeqpf 工具取得, 或者通過執行程式時加上 -savefonts" 選項獲取 如果應用程式中使用到的字體都是 QPF 格式, 那麼 Qt/Embedded 將被重新配置, 並排除對 TTF 和 TYPE1 類型的字體的編譯, 這樣就可以減少 Qt/Embedded 的函式庫的大小和存儲字體的空間 例如一個 10 點陣大小的包含所有 ASII 字元的 QPF 字體檔的大小為 1300 位元組, 這個檔案可以直接從物理存儲格式映射成為記憶體存儲格式 Qt/Embedded 的字體通常包括 Unicode 字體的一部分子集合,ASII 和 Latin-1 一個完整的 16 點陣的 Unicode 字體的存儲空間通常超過 1M, 我們應盡可能存儲一個字體的子集合, 而不是存儲所有的字, 例如在您的應用中, 您僅僅需要以 Cappuccino 字體 粗體的方式顯示您的產品的名稱, 但是您卻有一個包含了全部字形的字體檔案 輸入設備 Qt/Embedded 3.0 支援幾種滑鼠協定 :BusMouse, IntelliMouse, Microsoft 和 MouseMan.Qt/Embedded 還支援 NEC Vr41XX 和 ipaq 的觸控螢幕 通過從 QWSMouseHandler 或者 QcalibratedMouseHandler 派產生的子類, 開發人員可以讓 153

155 DMA270 Linux 操作流程 Qt/Embedded 支援更多的客戶指示設備 Qt/Embedded 支援標準的 101 鍵盤和 Vr41XX 按鍵, 通過子類化 QWSKeyboardHandler 可以讓 Qt/Embedded 支援更多的客戶鍵盤和其他的非指示設備 輸入方法對於非拉丁語系字元 ( 例如阿拉伯, 中文, 希伯來和日語 ) 的輸入法, 需要把它寫成篩檢程式的方式, 並改變鍵盤的輸入 輸入法的作者應該對全部的 Qt API 的使用有完全的認識 在一個無鍵盤的設備上, 輸入法成了唯一的輸入字元的手段 Qtpia 提供了四種輸入方法 : 筆跡識別器, 圖形化的標準鍵盤,Unicode 鍵盤, 居於字典方式提取的鍵盤 這些鍵盤的樣式如下所示 螢幕加速通過子類化 QScreen 和 QgfxRaster 可以實現硬體加速, 從而為螢幕操作帶來好處 Trolltech 提供了 Mach64 和 Voodoo3 視訊卡的硬體加速的驅動例子, 同時可以按照協定編寫其他的驅動程式 154

156 附錄一 QT 圖形系統開發 入門篇 1. Qt/Embedded 開發環境的安裝一般來說, 居於 Qt/Embedded 開發的應用程式最終會發佈到安裝有嵌入式 Linux 作業系統的小型設備上, 所以使用裝有 Linux 作業系統的 PC 或者工作站來完成 Qt/Embedded 開發當然是最理想的環境, 儘管 Qt/Embedded 也可以安裝在 Unix 和 Windows 系統上 下面將介紹如何在一台裝有 Linux 作業系統的機器上建立 Qt/Embedded 開發環境 首先, 您需要擁有三個軟體安裝包 :tmake 工具安裝檔案,Qt/Embedded 安裝檔案, Qt 的 X11 版的安裝檔案 由於上述這些軟體安裝檔案有許多不同的版本, 您要注意由於版本的不同導致這些軟體在使用時可能造成的衝突, 為此將告訴您一些基本的安裝原則 : 當您選擇或下載了 Qt/Embedded 的某個版本的安裝檔案之後, 您下一步要選擇安裝的 Qt for X11 的安裝檔的版本必須比您最先下載的 Qt/Embedded 的版本要舊, 這是因為 Qt for X11 的安裝檔的兩個工具 uic 和 designer 產生的原始檔案會和 Qt/Embedded 的庫一起被編譯鏈結, 本著 向前相容 " 的原則,Qt for X11 的版本應比 Qt/Embedded 的版本舊 將以下面所列版本的安裝檔案, 一步一步介紹 Qt/Embedded 開發環境建立的過程 ( 這些軟體可以免費從 trolltech 的 WEB 或 FTP 伺服器上下載 ), tmake 1.11 或更高版本 ; ( 產生 Qt/Embedded 應用工程的 Makefile 檔 ) Qt/Embedded (Qt/Embedded 安裝檔案 ) Qt for X11; (Qt 的 X11 版的安裝檔案, 它將產生 x11 開發環境所需要的兩個工具 ) 1.1 安裝 tmake 在 Linux 命令模式下執行以下命令 : tar xfz tmake-1.11.tar.gz export TMAKEDIR=$PWD/tmake-1.11 export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++ Export PATH=$TMAKEDIR/bin:$PATH 155

157 DMA270 Linux 操作流程 1.2 安裝 Qt/Embedded 在 Linux 命令模式下執行以下命令 : tar xfz qt-embedded tar.gz cd qt export QTDIR=$PWD export QTEDIR=$QTDIR export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH./configure -qconfig -qvfb -depths 4,8,16,32 make sub-src cd.. 上述命令./configure -qconfig -qvfb -depths 4,8,16,32 指定 Qt 嵌入式開發檔案生成虛擬工具 qvfb, 並支援 4,8,16,32 位元的顯示顏色深度 另外我們也可以在 configure 的參數中添加 -system-jpeg 和 gif, 使 Qt/Embedded 平台能支援 jpeg gif 格式的圖形 配置參數 -qconfig local 是指使用 qconfig-local.h 標頭檔作為配置檔, 這個檔需要用戶自己產生, 並儲存到 src/tools 檔案夾裡面 以下是一個實現最大化編譯的 qconfig-local.h 文件的示例 : #ifndef QT_H #endif // QT_H #ifndef QT_DLL #define QT_DLL // Internal #endif #define QT_QWS_IPAQ // Platforms where mouse cursor is never required. #if defined(qt_qws_ipaq) defined(qt_qws_cassiopeia) defined(qt_qws_sl5xxx) # define QT_NO_QWS_CURSOR 156

158 附錄一 QT 圖形系統開發 # define QT_NO_QWS_MOUSE_AUTO #endif 編譯選項的具體用法可運作./configure -help 命令查看 1.3 安裝 Qt/X 在 Linux 命令模式下執行以下命令 : tar xfz qt-x tar.gz cd qt export QTDIR=$PWD export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH./configure -no-opengl make make -C tools/qvfb mv tools/qvfb/qvfb bin cp bin/uic $QTEDIR/bin cd.. 依據開發者本身的開發環境, 也可以在 configure 的參數中添加別的參數, 比如 -no-opengl 或 -no-xfs, 可以鍵入./configure -help 來獲得一些幫助資訊 2. 認識 Qt/Embedded 開發環境 Qt/Embedded 的開發環境可以取代那些我們熟知的 UNIX 和 WINDOWS 開發工具 它提供了幾個跨平台的工具使得開發變得迅速和方便, 尤其是它的圖形設計器 Unix 下的開發者可以在 PC 或者工作站使用虛擬工具, 從而可以模擬一個和嵌入式設備的顯示終端大小, 像素相同的顯示環境 嵌入式設備的應用可以在安裝了一個跨平台開發工具鏈的不同的平台上編譯 最通常的做法是在一個 UNIX 系統上安裝跨平台的帶有 libc 的 GNU c++ 編譯器和二進位工具 在開發的許多階段, 一個可替代的做法是使用 Qt 的桌面版本, 例如 Qt/X11 或是 Qt/Windows 來進行開發 這樣開發人員就可以使用他們熟悉的開發環境, 例如微軟的 Visual C++ 或者 Borland C++; 在 UNIX 作業系統下, 許多環境也是可用的, 例如 Kdevelop, 它也支援互動式開發 157

159 DMA270 Linux 操作流程 如果 Qt/Embedded 的應用是在 UNIX 平台下開發的話, 那麼它就可以在開發的機器上以一個獨立的控制台或者虛擬工具的方式來執行, 對於後者來說, 其實是有一個 X11 的應用程式虛擬了一個緩衝區 通過指定顯示設備的寬度, 高度和顏色深度, 虛擬出來的緩衝區將和物理的顯示設備在每個圖元上保持一致 這樣每次調試應用時開發人員就不用總是刷新嵌入式設備的 FLASH 存儲空間, 從而加速了應用的編譯 鏈結和執行週期 執行 Qt 的虛擬緩衝封包工具的方法是 : 在 Linux 的圖形模式下執行命令 : qvfb (Enter) 當 Qt 嵌入式的應用程式要把顯示結果輸出到虛擬緩衝封包時, 我們在命令行執行這個程式時, 在程式名後加上 -qws 的選項 例如 : $> hello qws] 2.1 QT 的支撐工具 Qt 包含了許多支援嵌入式系統開發的工具, 其中一些工具我們會在別的地方介紹 有兩個最實用的工具 ( 除了上面我們提到的虛擬緩衝封包 ) 是 qmake 和 Qt designer( 圖形設計器 ) qmake 是一個為編譯 Qt/Embedded 函式庫和應用而提供的 Makefile 產生器 它能夠依據一個工程檔案 (.pro) 產生不同平台下的 Makefile 檔案 qmake 支援跨平台開發和影子生成 (shadow builds), 影子生成是指當工程的來源程式共用給網路上的多台機器時, 每台機器編譯鏈結這個工程的程式將在不同的子路徑下完成, 這樣就不會覆蓋別人的編譯鏈結生成的檔案 qmake 還易於在不同的配置之間切換 開發者可以使用 Qt 圖形設計器視覺化地設計對話方塊而不需編寫一行程式 使用 Qt 圖形設計器的佈局管理可以生成具有平滑改變尺寸的對話方塊,qmake 和 Qt 圖形設計器是完全集成在一起的 2.2 信號與插槽信號與插槽機制提供了物件間的通信機制, 它易於理解和使用, 並完全被 Qt 圖形設計器所支援 圖形用戶介面的應用需要對用戶的動作做出回應 例如, 當用戶點選了一個功能表項或是工具欄的按鈕時, 應用程式會執行某些程式 大部分情況下, 是希望不同類型的物件之間能夠進行通訊 程式師必須把事件和相關程式聯繫起來, 這樣才能對事件做出 158

160 附錄一 QT 圖形系統開發 回應 以前的工具開發檔案使用的事件回應機制是易崩潰的, 不夠健壯的, 同時也不是面向物件的 Trolltech 已經創立了一種新的機制, 叫做 信號與插槽 " 信號與插槽是一種強有力的物件間通信機制, 它完全可以取代原始的回調和消息映射機制 ; 信號與插槽是迅速的 型安全的 壯的, 完全面向物件並用 C++ 來實現的一種機制 在以前, 當使用回調函數機制來把某段回應程式和一個按鈕的動作相關聯時, 通常把那段回應程式寫成一個函數, 然後把這個函數的位址指標傳給按鈕, 當那個按鈕被按下時, 這個函數就會被執行 對於這種方式, 以前的開發檔案不能夠確保回調函數被執行時所傳遞進來的函數參數就是正確的類型, 因此容易造成處理程序崩潰, 另外一個問題是, 回調這種方式緊緊的綁定了圖形用戶介面的功能元素, 因而很難把開發進行獨立的分類 Qt 的信號與插槽機制是不同的 Qt 的視窗在事件發生後會激發信號 例如一個按鈕被點選時會激發一個 clicked" 信號 程式設計師通過建立一個函數 ( 稱作一個插槽 ), 對象 1 信號 1 信號 2 connect( 物件 1, 信號 1, 物件 2, 插槽 1 ) connect( 物件 1, 信號 1, 物件 2, 插槽 2 ) 對象 2 信號 1 插槽 1 插槽 2 對象 3 信號 1 插槽 1 connect( 物件 1, 信號 2, 物件 4, 插槽 1 ) 對象 4 插槽 1 插槽 2 插槽 3 connect( 物件 3, 信號 1, 物件 4, 插槽 3 ) 一些信號與插槽連接的抽象圖 然後使用 connect() 函數把這個插槽和一個信號連接起來, 這樣就完成了一個事件和回應程式的連接 信號與插槽機制並不要求類別之間互相知道細節, 這樣就可以相對容易的開發出程式可高重用的類別 信號與插槽機制是類型安全的, 它以警告的方式報告類型錯誤, 而不會使系統產生崩潰 例如, 如果一個退出按鈕的 clicked() 信號被連接到了一個應用的退出函數 -quit() 159

161 DMA270 Linux 操作流程 插槽 那麼一個用戶點選退出鍵將使應用程式終止執行 上述的連接過程用程式寫出來就是這樣 connect( button, SIGNAL(clicked()), qapp, SLOT(quit()) ); 可以在 Qt 應用程式的執行過程中增加或是減少信號與插槽的連接 信號與插槽的實現擴充了 C++ 的語法, 同時也完全利用了 C++ 面向物件的特徵 信號與插槽可以被重載或者重新實現, 它們可以定義為類的公有 有或是保護成員 信號與插槽的例子如果一個類別要使用信號與插槽機制, 它就必須是從 QObject 或者 QObject 的子類繼承, 而且在類的定義中必須加上 Q_OBJECT 信號被定義在類的信號部分, 而插槽則定義在 public slots, protected slots 或者 private slots 部分 下面定義一個使用到信號與插槽機制的類 class BankAccount : public QObject { Q_OBJECT public: BankAccount() { curbalance = 0; } int balance() const { return curbalance; } public slots: void setbalance( int newbalance ); signals: void balancechanged( int newbalance ); private: int curbalance; }; 和大部分的 C++ 的類一樣,BankAccount 類有一個構造函數, 還有一個取值的函數 balance(), 一個設置值的函數 setbalance( int newbalance ) 這個類有一個信號 balancechanged(), 這個信號聲明了它在 BankAccount 類的成員 curbalance 的值被改變時產生 信號不需要被實現, 當信號被激發時, 和該信號連接的插槽將被執行 上面用來設置值的函數 setbalance( int newbalance ) 定義在類的 public slots" 部分, 因 160

162 附錄一 QT 圖形系統開發 此它是一個插槽 插槽是一個需要實現的標準的成員函數, 它可以像其他函數一樣被使用, 也可以和信號相連接 下面就是該插槽函數 setbalance( int newbalance ) 的實現程式 : void BankAccount::setBalance( int newbalance ) { if ( newbalance!= curbalance ) { curbalance = newbalance; emit balancechanged( curbalance ); } } 其中的一段程式 emit balancechanged( curbalance ); 它的作用是當 curbalance 的值被改變後, 將新的 curbalance 的值作為參數去啟動 balancechanged() 信號 對於關鍵字 emit", 它和信號 插槽一樣是由 Qt 提供的, 這些關鍵字都會被 c++ 的預處理機制轉換為 c++ 程式 一個物件的信號可以被多個不同的插槽連接, 而多個信號也可以被連接到相同的插槽 當信號和插槽被連接起來時, 應當確保它們的參數類型是相同的, 如果插槽的參數個數小於和它連接在一起的信號的參數個數, 那麼從信號傳遞插槽的多餘的參數將被忽略 元對象編譯器信號與插槽機制是以純 C++ 程式來實現的, 實現的過程使用到了 Qt 開發工具檔案提供的預處理器和元物件編譯器 (moc) moc 讀取應用程式的標頭檔, 並產生支援信號與插槽的必要的程式 開發者沒必要編輯或是瀏覽這些自動產生的程式, 當有需要時,qmake 生成的 Makefile 檔案裡裡會顯式的包含了執行 moc 的規則 除了可以處理信號與插槽機制之外,moc 還支援翻譯機制, 屬性系統和執行時的資訊 161

163 DMA270 Linux 操作流程 2.3 表單 Qt 擁有豐富的滿足不同需求的表單 ( 按鈕, 捲軸等等 ),Qt 的表單使用起來很靈活, 為了滿足特別的要求, 它很容易就可以被子類別化 表單是 Qwidget 類別或它子類的實例, 客戶自己的表單類別需要從 Qwidget 它的子類別繼承 摘錄的 Qwidget 類的繼承圖 一個表單可以包含任意數量的子表單, 子表單可以顯示在父表單的客戶區, 一個沒父表單的表單我們稱之為頂級表單 ( 一個 視窗 "), 一個表單通常有一個邊框和標題欄作為裝飾 Qt 並未對一個表單有什麼限制, 任何類型的表單可以是頂級表單, 任何類型的表單可以是別的表單的子表單 在父表單顯示區域的子表單的位置可以通過佈局管理自動的進行設置, 也可以人為的指定 當父表單無效, 隱藏或被刪除後, 它的子表單都會進行同樣的動作 標籤, 訊息方塊, 工具欄等, 並未被限制使用什麼顏色, 字體和語言 Qt 的文本呈現表單可以使用 HTML 子集顯示一個多語言的寬文本 一個 Hello 的例子下面是一個顯示 Hello Qt/Embedded!" 的程式的完整的源程式 : Hello Qt/Embedded 162

164 附錄一 QT 圖形系統開發 #include <qapplication.h> #include <qlabel.h> int main( int argc, char **argv ) { QApplication app( argc, argv ); QLabel *hello = new QLabel( "<font color=blue>hello" " <i>qt/embedded!</i></font>", 0 ); app.setmainwidget( hello ); hello->show(); return app.exec(); } 通用表單 下面是一些主要的 Qt 表單的截螢幕圖, 這些表單使用了視窗樣式 使用了 QHBox 進行排列一個標籤和一個按鈕 使用了 QbuttonGroup 的兩個單選框和兩個核心選取方塊 163

165 DMA270 Linux 操作流程 使用了 QgroupBox 進行排列的的日期類 QDateTimeEdit, 一個行編輯框類 QLineEdit, 一個文本編輯類 QTextEdit 和一個下拉式列示方塊類 QComboBox 以 QGrid 排列的一個 QDial, 一個 QProgressBar, 一個 QSpinBox, 一個 QScrollBar, 一個 QLCDNumber 和一個 Qslider 164

166 附錄一 QT 圖形系統開發 以 QGrid 排列的一個 QIconView, 一個 QListView, 一個 QListBox 和一個 QTable 有些時候在進行字元輸入時, 希望輸入的字元滿足了某種規則才能使輸入被確認 Qt 提供了解決的辦法, 例如 QComboBox, QLineEdit 和 QspinBox 的字元輸入可以通過 Qvalidator 的子類來進行約束和有效性檢查 通過繼承 QScrollView,QTable, QListView, QTextEdit 和其他表單就能夠顯示大量的資料, 並且自動的擁有了一個捲軸 許多 Qt 創建的表單能夠顯示圖像, 例如按鈕, 標籤, 功能表項等等 Qimage 類支援幾種圖形格式的輸入 輸出和操作, 它目前支援的圖形格式有 BMP, GIF*, JPEG, MNG, PNG, PNM, XBM 和 XPM 畫布 QCanvas 類提供了一個高級的平面圖形編寫程式介面, 它可以處理大量的像線條 矩形 橢圓 文本 點陣圖 動畫等這些畫布項, 畫布項可以較容易的做成互動式的 ( 例如做成支援用戶移動的 ) 畫布項是 QcanvasItem 子類的實例, 它們比表單類 Qwidget 更顯得輕量級, 它們能夠被快速的移動, 隱藏和顯示 Qcanvas 可以更有效的支援衝突檢測, 它能夠列出一個指定區域裡面的所有的畫布項 QcanvasItem 可以被子類化, 從而可以提供更多的客戶畫布項類型, 或者擴充已有的畫布項的功能 Qcanvas 物件是由 QcanvasView 進行繪製的,QcanvasView 物件可以以不同的譯文 比例 旋轉角度, 剪切方式去顯示同一個畫布 Qcanvas 物件是理想的資料表現方式, 它已經被消費者用於繪製地圖和顯示網路拓撲結構 它也可用於製作快節奏的且有大量角色的平面遊戲 165

167 DMA270 Linux 操作流程 在 Qtopia 中用 QCanvas 實現的小行星遊戲 客戶表單通過對 Qwidget 或者它的子類進行子類化, 可以建立自己的客戶表單或者對話方塊 下面是一個完整的來源程式例子, 它示例了如何通過子類化表單, 繪製一個類比的時鐘 AnalogClock 表單類別是 Qwidget 的子類, 它顯示當前時間, 並且可以自動地更新時間 類比鐘表單 在 analogclock.h 標頭檔中, AnalogClock 以這樣地形式定義 :: #include <qwidget.h> class AnalogClock : public QWidget { public: 166

168 附錄一 QT 圖形系統開發 }; AnalogClock( QWidget *parent = 0, const char *name = 0 ); protected: virtual void timerevent( QTimerEvent *event ); virtual void paintevent( QPaintEvent *event ); AnalogClock 類繼承了 Qwidget, 它有一個典型的表單類構造函數, 這個函數有父視窗物件指標和名字指標兩個參數 ( 如果設置了名字的話, 測試和調試起來就會容易些 ) timerevent() 函數是從 QObject (Qwidget 的父類 ) 物件繼承而來的, 這個函數會被系統定期使用 paintevent() 函數是從 QWidget 繼承而來的並且當表單需要重畫時這個函數就會被使用 timerevent() 和 paintevent() 函數是 事件控制碼 " 的兩個例子 應用物件以重載父類物件的虛擬函數 events (QEvent objects) 的形式接收系統的事件 大約有超過 50 個的系統事件是較常用的, 例如 MouseButtonPress, MouseButtonRelease, KeyPress, KeyRelease, Paint, Resize 和 Close. 物件可以對發給它們的事件做出回應或者篩選一些事件後再發送給別的物件 analogclock.cpp 檔案是定義在 analogclock.h 中的函數的實現原始檔案 #include <qdatetime.h> #include <qpainter.h> #include "analogclock.h" AnalogClock::AnalogClock( QWidget *parent, const char *name ) : QWidget( parent, name ) { starttimer( ); resize( 100, 100 ); } void AnalogClock::timerEvent( QTimerEvent * ) { update(); } void AnalogClock::paintEvent( QPaintEvent * ) { 167

169 DMA270 Linux 操作流程 QCOORD hourhand[8] = { 2, 0, 0, 2, -2, 0, 0, -25 }; QCOORD minutehand[8] = { 1, 0, 0, 1, -1, 0, 0, -40 }; QTime time = QTime::currentTime(); QPainter painter( this ); painter.setwindow( -50, -50, 100, 100 ); painter.setbrush( black ); for ( int i = 0; i < 12; i++ ) { painter.drawline( 44, 0, 46, 0 ); painter.rotate( 30 ); } painter.save(); painter.rotate( 30 * (time.hour() % 12) + time.minute() / 2 ); painter.drawconvexpolygon( QPointArray(4, hourhand) ); painter.restore(); painter.save(); painter.rotate( 6 * time.minute() ); painter.drawconvexpolygon( QPointArray(4, minutehand) ); painter.restore(); } 構造函數設置視窗的尺寸大小為 100 x 100, 並且告訴系統每隔 12 秒調用一次 timerevent() 函數, 從而對類比鐘的表單進行刷新 在 timerevent() 函數中, 通過使用 QWidget 的函數 update() 就可以告訴 Qt, 表單需要立即重畫, 緊接著 Qt 就會產生一個繪製事件並且使用 paintevent() 函數 在 paintevent() 函數中, 一個 Qpainter 物件用於在表單上繪製 12 個刻度以及分針, 時針 Qpainter 類別提供了一種統一的方式用於繪製表單 點陣圖 向量圖等, 它提供了繪製點, 線, 橢圓, 多邊形, 弧, 貝塞爾曲線等功能, 一個 Qpainter 的坐標系可以被轉變 縮放 旋轉和剪切, 這樣物件就可以依據它在視窗或者表單上的位置繪製出一個剪切的視圖 剪切可以使表單繪製時減少閃爍 使用 QPainter 的子類 QdirectPainter 可以鎖定和直接取用封包緩衝區域 文件 analogclock.h 和 analogclock.cpp 完全的定義和實現了 AnalogClock 客戶表單類, 這個表單是現在就可以使用的 168

170 附錄一 QT 圖形系統開發 #include <qapplication.h> #include "analogclock.h" int main( int argc, char **argv ) { QApplication app( argc, argv ); AnalogClock *clock = new AnalogClock; app.setmainwidget( clock ); clock->show(); return app.exec(); } 主窗口 QMainWindow 類是為應用的主視窗提供一個擺放相關表單的框架 一個主視窗包含了一組標準表單的集合 主視窗的頂部包含一個功能表欄, 它的下方放置著一個工具欄, 工具欄可以移動到其他的停靠區域 主視窗允許停靠的位置有頂部 左邊 右邊和底部 工具欄可以被拖放到一個停靠的位置, 從而形成一個浮動的工具面板 主視窗的下方, 也就是在底部的停靠位置之下有一個狀態欄 主視窗的中間區域可以包含其他的表單 提示工具和 這是什麼 " 幫助按鈕以旁述的方式闡述了用戶介面的使用方法 對於小螢幕的設備, 使用 Qt 圖形設計器定義的標準的 Qwidget 範本比使用主視窗類更好一些 典型的範本包含有功能表欄 工具欄, 可能沒有狀態欄 ( 在必要的情況下, 可以用任務欄, 標題欄來顯示狀態 ) 選單彈出式功能表 QpopupMenu 類以垂直列表的方式顯示功能表項, 它可以是單個的 ( 例如上下文相關功能表 ), 可以以功能表欄的方式出現, 或者是別的彈出式功能表的子功能表出現 每個功能表項可以有一個圖示, 一個核取方塊和一個加速器 ( 快捷鍵 ), 功能表項通常對應一個動作 ( 例如存檔 ), 分隔器通常顯示成一條豎線, 它用於把一組相關聯的動作選單分立成組 下面是一個建立包含有 New,Open 和 Exit 功能表項的檔功能表的例子 QPopupMenu *filemenu = new QPopupMenu( this ); 169

171 DMA270 Linux 操作流程 filemenu->insertitem( "&New", this, SLOT(newFile()), CTRL+Key_N ); filemenu->insertitem( "&Open...", this, SLOT(open()), CTRL+Key_O ); filemenu->insertseparator(); filemenu->insertitem( "E&xit", qapp, SLOT(quit()), CTRL+Key_Q ); 當一個功能表項被選中, 和它相關的插槽將被執行 加速器 ( 快捷鍵 ) 很少在一個沒有鍵盤輸入的設備上使用,Qt/Embedded 的典型配置並未包含對加速器的支援 上面出現的程式 &New" 意思是在桌面機器上以 New" 的方式顯示出來, 但是在嵌入式設備上, 它只會顯示為 New" QmenuBar 類別實現了一個功能表欄, 它會自動的設置幾何尺寸並在它的父表單的頂部顯示出來, 如果父表單的寬度不夠寬以致不能顯示一個完整的功能表欄, 那麼功能表欄將會分為多行顯示出來 Qt 內建的佈局管理能夠自動的調整功能表欄 Qt 的功能表系統是非常靈活的, 功能表項可以被動態的致能 失效 添加或者刪除 通過子類化 QcustomMenuItem, 我們可以建立客戶化外觀和功能的功能表項 工具欄 QtoolButton 類別實現了一個帶有圖示,3 維邊框和可選標籤的工具欄按鈕 切換工具欄按鈕具有開 關的特徵, 其他的按鈕則執行一個命令 不同的圖示用來表示按鈕的活動 無效 致能模式, 或者是開或關的狀態 如果你僅為按鈕指定了一個圖示, 那麼 Qt 會使用可視提示來表現按鈕不同的狀態, 例如按鈕失效時顯示灰色 工具欄按鈕通常以一排的形式顯示在工具欄上, 對於一個有幾組工具欄的應用, 用戶可以隨便的到處移動這些工具欄, 工具欄差不多可以包含所有的表單, 例如 QComboBoxes 和 QspinBoxes 旁述現代的應用主要使用旁述的方式去解釋用戶介面的用法 Qt 提供了兩種旁述的方式 : 提示欄 " 和 這是什麼 " 幫助按鈕 提示欄 " 是小的, 通常是黃色的矩形, 當滑鼠在表單的一些位置遊動時它就會自動出現 它主要用於解釋工具欄按鈕, 特別是那些缺少文字標籤說明的工具欄按鈕的用途 下面就是如何設置一個 存檔 " 按鈕的提示的程式 QToolTip::add( savebutton, "Save" ); 當提示字元出現之後, 你還可以在狀態欄顯示更詳細的文字說明 對於一些沒有滑鼠的設備 ( 例如那些使用觸點輸入的設備 ), 就不會有滑鼠的游標 170

172 附錄一 QT 圖形系統開發 在表單上進行移動, 這樣就不能啟動提示欄 對於這些設備也許就需要使用 這是什麼 " 幫助按鈕, 或者使用一種姿態來表示輸入設備正在進行移動, 例如用按下或者握住的姿態來表示現在正在進行遊動 這是什麼 " 幫助按鈕和提示欄有些相似, 只不過前者是要用戶點選它才會顯示旁述 在小螢幕設備上, 要想點選 這是什麼 " 幫助按鈕, 具體的方法是, 在靠近應用的 X 視窗的關閉按鈕 x" 附近你會看到一個?" 符號的小按鈕, 這個按鈕就是 這是什麼 " 幫助按鈕 一般來說, 這是什麼 " 幫助按鈕按下後要顯示的提示資訊應該比提示欄要多一些 下面是設置一個存檔按鈕的 這是什麼 " 文件提示資訊的方法 : QWhatsThis::add( savebutton, "Saves the current file." ); QToolTip 和 QWhatsThis 類提供了虛擬函數以供開發者重新實現更多的特定的用途 Qtopia 並未使用上述提及的兩種幫助 ( 旁述 ) 機制 它在應用視窗的標題欄上放置一個?" 符號的按鈕來代替上述的旁述機制, 這個?" 按鈕可以啟動一個瀏覽器來顯示和當前應用相關的 HTML 頁面 Qtopia 使用按下和握住的姿態來調用上下文功能表 ( 右擊 ) 和屬性對話方塊 動作應用程式通常提供給用戶幾種不同的方式去執行特別的動作 例如, 大部分應用提供了一個 Save" 動作給用於存檔的功能表 (File Save) 以及工具欄 ( 一個 軟碟 " 圖示的工具欄按鈕 ) 和快捷鍵 (Ctrl+S) Qaction 類可以讓上述過程變得簡潔, 它允許程式師在一個地方定義一個動作, 然後把這個動作加入到功能表或者工具欄, 這個過程與把功能表項加入到功能表的道理是一樣的 下面的程式實現了一個 Save" 功能表項和一個 Save" 工具按鈕, 旁述系統和快捷鍵可以很容易的添加進去, 但是我們沒添加, 因為它們很少在嵌入式設備上使用 QAction *saveact = new QAction( this ); saveact->settext( "Save" ); saveact->seticonset( QPixmap("save.png") ); connect( saveact, SIGNAL(activated()), this, SLOT(save()) ); saveact->addto( filemenu ); saveact->addto( toolbar ); 除了不用複製程式, 使用 Qaction 還可以確保功能表的狀態與工具欄按鈕的狀態保持一致, 必要的時候還可顯示提示欄 使一個動作 (Action) 失效將導致和該動作相關 171

173 DMA270 Linux 操作流程 聯的功能表項以及工具按鈕的失效 同樣的, 如果用戶切換一個工具按鈕的狀態, 那麼相關的功能表項的也會跟著被選中或不選中 2.4. 對話方塊使用 Qt 圖形設計器這個視覺化設計工具用戶可以建立自己的對話方塊 Qt 使用佈局管理自動的設置表單與別的表單之間相對的尺寸和位置, 這樣可以確保對話方塊能夠最好的利用螢幕上的可用空間 使用佈局管理意味著按鈕和標籤可以依據要顯示的文字自動的改變自身大小, 而用戶完全不用考慮文字是那一種語言 佈局 Qt 的佈局管理用於組織管理一個父表單區域內的子表單 它的特點是可以自動的設置子表單的位置和大小, 並可判斷出一個頂級表單的最小和預設的尺寸, 當表單的字體或內容變化後, 它可以重置一個表單的佈局 使用佈局管理, 開發者可以編寫獨立於螢幕大小和方向之外的程式, 從而不需要浪費程式空間和重複編寫程式 對於一些國際化的應用程式, 使用佈局管理, 可以確保按鈕和標籤在不同的語言環境下有足夠的空間顯示文本, 不會造成部分文字被剪掉 佈局管理使得提供部分用戶介面元件, 例如輸入法和任務欄變得更容易 我們可以通過一個例子說明這一點, 當 Qtopia 的用戶正在輸入文字時, 輸入法會佔用一定的文字空間, 應用程式這時也會依據可用的螢幕尺寸的變化調整自己 Qtopia 的佈局管理 Qt 提供了三種用於佈局管理的類 :QHBoxLayout, QVBoxLayout 和 QgridLayout 172

174 附錄一 QT 圖形系統開發 QHBoxLayout, QVBoxLayout 和 QGridLayout 的佈局效果 QHBoxLayout 佈局管理把表單按照水平方向從左至右排成一行 QVBoxLayout 佈局管理把表單按照垂直方向從上至下排成一列 QGridLayout 佈局管理以網路的方式來排列表單, 一個表單可以佔據多個網路 在多數情況下, 佈局管理在管理表單時執行最優化的尺寸, 這樣視窗看起來就更好看而且可以尺寸變化會更平滑 使用以下的機制可以簡化視窗佈局的過程 : 1 為一些子視窗設置一個最小的尺寸, 一個最大的或者固定的尺寸 2 增加拉伸項 (stretch items) 或者間隔項 (spacer item) 拉伸項和間隔項可以填充一個排列的空間 3 改變子視窗的尺寸策略, 程式師可以調整表單尺寸改變時的一些策略 子表單可以被設置為擴充 緊縮和保持相同尺寸等策略 4 改變子視窗的尺寸提示 QWidget::sizeHint() 和 QWidget::minimumSize-Hint() 函數返回一個表單依據自身內容計算出的首選尺寸和首選最小尺寸, 我們在建立表單時可考慮重新實現這兩個函數 5 設置拉伸比例係數 設置拉伸比例係數是指允許開發者設置表單之間佔據空間大小的比例係數, 例如我們設定可用空間的 2/3 分配給表單 A, 剩下的 1/3 則分配給表單 B 佈局管理也可按照從右至左, 從下到上的方式來進行 當一些國際化的應用需要支援從右至左閱讀習慣的語言文字 ( 例如阿拉伯和希伯來 ) 時, 使用從右至左的佈局排列是更方便的 佈局是可以嵌套的和隨意進行的 下面是一個對話方塊的例子, 它以兩種不同尺寸大小來顯示 : 173

175 DMA270 Linux 操作流程 小的對話方塊和大的對話方塊 這個對話方塊使用了三種排列方式 QVBoxLayout 管理一組按鈕,QHBoxLayout 管理一個顯示國家名稱的列表框和右邊那組按鈕,QVBoxLayout 管理表單上剩下的元件 Now please select a country" 標籤 在 < Prev" 和 Help" 按鈕之間放置了一個拉伸項 (stretch items), 使得兩者之間保持了一定比例的間隔 建立這個對話方塊表單和佈局管理的實現程式如下 : QVBoxLayout *buttonbox = new QVBoxLayout( 6 ); buttonbox->addwidget( new QPushButton("Next >", this) ); buttonbox->addwidget( new QPushButton("< Prev", this) ); buttonbox->addstretch( 1 ); buttonbox->addwidget( new QPushButton("Help", this) ); QListBox *countrylist = new QListBox( this ); countrylist->insertitem( "Canada" ); /* */ countrylist->insertitem( "United States of America" ); QHBoxLayout *middlebox = new QHBoxLayout( 11 ); middlebox->addwidget( countrylist ); middlebox->addlayout( buttonbox ); QVBoxLayout *toplevelbox = new QVBoxLayout( this, 6, 11 ); toplevelbox->addwidget( new QLabel("Now please select a country", this) ); toplevelbox->addlayout( middlebox ); 使用 Qt 圖形設計器設計的這個對話方塊, 顯示如下 : 174

176 附錄一 QT 圖形系統開發 Qt 圖形設計器中使用了佈局的對話方塊 Qt 圖形設計器 Qt 圖形設計器是一個具有視覺化用戶介面的設計工具 Qt 的應用程式可以完全用來源程式來編寫, 或者使用 Qt 圖形設計器來加速開發工作 啟動 Qt 圖形設計器的方法是 : 在 Linux 命令模式下, 鍵入以下命令 ( 假設 Qt X11 安裝在 /usr/local 下 ): cd qt-2.3.2/bin./designer 這樣就可以啟動一個與 Windows 下的 Delphi 相類似介面 下圖是使用 Qt 圖形設計器設計一個表單的截螢幕圖 175

177 DMA270 Linux 操作流程 Qt 圖形設計器開發者點選工具欄上的代表不同功能的子表單 / 元件的按鈕, 然後把它放到一個表單上面, 這樣就可以把一個子表單 / 元件放到表單上了 開發者可以使用屬性對話方塊來設置子表單的屬性 精確的設置子表單的位置和尺寸大小是沒必要的 開發者可以選擇一組表單, 然後對他們進行排列 例如, 我們選定了一些按鈕表單, 然後使用 水平排列 (lay out horizontally)" 選項對它們進行一個接一個的水平排列 這樣做使得設計工作變得更快, 而且完成後的表單將能夠按照屬性設置的比例填充視窗的可用尺寸範圍 使用 Qt 圖形設計器進行圖形用戶介面的設計可以消除應用的編譯, 鏈結和執行時間, 同時使得修改圖形用戶介面的設計變得更容易 Qt 圖形設計器的預覽功能可以使開發者能夠在開發階段看到各種樣式的圖形用戶介面, 包括客戶樣式的用戶介面 通過 Qt 集成的功能強大的資料庫類,Qt 圖形設計器還可提供生動的資料庫資料瀏覽和編輯操作 開發者可以建立同時包含有對話方塊和主視窗的應用, 其中主視窗可以放置功能 176

178 附錄一 QT 圖形系統開發 表, 工具欄, 旁述幫助等等的子視窗部件 Qt 圖形設計器提供了幾種表單範本, 如果表單會被多個不同的應用反覆使用, 那麼開發者也可建立自己的表單範本, 以確保表單的一致性 Qt 圖形設計器使用嚮導來幫助人們更快更方便的建立包含有工具欄 功能表和資料庫等方面的應用 程式師可以建立自己的客戶表單, 並把它集成到 Qt 圖形設計器中 Qt 圖形設計器設計的圖形介面以副檔名為 ui" 的檔進行保存, 這個檔案有良好的可讀性, 這個檔可被 uic(qt 提供的用戶介面編譯工具 ) 編譯成為 C++ 的標頭檔和原始檔案 Qmake 工具在它為工程生成的 Makefile 檔中自動的包含了 uic 生成標頭檔和原始檔案的規則 另一種可選的做法是, 在應用程式執行期間載入 ui 檔案, 然後把它轉變為具備原先全部功能的表單 這樣開發者就可以在程式執行期間動態修改應用的介面, 而不需重新編譯應用, 另一方面, 也使得應用的檔尺寸減小了 建立對話方塊 Qt 為許多通用的任務提供了現成的包含了實用的靜態函數的對話方塊類, 下邊是一些 Qt 的標準的對話方塊的截螢幕圖 QmessageBox 類是一個用於向用戶提供資訊或是給用戶進行一些簡單選擇 ( 例如 yes" 或 no") 的對話方塊類 一個 QMessageBox 對話方塊 ProgressDialog 對話方塊包含了一個進度欄和一個 Cancel" 按鈕 一個 QprogressDialog 對話方塊 Qwizard 類提供了一個嚮導對話方塊的框架 177

179 DMA270 Linux 操作流程 一個嚮導類 Qt 提供的對話方塊還包括 QColorDialog, QFileDialog, QFontDialog 和 QprintDialog 這些類通常適用于桌面應用, 一般不會在 Qt/Embedded 中編譯使用它們 2.5. 外形與感覺 Qt 桌面應用隨著執行環境 ( 例如 Windows XP, Mac OS X, Linux) 的不同而具有不同的樣式, 或者叫做外形與感覺 Qt/Embedded 的應用可以使用不同操作環境提供的樣式, 也可以以靜態或插件的方式使用客戶樣式 開發者可以設計自己表單的樣式和視窗裝飾 表單樣式一個樣式是一個實現 Qt 表單外形與視覺效果的類 Qstyle 的子類 Qt/Embedded 程式師可以自由的使用和修改目前存在的樣式, 也可以使用 Qt 樣式設計引擎實現自己的樣式 目前 Qt/Embedded 提供的樣式類型有 EmbeddedareWindows, Motif, MotifPlus,CDE, Platinum 和 SGI 樣式可以被動態的設置到一個應用中, 甚至可以設置到特定的表單上 178

180 附錄一 QT 圖形系統開發 以不同樣式建立的下拉清單 通過給一組相關的應用編寫一個客戶樣式, 可以讓這些應用的外觀具有與眾不同的感覺 建立客戶樣式可以通過子類化 QStyle,QcommonStyle 或者 QcommonStyle 的派生類來實現 通過重新實現現有樣式基類的一兩個虛函數可以很容易對現有樣式做一些小的修改 一個樣式可以編譯成為一個插件, 在 Qt 圖形設計器中, 把樣式做成插件的話, 開發者就可以以設備的客戶樣式來預覽設計出來的表單 樣式插件使得開發者不需重新編譯就可改變設備的外觀 Qstyle 的繼承圖 Qt 發佈的表單都是樣式已知的, 當它們的樣式改變後, 表單會自動重繪 客戶表單和對話方塊大多數都是 Qt 原先發佈的表單和佈局的重新整合 它們也是自動的獲得原先的樣式 在少數場合, 當有必要寫一個外觀上很隨意的表單時, 開發者可以使用 QStyle 去寫一些用戶介面元素, 而不是直接的繪製固有的矩形 窗口裝飾頂級視窗的裝飾是由一個標題欄和一個框架組成的 Qt/Embedded 包括了這些視窗樣式 :BeOS, Hydro, KDE 和 Windows 179

181 DMA270 Linux 操作流程 不同的平台上的視窗風格如果需要的話, 我們可以配置不同的視窗使用不同的視窗裝飾 通過子類別化 QWSDecoration, 我們可以建立客戶的裝飾樣式, 並且把它們以插件的形式進行發佈 為了在視窗管理器之外進行更多的控制行為, 開發者需要子類別化 QWSManager 2.6. 國際化 Qt/Embedded 完全支援 Unicode, 一個國際標準的字元集 開發者在他們的應用中可以自由的混合使用被 Unicode 字元集支援的語言, 例如阿拉伯文, 英文, 中文, 希伯來文, 日文和俄文等 為了有助於公司將產品推向國際市場,Qt 還提供了將應用翻譯成支援多種語言環境的工具 Unicode Qt 使用 QString 儲存 Unicode 編碼的字串,Qstring 取代了粗糙的 const char *; 它提供了用於處理 Qstring 和 const char * 之間相互轉換的構造函數和操作符號 因為 Qt 使用了隱式共用 ( 寫時複製 ) 技術來減少記憶體的使用, 所以直接複製 Qstring 的值是不會產生問題的 為有效率的存儲 ASII 碼字串,Qt 還提供了 QCString 類 Qt 為所有要顯示在螢幕上的文本, 包括最簡單的文字標籤到最複雜的寬文本編輯器, 提供了一個強大的 Unicode 文本呈現引擎 這個引擎支援一些先進的特徵, 例如特殊的間隔線 雙向寫入和區別標記 它幾乎支援世界上所有的書寫系統, 包括阿拉伯文, 中文, 古斯拉夫文, 英文, 希臘文, 希伯來文, 日文, 韓文, 拉丁和越南文 體驗這個 180

182 附錄一 QT 圖形系統開發 引擎的最優化性能的常用的例子就是 : 在帶有加速功能的文字的下方顯示一條下劃線 ( 例如 File) QtextCodec 的子類用於處理不同編碼類型的字元集之間的轉換 Qt 3.0 支援 37 種不同的編碼方式, 包括中文的 Big5 和 GBK, 日文的 EUC-JP JIS 和 Shift-JIS, 俄羅斯的 KOI8-R 和 ISO 8859 系列 它們可以以函式庫的一部分或者插件的形式編譯, 或者使用 feature" 機制去除這些編譯 應用的翻譯 Qt 提供了相應的工具和函數用於幫助開發者以他們的本地語言推出應用 要使一個字串可以被翻譯, 您需要把這個字串作為一個參數放到 tr() 函數中使用 例如 : savebutton->settext( tr("save") ); Qt 嘗試尋找字串 "Save" 的譯文, 如果找到的話, 就會把它的譯文顯示出來, 如果找不到, 就用原來的字串 "Save" 進行顯示 例如把英文作為來源語言, 就需要把這個來源語言翻譯成中文, 即中文為翻譯的目的語言, 以此類推 這樣當調用 tr() 函數後, 函數的參數的原先的預設編碼就會轉變為 Unicode 編碼 Tr() 函數的通常用法為 : Context::tr("source text", "comment") 上面的 Context" 是指一個 QObject 物件的子類的名稱 如果在一個包含了 tr() 成員函數的類的上下文環境中使用 tr() 函數時, Context" 通常可以省略掉 例如 : Context::func1() { settext( tr("save") ); } source text" 是指要翻譯的文本的內容 comment" 是一個可選擇項, 它用於給手動翻譯者提供一些額外的資訊 說了半天, 還有一個重要的內容, 就是 tr() 函數如何尋找到譯文 要把一個源字串翻譯為和它對應的譯文 ( 目的語言的字串 ) 時, 需要讓 Qt 知道這些譯文放在哪裡 Qt 規定了譯文存儲在 QTranslator 物件中, 這個物件是從一個記憶體映射檔 ( 副檔名為 pm) 中讀取譯文 每個 pm 檔包含了某種語言的譯文資訊 所以開發者需要建立一個 pm 檔來儲存應用中需要翻譯的字串的譯文 181

183 DMA270 Linux 操作流程 Qt 提供了 3 種工具幫助人們建立譯文存儲檔案 (.pm 文件 ), 這 3 個工具是 lupdate, Qt Linguist 和 lrelease. 1)lupdate 自動地從來源程式檔案 (.cpp) 和介面檔案 (.ui) 中獲取所有需要翻譯的物件, 即上述的 ( Context"); 同時還獲取要翻譯的所有的字串 ( 來源語言的字串 ), 即上述的 source text"; comment" 選項如果被使用的話, 也會被納入收集的範圍 當這些資訊收集完畢後,lupdate 最後會生成一個.ts 檔 ( 翻譯原始檔案 ), 這個檔案是直接可閱讀的 2) 開發者使用 Qt Linguist 工具提供的良好的人機界面打開一個.ts 檔 ( 翻譯原始檔案 ), 然後開發者依據每一個 source text 填寫上相對應的譯文, 這樣一個.ts 檔 ( 翻譯原始檔案 ) 就包含了完整的 Context", source text" 和譯文資訊 3) 最後通過執行 lrelease 去把一個.ts 檔 ( 翻譯原始檔案 ) 壓縮為一個.pm 檔 ( 譯文存儲檔 ), 產生的.pm 檔案可用在嵌入式設備上 在一個應用的生存期間裡, 上述的步驟有可能依據需要會被反覆執行 多次執行 lupdate 是很安全的, 您可以重複使用已經存在的譯文 (.pm) 檔案, 或者當您不想使用某些翻譯檔案時你可以標記這些翻譯原始檔案為舊檔案, 而不需要刪除它們 182

184 附錄二 出廠值設定 附錄二出廠值設定 1 BOOTLOADER 的燒錄與運作 1.1 燒錄 BOOTLOADER 安裝 giveio 請在光碟中的實用工具中點選 giveio_inst.exe, 在裡面選擇 InStall Parallel Port Driver 下的 Install, 和 Install OCX 下的 Install 注意 :DMA-PXA270 教學設計系統在出廠前已經燒好 BOOTLOADER 和 LINUX 核心 根檔案系統, 除非 BOOTLOADER 被破壞無法正常啟動或用戶修改了啟動程式碼才需要這一步, 在使用並列埠 JTAG 傳輸線燒錄 FLASH 前應在 PC 上先安裝好 giveio.sys 的驅動, 安裝方法見 如何安裝 givoio.sys 裡的說明 要更新核心或根檔案系統可從下面的啟動 BOOTLOADER 部分開始 不需要燒錄 FLASH 則可從後面的啟動運作 LINUX 部分開始 1. u-boot 編譯 : make mrproper make dma270_config make 產生 u-boot.bin, 將其燒入開發板內 關閉底板電源, 使用 SUPERJTAG 短的那條排線 ( 下面標有 SEC_JTAG_ S3C2410 的那個 ) 和底板的 JTAG 埠 (CN1), 將並列埠線連接 SUPERJTAG 板, 確保各線連接確實 打開底板電源, 在 PC 上打開一個命令行視窗, 帶參數執行光碟所帶的 JFlashmm.exe 程式 ( 該程式位於光碟的 \Fash 燒錄 \JFlash_27x 目錄 ), 將 JFlash_27x 目錄複製到 C 槽, 然後 183

华恒家庭网关方案

华恒家庭网关方案 LINUX V1.5 1 2 1 2 LINUX WINDOWS PC VC LINUX WINDOWS LINUX 90% GUI LINUX C 3 REDHAT 9 LINUX PC TFTP/NFS http://www.hhcn.com/chinese/embedlinux-res.html minicom NFS mount C HHARM9-EDU 1 LINUX HHARM9-EDU

More information

static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, ; #defineled1_on() (GPBDAT &= ~0x1) #def

static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, ; #defineled1_on() (GPBDAT &= ~0x1) #def Kaise s 2410 Board setting [1]. Device Driver Device Driver Linux s Kernel ARM s kernel s3c2410_kernel2.4.18_r1.1_change.tar.bz2 /usr/src (1) #cd /usr/src (2) #tar xfj s3c2410_kernel2.4.18_r1.1_change.tar.bz2

More information

Abstract arm linux tool-chain root NET-Start! 2

Abstract arm linux tool-chain root NET-Start! 2 Lab III - Embedding Linux 1 Abstract arm linux tool-chain root NET-Start! 2 Part 1.4 Step1. tool-chain 4 Step2. PATH 4 Part 2 kernel 5 Step1. 5 Step2... 6 Step3...8 Part 3 root. 8 Step1. 8 Step2. 8 Part

More information

字元設備字元設備 (char device) 和普通檔案系統的區別 : 普通檔案系統可以來回讀 / 寫, 而大多字元設備僅僅是資料通道, 只能順序讀 / 寫 應用程式使用標準系統調用打開 (open) 讀取(read) 寫(write) 和關閉 (close), 完全好像這個設備是一個普通檔一樣 初

字元設備字元設備 (char device) 和普通檔案系統的區別 : 普通檔案系統可以來回讀 / 寫, 而大多字元設備僅僅是資料通道, 只能順序讀 / 寫 應用程式使用標準系統調用打開 (open) 讀取(read) 寫(write) 和關閉 (close), 完全好像這個設備是一個普通檔一樣 初 第十章驅動程式的設計 為了瞭解嵌入式 Linux 系統中驅動程式的開發過程, 以及掌握如何運行和載入驅動程式, 在嵌入式 Linux 系統中嘗試添加一個驅動程式於 Linux 核心程式中 10-1.linux 設備驅動程式概述 設備驅動可以理解為作業系統的一部分, 對於一個特定的硬體設備來說, 其對應的 設備驅動程式是不同的 比如網卡, 音效卡, 鍵盤, 滑鼠以及顯卡等 對於作業系統來說, 掛 接的設備越多,

More information

The golden pins of the PCI card can be oxidized after months or years

The golden pins of the PCI card can be oxidized after months or years Q. 如何在 LabWindows/CVI 編譯 DAQ Card 程式? A: 請參考至下列步驟 : 步驟 1: 安裝驅動程式 1. 安裝 UniDAQ 驅動程式 UniDAQ 驅動程式下載位置 : CD:\NAPDOS\PCI\UniDAQ\DLL\Driver\ ftp://ftp.icpdas.com/pub/cd/iocard/pci/napdos/pci/unidaq/dll/driver/

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 9 [P.11] : Dev C++ [P.12] : http://c.feis.tw [P.13] [P.14] [P.15] [P.17] [P.23] Dev C++ [P.24] [P.27] [P.34] C / C++ [P.35] 10 C / C++ C C++ C C++ C++ C ( ) C++

More information

Autodesk Product Design Suite Standard 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆

Autodesk Product Design Suite Standard 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆 Autodesk Product Design Suite Standard 20122 系統統需求 典型使用用者和工作流程 Autodesk Product Design Suite Standard 版本為為負責建立非凡凡產品的設計師師和工程師, 提供基本概念設計計和製圖工具, 以取得令人驚驚嘆的產品設計計 Autodesk Product Design Suite Standard 版本中中包括以下軟體體產品

More information

1

1 SDT Uclinux SDT.alf.c 44blib.alf 44blib.c jtag ADS.alf.c make menuconfig make dep make clean make lib_only make user_only make romfs make image make uclinux ext2 cash lcd frambuffer 1 armsys-c uclinux

More information

Microsoft Word - Mail2000_SecurityPatch_

Microsoft Word - Mail2000_SecurityPatch_ Mail2000 安全性加強程式 網擎資訊軟體股份有限公司謹呈 1 Mail2000 安全性加強程式 Introduction Mail2000 安全性加強程式, 是針對 Mail2000 V4.0 以上版本, 包括 V4.0 及 V4.5 版本所提供, 以加強系統的安全性, 減少因惡意信件而引起的安全性問題 版本名稱 Mail2000 版本作業系統檔案名稱 V4.0 單一網域版本 V4.0 SDSS

More information

Microsoft Word - PS2_linux_guide_cn.doc

Microsoft Word - PS2_linux_guide_cn.doc Linux For $ONY PlayStatioin2 Unofficall General Guide Language: Simplified Chinese First Write By Beter Hans v0.1 Mail: hansb@citiz.net Version: 0.1 本 人 是 菜 鸟 + 小 白 欢 迎 指 正 错 误 之 处, 如 果 您 有 其 他 使 用 心 得

More information

自由軟體教學平台

自由軟體教學平台 NCHC Opensource task force DRBL steven@nchc.gov.tw, c00hkl00@nchc.gov.tw National Center for High-Performance Computing http://www.nchc.gov.tw Jan, 2003 1 2003/1/28 ( ) 09:00-10:30 10:40-12:00 Linux 13:00-14:30

More information

一个开放源码的嵌入式仿真环境 ― SkyEye

一个开放源码的嵌入式仿真环境 ― SkyEye SkyEye SkyEye http://hpclab.cs.tsinghua.edu.cn/~skyeye/ I hear and I forget, I see and I remember, I do and I understand. SkyEye SkyEye SkyEye SkyEye SkyEye 1. SkyEye PC pervasive computing PC I O PDA

More information

46 2011 11 467 數位遊戲式學習系統 7 2011 11 467 47 3 DBGameSys 48 2011 11 467 正規化資料模組 如何配置並儲存電子化資料 以 便減少資料被重覆儲存的程序 DBGameSys的主要功能模組包 學習者 審核評分模組 含 正規化資料模組 審核評分 模組 高分列表模組3大區塊 系統資料庫 在正規化資料模組的執行 高分列表模組 過程中 先要求學習者瀏覽遊戲

More information

Microsoft Word - 正文.doc

Microsoft Word - 正文.doc 1 2 1 2 3 4 5 6 7 8 9 10 3 1 150 2 150 1 1 1.1 1.1.1 1.2 1.2.1 1.2.2 1.2.3 1.3 1.3.1 1.3.2 1.4 1.4.1 CPU 1.4.2 I/O 1.4.3 I/O 1.5 1.5.1 CISC RISC 1.5.2 1.5.3 1.6 1.6.1 1.6.2 N 1.6.3 2 2.1 2.1.1 2.1.2 2.1.3

More information

Red Flag Linux Desktop 4.0 Red Flag Linux Desktop 4.0 1

Red Flag Linux Desktop 4.0 Red Flag Linux Desktop 4.0 1 Red Flag Linux Desktop 4.0 68 6 Red Flag Software Co., Ltd. http://www.redflag-linux.com Red Flag Linux Desktop 4.0 Red Flag Linux Desktop 4.0 1 1 Red Flag Linux Desktop 4.0 1.1 Red Flag Linux Desktop

More information

Windows 2000 Server for T100

Windows 2000 Server for T100 2 1 Windows 95/98 Windows 2000 3.5 Windows NT Server 4.0 2 Windows DOS 3.5 T200 2002 RAID RAID RAID 5.1 Windows 2000 Server T200 2002 Windows 2000 Server Windows 2000 Server Windows 2000 Server 3.5 for

More information

Microsoft PowerPoint - 9-Linux Kernel.ppt

Microsoft PowerPoint - 9-Linux Kernel.ppt Building Linux Kernel Outline Linux 核心程式碼的目錄結構及各目錄的相關內容 Linux 核心各設定選項內容和作用 Linux 核心設定檔 config.in 的作用 Linux 核心的編譯過程 將新增核心程式加入到 Linux 核心結構中的方法 核心程式碼目錄介紹 (1) arch:arch 子目錄包括所有與體系結構相關的核心程式 arch 的每一個子目錄都代表一個

More information

10-2 SCJP SCJD 10.1 昇陽認證 Java 系統開發工程師 的認證程序 Java IT SCJD

10-2 SCJP SCJD 10.1 昇陽認證 Java 系統開發工程師 的認證程序 Java IT SCJD 10 SCJD 簡介 Java 10-2 SCJP SCJD 10.1 昇陽認證 Java 系統開發工程師 的認證程序 Java IT SCJD 10 SCJD 10-3 Java Java SCJD 7 Swing RMI 10.1.1 The Assignment The Essay 9 10 10-4 SCJP SCJD 90 10.1.2 SCJP Java 90 120 Swing 10

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 Linux 操 作 系 统 基 础 介 绍 课 程 目 标 及 要 求 了 解 Linux 操 作 系 统 的 登 入 方 式 掌 握 常 用 命 令 的 基 本 用 法 能 够 熟 练 在 各 个 目 录 转 换 Outline 1. Linux 操 作 系 统 简 介 2. Linux 操 作 系 统 的 登 录 3. Linux 操 作 系 统 的 目 录 结 构 4. 常 用 命 令 5.

More information

<A4E2BEF7B4FAB8D5B3F8A F52322E786C7378>

<A4E2BEF7B4FAB8D5B3F8A F52322E786C7378> 製表日期 : 2008 年 9 月 17 日 Mobile Java Applet 手機安裝測試報告表 已完成測試機型數量 :317 台 ; 無問題 ( 可安裝 / 可執行 ) 機型 :315 台無法使用 :2 台 ; 特殊註記機型 :2 台 廠牌 機型 測試狀況 OK 不 OK 安裝資料夾 ( 目錄 ) 備註 NOKIA N95 應用程式 NOKIA 6110 應用程式 NOKIA 3120 應用程式

More information

投影片 1

投影片 1 9 1 9-1 Windows XP Windows Server 2003 Mac OS Linux, 都 (OS, Operating System ) 2 3 , 來, 行 3 理 行 4 ,, (UI, User Interface), 滑, 令 列 (CLI, Command-Line Interface) (GUI, Graphical User Interface) 2 5 令 列,

More information

ebook70-22

ebook70-22 2 2 L i n u x f s t a b X 11 L i n u x L i n u x L i n u x D O S Wi n d o w s L i n u x O p e n L i n u x / u s r / m a n / m a n 5 f s t a b m o u n t m o u n t L i n u x 22.1 OpenLinux L i n u x U N

More information

本文由筱驀釹贡献

本文由筱驀釹贡献 本 文 由 筱 驀 釹 贡 献 ppt 文 档 可 能 在 WAP 端 浏 览 体 验 不 佳 建 议 您 优 先 选 择 TXT, 或 下 载 源 文 件 到 本 机 查 看 Linux 操 作 系 统 Linux 操 作 系 统 第 一 部 分 介 绍 与 安 装 Linux 的 由 来 : Linux 的 由 来 : 的 由 来 Linus Torvalds 1.Linux 的 版 本 1.Linux

More information

2004 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A. Sun Sun Berkeley BSD University of California UNIX X/Open Company, Ltd.

2004 Sun Microsystems, Inc Network Circle, Santa Clara, CA U.S.A. Sun Sun Berkeley BSD University of California UNIX X/Open Company, Ltd. Java Desktop System 2 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA 95054 U.S.A. : 817 7758 10 2004 9 2004 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA 95054 U.S.A. Sun Sun

More information

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1 0 0 = 1 0 = 0 1 = 0 1 1 = 1 1 = 0 0 = 1 : = {0, 1} : 3 (,, ) = + (,, ) = + + (, ) = + (,,, ) = ( + )( + ) + ( + )( + ) + = + = = + + = + = ( + ) + = + ( + ) () = () ( + ) = + + = ( + )( + ) + = = + 0

More information

ebook62-1

ebook62-1 1 Red Hat Linux R e d Hat Linux L i n u x X Wi n d o w Red Hat L i n u x 1.1 Red Hat Linux Red Hat 16 M 120 M 3. 5 Intel 386 C D - R O M C D - R O M We b / 1.1.1 L i n u x L i n u 4 Primary Partition Extended

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABD6C696E7578BBF9B4A1CAB5D1E92E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABD6C696E7578BBF9B4A1CAB5D1E92E646F63> 嵌 入 式 linux 基 础 实 验 1 内 核 配 置 及 编 译 1. 进 入 内 核 所 在 目 录 /opt/ruiva/xscale/linux-2.6.26 #cd /opt/ruiva/xscale/linux-2.6.26 2. 键 入 make menuconfig, 根 据 需 要 适 当 配 置 内 核 #make menuconfig 这 里 先 使 用 默 认 的 配 置,

More information

WebSphere Studio Application Developer IBM Portal Toolkit... 2/21 1. WebSphere Portal Portal WebSphere Application Server stopserver.bat -configfile..

WebSphere Studio Application Developer IBM Portal Toolkit... 2/21 1. WebSphere Portal Portal WebSphere Application Server stopserver.bat -configfile.. WebSphere Studio Application Developer IBM Portal Toolkit... 1/21 WebSphere Studio Application Developer IBM Portal Toolkit Portlet Doug Phillips (dougep@us.ibm.com),, IBM Developer Technical Support Center

More information

1

1 磁軌式讀卡機 1288 系列 使用手冊 Version 1.0 1 2 3 4 5 6 7 8 9 10 11 12 1288 MSR Micro controller : With Decoder Open Visual COM port to read data (UART Interface) From 1288 Or direct control 1288 by sending Command

More information

Microsoft PowerPoint - 移植Qt for Embedded Linux

Microsoft PowerPoint - 移植Qt for Embedded Linux 移植 Qt for Embedded Linux Architecture for Next-generation Digital Engines for SoC 1. 移植 QT for Embedded Linux 至實驗板, 使 Qt Creator 上所撰寫的程式可以跨平台在 Embedded System 上執行. QT 目前並沒有將 Andes Core 加到程式的選項內, 不過只需要修改部分的程式,

More information

RTX3.2.0标准版 - 技术白皮书

RTX3.2.0标准版 - 技术白皮书 一 铭 操 作 系 统 技 术 白 皮 书 广 西 一 铭 软 件 股 份 有 限 公 司 版 权 声 明 本 书 版 权 归 广 西 一 铭 软 件 股 份 有 限 公 司 所 有, 并 保 留 对 本 文 档 及 声 明 的 最 终 解 释 权 和 修 改 权 本 文 件 中 出 现 的 任 何 文 字 叙 述 文 档 格 式 插 图 照 片 方 法 过 程 等 内 容, 除 另 有 特 别 说

More information

LinuxÓû§»ù´¡

LinuxÓû§»ù´¡ RedHat Linux 概 述 版 权 所 有, 2003 (c) 什 么 是 Linux? 它 是 一 种 UNIX 操 作 系 统 的 克 隆, 它 ( 的 内 核 ) 由 Linus Torvalds 以 及 网 络 上 组 织 松 散 的 黑 客 队 伍 一 起 从 零 开 始 编 写 而 成. 它 的 目 标 是 保 持 和 POSIX( 可 移 植 操 作 系 统 接 口 ) 的 兼

More information

EK-STM32F

EK-STM32F STMEVKIT-STM32F10xx8 软 件 开 发 入 门 指 南 目 录 1 EWARM 安 装... 1 1.1 第 一 步 : 在 线 注 册... 1 1.2 第 二 步 : 下 载 软 件... 2 1.3 第 三 步 : 安 装 EWARM... 3 2 基 于 STMEVKIT-STM32F10xx8 的 示 例 代 码 运 行... 6 2.1 GPIO Demo... 6 2.2

More information

TPM BIOS Infineon TPM Smart TPM Infineon TPM Smart TPM TPM Smart TPM TPM Advanced Mode...8

TPM BIOS Infineon TPM Smart TPM Infineon TPM Smart TPM TPM Smart TPM TPM Advanced Mode...8 Smart TPM Rev. 1001 Smart TPM Ultra TPM Smart TPM TPM...3 1. BIOS... 3 2. Infineon TPM Smart TPM... 4 2.1. Infineon TPM...4 2.2. Smart TPM...4 3. TPM... 5 3.1. Smart TPM TPM...5 3.2. Advanced Mode...8

More information

Microsoft Word - 第5章.doc

Microsoft Word - 第5章.doc 目 录 及 权 限 管 理 随 着 的 不 断 发 展, 越 来 越 多 的 人 开 始 使 用, 对 于 那 些 刚 接 触 的 人 来 说, 恐 怕 最 先 感 到 困 惑 的 就 是 那 些 不 明 不 白 的 目 录 了 同 样, 系 统 是 一 个 典 型 的 多 用 户 系 统 为 了 保 护 系 统 的 安 全 性, 系 统 对 不 同 用 户 访 问 同 一 文 件 或 目 录 的

More information

PICkit2 燒寫器編程器調試器

PICkit2 燒寫器編程器調試器 PICkit2 燒寫器編程器調試器 Part No:MP-Micro-PIC-PICkit2 PICKit2 功能簡介 : PICKIT2 能夠對 Microchip 的 PIC10/12/16/18/24/32 dspic30/dspic33 等幾乎全系列 PIC 的 FLASH 單片機晶片進行線上編程和偵錯 並且 PICKIT2 能夠對 Microchip 的 KEELOQ HCS 系列晶片 MCP250xx

More information

Microsoft PowerPoint - lect01.ppt

Microsoft PowerPoint - lect01.ppt Linux 操 作 系 统 潘 建 瑜 华 东 师 范 大 学 数 学 系 jypan@math.ecnu.edu.cn Linux 操 作 系 统 教 材 : 以 课 堂 讲 义 为 主 上 课 时 间 : 周 五 5 6 7 第 三 教 学 楼 231 上 机 时 间 : 周 五 5 6 7 数 学 楼 200B 机 房 ( 暂 定 于 第 3 7 10 13 16 18 周 ) 课 程 主 页

More information

ebook 185-6

ebook 185-6 6 Red Hat Linux DB2 Universal Database 6.1 D B 2 Red Hat D B 2 Control Center D B 2 D B 2 D B 2 6.1 DB2 Universal Database [DB2]6.1 D B 2 O LT P O L A P D B 2 I B M P C We e k D B 2 D B 2 L i n u x Windows

More information

使用手冊

使用手冊 使用手冊 版權所有 2013 年 Microtek International, Inc. 保留所有權利 商標 Microtek MII MiiNDT ScanWizard Microtek International, Inc. Windows Microsoft Corporation 重要須知 Microtek Microtek Windows Microsoft Windows I49-004528

More information

作 業 系 統 簡 介 光 有 電 腦 硬 體, 會 不 容 易 使 用 必 須 要 有 適 當 的 程 式, 才 方 便 操 作 硬 體 衍 生 作 業 系 統 需 求 : 提 供 方 便 使 用 者 執 行 程 式 平 台 有 效 使 用 各 種 電 腦 硬 體 資 源 Jingo C. Lia

作 業 系 統 簡 介 光 有 電 腦 硬 體, 會 不 容 易 使 用 必 須 要 有 適 當 的 程 式, 才 方 便 操 作 硬 體 衍 生 作 業 系 統 需 求 : 提 供 方 便 使 用 者 執 行 程 式 平 台 有 效 使 用 各 種 電 腦 硬 體 資 源 Jingo C. Lia 第 三 章 作 業 系 統 概 論 Reporter : Jingo C. Liao 廖 正 宏 E-mail : jingo@mail.tku.edu.tw 章 節 列 表 1. 什 麼 是 作 業 系 統 2. 作 業 系 統 的 主 要 功 能 3. 作 業 系 統 的 核 心 程 式 4. 作 業 系 統 的 演 進 歷 史 5. 常 見 流 行 的 作 業 系 統 Jingo C. Liao

More information

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class 踩地雷遊戲 高慧君南港高中 開啟專案 MineSweep 任務一 : 產生 30X20 個磚塊編輯 Table 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.arraylist; Write a description of class MyWorld

More information

09 Linux Linux Linux Linux 009.indd /9/4 下午 12:11:10

09 Linux Linux Linux Linux 009.indd /9/4 下午 12:11:10 09 Linux Linux Linux Linux 009.indd 1 2009/9/4 下午 12:11:10 Linux 指令範例速查手冊 9.1 badblocks badblocks [ ][ ] badblocks -b < > -c < > -i < > -o < > mke2fs -p -t < > -n -s -v -w 0 badblocks -o 9-2 009.indd 2

More information

2008 IT 亞東證券投資顧問蕭雅慧於 2007/11/19 上午 09:38:03 下載. 拓墣產研版權所有, 未 2007/11/15

2008 IT 亞東證券投資顧問蕭雅慧於 2007/11/19 上午 09:38:03 下載. 拓墣產研版權所有, 未 2007/11/15 2008IT /15 Agenda 2008 & 2008 2008 & US$B PC/系統潮 網路潮/節能潮 3C潮 企業市場消費者 成熟市場消費者 成熟+新興市場消費者 代 時 代 C 時 P C n P NNoon 1,000 PPCC時 時代 代 G-phone 後PC時代 後PC時代 HDTV IPTV Web NB $500B 100 $100B 10 2003 Source 拓墣產業研究所

More information

Acronis P.1 Acronis Anydata Engine P.2 P.4 Acronis Backup Advanced P.5 Acronis Backup Advanced for AP P.6 Vmware P.7 Acronis Backup P.8 IDC 80 % $20,0

Acronis P.1 Acronis Anydata Engine P.2 P.4 Acronis Backup Advanced P.5 Acronis Backup Advanced for AP P.6 Vmware P.7 Acronis Backup P.8 IDC 80 % $20,0 321 3 2 1 Acronis P.1 Acronis Anydata Engine P.2 P.4 Acronis Backup Advanced P.5 Acronis Backup Advanced for AP P.6 Vmware P.7 Acronis Backup P.8 IDC 80 % $20,000 -Acronis Acronis Acornis 321 Acronis 虛擬化的興起

More information

epub 61-2

epub 61-2 2 Web Dreamweaver UltraDev Dreamweaver 3 We b We b We Dreamweaver UltraDev We b Dreamweaver UltraDev We b We b 2.1 Web We b We b D r e a m w e a v e r J a v a S c r i p t We b We b 2.1.1 Web We b C C +

More information

Cygwin Cygwin windows Linux Cygwin.dll Windows Linux API Linux Windows Linux 2

Cygwin Cygwin windows Linux Cygwin.dll Windows Linux API Linux Windows Linux 2 uclinux 1 Cygwin Cygwin windows Linux Cygwin.dll Windows Linux API Linux Windows Linux 2 Cygwin Cygwin GNU gccgdbxfree86bashtetexopengl perlpython Linux Windows Cygwin Linux GNU Windows 3 Cygwin Cygwin

More information

桌上型個人電腦採購規格說明表

桌上型個人電腦採購規格說明表 第三組顯示卡規範書 1. Nvidia 繪圖晶片 1-1. 1-1-1. 繪圖晶片 :NVIDIA GeForce 8400 系列 ( 含 ) 以上 ( 請註明採用商品之廠牌及型號, 並於型錄標示對 NVIDIA 應到主要規格之項次 ) GeForce 1-1-2. 繪圖介面 : 支援 PCI Express 介面 16X( 含 ) 以上高速繪圖晶片 8400 低階顯 1-1-3. 提供 256MB

More information

電腦設備LP _第七組顯示卡規範書

電腦設備LP _第七組顯示卡規範書 第七組顯示卡規範書 1. Nvidia 繪圖晶片 1-1. 1-1-1. 繪圖晶片 : GeForce 210 系列 ( 含 ) 以上 ( 請註明採用商品之廠牌及型號, 並於型錄標示對 GeForce 1-1-2. 繪圖介面 : 支援 PCI Express 2.0( 含 ) 以上高速繪圖晶片 210 低階顯 1-1-3. 提供 512MB DDR2 SDRAM( 含 ) 以上顯示記憶體, 具 2560

More information

ARM JTAG实时仿真器安装使用指南

ARM JTAG实时仿真器安装使用指南 ARM JTAG Version 1.31 2003. 11. 12 ARM JTAG ARM JTAG.3 ARM 2.1.4 2.2.4 ARM JTAG 3.1 18 3.2 18 3.2.1 Multi-ICE Server.18 3.2.2 ADS..21 ARM JTAG 4.1 Multi-ICE Server 33 4.1.1 Multi-ICE Server..... 33 4.1.2

More information

桌上型個人電腦採購規格說明表

桌上型個人電腦採購規格說明表 第三組顯示卡規範書 1. Nvidia 繪圖晶片 1-1. 1-1-1. 繪圖晶片 :NVIDIA GeForce 6200 系列 ( 含 ) 以上 ( 請註明採用商品之廠牌及型號, 並於型錄標示對應低階顯示卡到主要規格之項次 ) ( 備註 : 對應 1-1-2. 繪圖介面 : 支援 AGP 介面 8X( 含 ) 以上高速繪圖晶片項次為第 1 1-1-3. 提供 128MB 64 位元 DDR SDRAM(

More information

2016 英雄聯盟世界大賽暨全明星賽官方指定夥伴 Predator G1-710 Predator G3-710 Predator G6-710 Turbo**G6 IceTunnel 3/27-5/5PredatorGefore GTX 10 [Predator] :

2016 英雄聯盟世界大賽暨全明星賽官方指定夥伴 Predator G1-710 Predator G3-710 Predator G6-710 Turbo**G6 IceTunnel 3/27-5/5PredatorGefore GTX 10 [Predator] : 最新第 7 代 Intel Core 處理器 2017. 04 PC Aspire GX-781 多工效能機 極致效能 高雅風格 多工能力 7Intel Core DDR4 好運機 / 含稅 7Intel Core i5-7400 (3.0GHz/ Turbo 3.5GHz) Windows 10 NVIDIA GeForce GT-730 全新戰力 Intel 第 7 代 Core 處理器顛覆想像

More information

Microsoft Word - LP doc

Microsoft Word - LP doc 第七組顯示卡規範書及答標單 1. Nvidia 繪圖晶片 1-1. 1-1-1. 繪圖晶片 : GeForce 8400 系列 ( 含 ) 以上 ( 請註明採用商品之廠牌及型號, 並於型錄標示對 應到主要規格之項次 ) GeForce 1-1-2. 繪圖介面 : 支援 PCI Express 介面 16X( 含 ) 以上高速繪圖晶片 8400 低階顯 1-1-3. 提供 512MB DDR2 SDRAM(

More information

Microsoft Word - linux命令及建议.doc

Microsoft Word - linux命令及建议.doc Linux 操 作 系 统 命 令 集 1 基 本 命 令 查 看 系 统 信 息 : uname -a 修 改 密 码 : passwd 退 出 : logout(exit) 获 取 帮 助 : man commands 2 文 件 和 目 录 命 令 显 示 当 前 工 作 目 录 : pwd 改 变 所 在 目 录 : cd cd - 切 换 到 上 一 次 使 用 的 目 录 cd 切 换

More information

1706-門市-PC-封面封底

1706-門市-PC-封面封底 最新第 7 代 Intel Core 處理器 2017. 06 PC Aspire GX-781 沈穩風格電競效能 多工效能機 極致效能高雅風格多工能力 7 Intel Core DDR4 好運機 / 含稅 21,900 元 7 Intel Core i5-7400 (3.0GHz/ Turbo 3.5GHz) Windows 10 NVIDIA GeForce GT-730 8GB DDR4 1TB

More information

Windows 2000 Server for T100

Windows 2000 Server for T100 T200 3020 Windows 2000 Advanced Server /Windows NT 4.0 Server /Redhat Linux7.3 SCO UnixWare7.1.1 Novell NetWare5.0 1. Windows 2000 Advanced Server / 2. Windows NT 4.0 Server / 3. Redhat Linux7.3 4. SCO

More information

<4D F736F F D20A7EBBCD0B6B7AABEAAFEA5F3322D3935A67EB2C432A6B8B2C433B2D5C5E3A5DCA564B357BD64AED12E646F63>

<4D F736F F D20A7EBBCD0B6B7AABEAAFEA5F3322D3935A67EB2C432A6B8B2C433B2D5C5E3A5DCA564B357BD64AED12E646F63> 第三組顯示卡規範書 1. Nvidia 繪圖晶片 1-1. 1-1-1. 繪圖晶片 :NVIDIA GeForce 6600 系列 ( 含 ) 以上 ( 請註明採用商品之廠牌及型號, 並於型錄標示對應低階顯示卡到主要規格之項次 ) ( 備註 : 對應 1-1-2. 繪圖介面 : 支援 AGP 介面 8X( 含 ) 以上高速繪圖晶片項次為第 1 1-1-3. 提供 128MB 64 位元 DDR SDRAM(

More information

桌上型個人電腦採購規格說明表

桌上型個人電腦採購規格說明表 第三組顯示卡規範書 1. Nvidia 繪圖晶片 1-1. 1-1-1. 繪圖晶片 :NVIDIA GeForce 7600 系列 ( 含 ) 以上 ( 請註明採用商品之廠牌及型號, 並於型錄標示對低階顯示卡應到主要規格之項次 ) ( 備註 : 對應 1-1-2. 繪圖介面 : 支援 AGP 介面 8X( 含 ) 以上高速繪圖晶片項次為第 1 1-1-3. 提供 128MB 64 位元 DDR SDRAM(

More information

* 2

* 2 * 2 1. A 3. A 2. B A. 1. 1 2. 1 3 4 4 6 p 123456 7 bk bl bm bn 7 bo cm 9 8 cl ck bt bs br bp bq 1 2 3 4 5 6 7 8 9 bk bl bm 0 bn bo bp bq br bs bt p ck 8 2 4 6 cl cm cq cp co cn cn co cp cq 10 . [8]

More information

快 速 入 门 (Linux) 概 述 文 档 目 的 本 文 档 介 绍 了 如 何 快 速 创 建 Linux 系 统 实 例 远 程 连 接 实 例 部 署 环 境 等 旨 在 引 导 您 一 站 式 完 成 实 例 的 创 建 登 录 和 快 速 环 境 部 署 云 服 务 器 ECS 实

快 速 入 门 (Linux) 概 述 文 档 目 的 本 文 档 介 绍 了 如 何 快 速 创 建 Linux 系 统 实 例 远 程 连 接 实 例 部 署 环 境 等 旨 在 引 导 您 一 站 式 完 成 实 例 的 创 建 登 录 和 快 速 环 境 部 署 云 服 务 器 ECS 实 云 服 务 器 ECS 快 速 入 门 (Linux) 快 速 入 门 (Linux) 概 述 文 档 目 的 本 文 档 介 绍 了 如 何 快 速 创 建 Linux 系 统 实 例 远 程 连 接 实 例 部 署 环 境 等 旨 在 引 导 您 一 站 式 完 成 实 例 的 创 建 登 录 和 快 速 环 境 部 署 云 服 务 器 ECS 实 例, 有 时 候 也 被 称 为 阿 里 云

More information

产品手册: CA GEN r8

产品手册: CA GEN r8 产 品 手 册 : CA GEN r8 CA Gen r8 CA Gen 是 一 个 成 熟 的 模 拟 驱 动 开 发 环 境, 用 来 设 计 部 署 和 维 护 高 性 能 可 扩 缩 的 企 业 应 用 程 序 集 成 模 型 和 代 码 生 成 使 您 能 够 运 用 平 台 独 立 的 应 用 程 序 来 运 行 您 的 关 键 任 务 进 程 灵 活 的 开 发 方 法 用 来 设 计

More information

封面-12

封面-12 第十二章 701Client TECHNOLOGY CO.,LTD. 701Client 701Server 701Client "701Client", 12-1 :supervisor :supervisor : 1. : 00~99 100 2. : 00~63 ( 63 / / ) 3. : 18 9 4. : 18 9 5. 12-2 TECHNOLOGY CO.,LTD. 701Client

More information

.. 3 N

.. 3 N 1 .. 3 N9.. 4 5.. 6 7.. 8 20.. 21 23.. 24.. 25 26.. 27.. 28.. 29 2 (Cyber Café) Linux (LAN) Linux Public Home 3 K12LTSP K12LTSPFedora Core 4 (Linux)LTSP Linux (command line interface) (Graphical User Interface,

More information

CH01.indd

CH01.indd 3D ios Android Windows 10 App Apple icloud Google Wi-Fi 4G 1 ( 3D ) 2 3 4 5 CPU / / 2 6 App UNIX OS X Windows Linux (ios Android Windows 8/8.1/10 BlackBerry OS) 7 ( ZigBee UWB) (IEEE 802.11/a/b/g/n/ad/ac

More information

電腦設備LP 第七組顯示卡規範書

電腦設備LP 第七組顯示卡規範書 第七組顯示卡規範書 1. Nvidia 繪圖晶片 1-1. 1-1-1. 繪圖晶片 : GeForce 8400 系列 ( 含 ) 以上 ( 請註明採用商品之廠牌及型號, 並於型錄標示對 應到主要規格之項次 ) GeForce 1-1-2. 繪圖介面 : 支援 PCI Express 介面 16X( 含 ) 以上高速繪圖晶片 8400 低階顯 1-1-3. 提供 512MB DDR2 SDRAM(

More information

epub 75-1

epub 75-1 1 Linux L i n u x L i n u x L i n u x L i n u x L i n u x 1.1 Linux 1991 Linus To r v a l d s Intel PC U N I X L i n u x L i n u x L i n u s P C P C L i n u s M i n i x U N I X P C L i n u s I n t e r

More information

1711-門市-PC-p1p2

1711-門市-PC-p1p2 2017. 10/11 PC Aspire GX-785 沈穩風格電競效能 全新戰力 AMD RYZEN 7 處理器顛覆想像 AMD RX480 系列顯卡 全新戰力 Intel 第 7 代 Core 處理器顛覆想像 GeForce GTX 10 系列顯卡 Aspire GX-281 沈穩風格電競效能 Aspire GX V LED Aspire GX NVIDIA GeForce GTX 1060

More information

概述

概述 Compatibility Report of Red Flag DC Server 4.0 Power by: Product Dept. of Red Flag Date: Mar.31.2003 1...1 2...2 2.1...2 2.2...2 2.3...2 2.4...2 3...3 3.1...3 3.2...15 4...17 1 Red Flag DC Server 4.0 Red

More information

简 介 本 白 皮 书 高 度 概 述 了 支 持 移 动 互 联 网 设 备 (Mobile Internet Device) 的 Intel C++ Software Development Tool Suite for Linux* OS, 目 标 读 者 主 要 是 技 术 决 策 制 订

简 介 本 白 皮 书 高 度 概 述 了 支 持 移 动 互 联 网 设 备 (Mobile Internet Device) 的 Intel C++ Software Development Tool Suite for Linux* OS, 目 标 读 者 主 要 是 技 术 决 策 制 订 白 皮 书 Robert Müller-Albrecht 开 发 人 员 产 品 部 门 支 持 移 动 互 联 网 设 备 的 Intel C++ Software Development Tool Suite for Linux* OS 文 档 编 号 :319332-001US 简 介 本 白 皮 书 高 度 概 述 了 支 持 移 动 互 联 网 设 备 (Mobile Internet Device)

More information

<4D F736F F D20C7B6C8EBCABDCFB5CDB3BFAAB7A2CAB5D1E9CBC42E646F63>

<4D F736F F D20C7B6C8EBCABDCFB5CDB3BFAAB7A2CAB5D1E9CBC42E646F63> 嵌入式系统实验四 Linux 下设备驱动程序的开发 3.1 设备驱动程序的开发流程 进行嵌入式 Linux 系统的开发, 很大的工作量是为各种设备编写驱动程序 在 ARM 平台上开发嵌入式 Linux 的设备驱动程序与在其他平台上开发是一样的 总的来说, 实现一个嵌入式 Linux 设备驱动的大致流程如下 : (1) 查看原理图, 理解设备的工作原理 (2) 定义主设备号 (3) 在驱动程序中实现驱动的初始化

More information

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

A Preliminary Implementation of Linux Kernel Virus and Process Hiding 邵 俊 儒 翁 健 吉 妍 年 月 日 学 号 学 号 学 号 摘 要 结 合 课 堂 知 识 我 们 设 计 了 一 个 内 核 病 毒 该 病 毒 同 时 具 有 木 马 的 自 动 性 的 隐 蔽 性 和 蠕 虫 的 感 染 能 力 该 病 毒 获 得 权 限 后 会 自 动 将 自 身 加 入 内 核 模 块 中 劫 持 的 系 统 调 用 并 通 过 简 单 的 方 法 实 现 自 身 的

More information

128 ( ) ( ) [ 1 ] [2] [3] (1) (2) (3) [1] [2] [3] 10 2 ( ) (1997.6) ( ) 64

128 ( ) ( ) [ 1 ] [2] [3] (1) (2) (3) [1] [2] [3] 10 2 ( ) (1997.6) ( ) 64 BIBLID 1026-5279 (2005) 94:2 p. 127-154 (2005.12) 127 Keywords Digital Library High School Library Library Website Open Source E-mail frank@hchs.hc.edu.tw 128 (2005.12) ( ) 6 0 68 [ 1 ] [2] [3] (1) (2)

More information

輕鬆學 Dreamweaver CS5 網頁設計..\Example\Ch0\ \.html..\example\ch0\ \mouse.txt..\example\ch0\ \ _Ok.html 學習重點 JavaScript 複製程式碼 mouse.txt Ctrl+C Ctrl+C 0-4

輕鬆學 Dreamweaver CS5 網頁設計..\Example\Ch0\ \.html..\example\ch0\ \mouse.txt..\example\ch0\ \ _Ok.html 學習重點 JavaScript 複製程式碼 mouse.txt Ctrl+C Ctrl+C 0-4 JAVA Extension 0..\Example\Ch0\ \ T.html..\Example\Ch0\ \ T.txt T.txt..\Example\Ch0\ \ T_Ok.html 提示 :. Marquee Marquee Font Color #FFFFFF BG Color #867bf Width 90 Height 50. T.txt Ctrl+C your scrolling

More information

Microsoft Word - 100118002.htm

Microsoft Word - 100118002.htm 100 年 度 11800 電 腦 軟 體 應 用 乙 級 技 術 士 技 能 檢 定 學 科 測 試 試 題 本 試 卷 有 選 擇 題 80 題, 每 題 1.25 分, 皆 為 單 選 選 擇 題, 測 試 時 間 為 100 分 鐘, 請 在 答 案 卡 上 作 答, 答 錯 不 倒 扣 ; 未 作 答 者, 不 予 計 分 准 考 證 號 碼 : 姓 名 : 選 擇 題 : 1. (3)

More information

09 F9 128 peer to peer, P2P file transfer protocol bittorrent 10 P2P P2P GNU/ Linux P2P CC 單機版的智慧財產權 vs. 人權戰爭 1980 DVD content

09 F9 128 peer to peer, P2P file transfer protocol bittorrent 10 P2P P2P GNU/ Linux P2P CC 單機版的智慧財產權 vs. 人權戰爭 1980 DVD content 當智慧財產 侵犯人權? 智慧財產與人權 Kickstarter The Matrix The Matrix Avatar Eywa 12 2013 4 484 09 F9 128 peer to peer, P2P file transfer protocol bittorrent 10 P2P P2P GNU/ Linux P2P CC 單機版的智慧財產權 vs. 人權戰爭 1980 DVD content

More information

CU0594.pdf

CU0594.pdf 8 SOHO 1 3 003 SOHO SOHO Coder Programmer HTML CSS PHP JavaScrip 009 LECTURE 1-1 1 048 PART 2 LECTURE 1-1 1 049 SOHO Landing Page Landing 050 PART 2 LECTURE 1-1 1 SEO SEO P.093 SEO SEO SEO SEO SEO 051

More information

校友会系统白皮书feb_08

校友会系统白皮书feb_08 硕 士 研 究 生 招 生 管 理 系 统 1 产 品 白 皮 书 希 尔 数 字 校 园 硕 士 研 究 生 招 生 管 理 系 统 白 皮 书 目 录 1 产 品 概 述... 1 1.1 产 品 简 介... 1 1.2 应 用 范 围... 1 2 产 品 功 能 结 构 图... 2 3 产 品 功 能... 3 3.1 系 统 设 置... 3 3.2 信 息 发 布... 3 3.3

More information

2 3 13 17 22 26 1 2 8 100738 +86 (10) 8508 5000 +86 (10) 8518 5111 www.kpmg.com.cn 2006 4 2002 2006 1 28% 2006 17 8 500 2006 2006 2006 7 2.5 2 1 500 500 40% 500 10 16 14 12 10 8 6 4 2 2002-2006 5.1 5.9

More information

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344>

<4D F736F F D D342DA57CA7DEA447B14D2DA475B57BBB50BADEB27AC3FEB14DA447B8D5C344> 1. 請 問 誰 提 出 積 體 電 路 (IC) 上 可 容 納 的 電 晶 體 數 目, 約 每 隔 24 個 月 (1975 年 更 改 為 18 個 月 ) 便 會 增 加 一 倍, 效 能 也 將 提 升 一 倍, 也 揭 示 了 資 訊 科 技 進 步 的 速 度? (A) 英 特 爾 (Intel) 公 司 創 始 人 戈 登. 摩 爾 (Gordon Moore) (B) 微 軟 (Microsoft)

More information

经华名家讲堂

经华名家讲堂 5.1 5.1.1 5.1.2 5.2 5.2.1 5.2.2 5.2.3 5.2.4 5.2.5 5.3 5.3.1 5.3.2 5.3.3 / 5.3.4 / 5.3.5 / 5.4 Internet 5.4.1 Internet 5.4.2 Intranet 1. 2. 1 31 5 5.1 5.1.1 Internet 1 Host 20 60 IBM 2000 2 20 60 20 60

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6BFBCCAD4B4F3B8D92E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6BFBCCAD4B4F3B8D92E646F63> 嵌 入 式 系 统 设 计 师 考 试 大 纲 一 考 试 说 明 1 考 试 要 求 : (1) 掌 握 科 学 基 础 知 识 ; (2) 掌 握 嵌 入 式 系 统 的 硬 件 软 件 知 识 ; (3) 掌 握 嵌 入 式 系 统 分 析 的 方 法 ; (4) 掌 握 嵌 入 式 系 统 设 计 与 开 发 的 方 法 及 步 骤 ; (5) 掌 握 嵌 入 式 系 统 实 施 的 方 法

More information

ebook140-8

ebook140-8 8 Microsoft VPN Windows NT 4 V P N Windows 98 Client 7 Vintage Air V P N 7 Wi n d o w s NT V P N 7 VPN ( ) 7 Novell NetWare VPN 8.1 PPTP NT4 VPN Q 154091 M i c r o s o f t Windows NT RAS [ ] Windows NT4

More information

自由軟體社群發展經驗與 Linux認證介紹

自由軟體社群發展經驗與  Linux認證介紹 -- (http://linux.vbird.org) 2011/08/12 1 -- -- 不 理 便 了 來 連 ( ) ( ) 論 ~ ~ 2 復 理 3 4 復 數 量 復 離 來 ~ @_@ 5 - 年 Linux windows virtualbox 不 理 Linux Xen 立 4 4GB 了 30 xen 來 sudo xm 來 Linux I/O 例 yum 6 - 年 Windows

More information

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor 1 4.1.1.1 (Load) 14 1.1 1 4.1.1.2 (Save) 14 1.1.1 1 4.1.2 (Buffer) 16 1.1.2 1 4.1.3 (Device) 16 1.1.3 1 4.1.3.1 (Select Device) 16 2 4.1.3.2 (Device Info) 16 2.1 2 4.1.3.3 (Adapter) 17 2.1.1 CD-ROM 2 4.1.4

More information

CO 2 以鄰為壑的台灣建築產業

CO 2 以鄰為壑的台灣建築產業 6 20114460台灣綠建築政策的成就 台灣的建築產業消耗了大量的水泥, 也排放了很多的營建廢棄物, 建築物的壽命卻嚴重偏低 建築的環保時代已來臨 1992 199212United Nations Commission on Sustainable Development, UNCSD1998 1996 CO 2 以鄰為壑的台灣建築產業 27.22 34 1 6 20114460 7 8 201144604

More information

典型自编教材

典型自编教材 河 南 科 技 大 学 计 算 机 实 验 教 学 中 心 1. 计 算 机 文 化 基 础 实 验 指 导 书 2. 数 据 结 构 实 验 指 导 书 3. 操 作 系 统 实 验 指 导 书 4. 面 向 对 象 程 序 设 计 实 验 指 导 书 5. 数 据 库 原 理 实 验 指 导 书 6. 编 译 原 理 实 验 指 导 书 7. JAVA 程 序 设 计 实 验 指 导 书 8.

More information

WinMDI 28

WinMDI 28 WinMDI WinMDI 2 Region Gate Marker Quadrant Excel FACScan IBM-PC MO WinMDI WinMDI IBM-PC Dr. Joseph Trotter the Scripps Research Institute WinMDI HP PC WinMDI WinMDI PC MS WORD, PowerPoint, Excel, LOTUS

More information

SiteView技术白皮书

SiteView技术白皮书 SiteView ECC V6.2 技 术 白 皮 书 游 龙 网 络 科 技 ( 中 国 ) 有 限 公 司 DragonFlow Networks(China),Inc. 目 录 第 一 章 产 品 概 述... 3 第 二 章 系 统 结 构... 6 一 系 统 架 构... 7 1 用 户 管 理 模 块... 7 2 Web Server... 8 3 存 储 加 密 模 块... 8

More information

201406002+大学计算机基础B.doc

201406002+大学计算机基础B.doc 目 录. 大 学 计 算 机 基 础 B( 非 独 立 设 课 ).... 计 算 机 操 作 基 础 ( 独 立 设 课 )...3 3. 程 序 设 计 基 础 ( 非 独 立 设 课 )...5 4. 面 向 对 象 程 序 设 计 ( 非 独 立 设 课 )...8 5. 数 据 库 原 理 ( 非 独 立 设 课 )...0 6. 算 法 设 计 与 分 析 ( 非 独 立 设 课 )...

More information

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1 21 , 7, Windows,,,, : 010-62782989 13501256678 13801310933,,,, ;,, ( CIP) /,,. : ;, 2005. 11 ( 21 ) ISBN 7-81082 - 634-4... - : -. TP316-44 CIP ( 2005) 123583 : : : : 100084 : 010-62776969 : 100044 : 010-51686414

More information

,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN TP36 CIP (2005) : ( 10 ) : : (010 ) : (010)

,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN TP36 CIP (2005) : ( 10 ) : : (010 ) : (010) ,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN 7-5635-1099-0...............TP36 CIP (2005)076733 : ( 10 ) :100876 : (010 )62282185 : (010)62283578 : publish@bupt.edu.cn : : : 787 mm960 mm 1/

More information

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1.

Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE Project Properties IDE makefile 1. Oracle Solaris Studio 12.2 IDE 2010 9 2 8 9 10 11 13 20 26 28 30 32 33 Oracle Solaris Studio makefile C C++ Fortran IDE Solaris Linux C/C++/Fortran IDE "Project Properties" IDE makefile 1. "File" > "New

More information

Microsoft Word - A201004-1587.doc

Microsoft Word - A201004-1587.doc 1 基 于 μc/os-ii 的 嵌 入 式 电 子 潮 汐 预 报 仪 张 淑 娟, 李 海 森, 么 彬, 陈 宝 伟, 周 天 哈 尔 滨 工 程 大 学 水 声 技 术 国 防 科 技 重 点 实 验 室, 哈 尔 滨 (150001) E-mail: zhangshujuan@hrbeu.edu.cn 摘 要 : 本 文 涉 及 一 种 嵌 入 式 电 子 潮 汐 预 报 仪 的 开 发

More information

EX-Z80

EX-Z80 C 4 6 R P r p 快速入門基礎知識 什麼是數位相機 數位相機可以將影像儲存在記憶卡中 讓您能夠不限次數地拍攝和刪除影 像 拍攝 刪除 顯示 您可以使用各種不同方式處理拍攝的影像 將影像儲存在電腦上 列印影像 9 附加影像到電子郵件 快速入門基礎知識 1. + - 2. 1. 1 2 2. 3. 2 1 * * * * * *? [8] [4] [2] [6] [SET] 1. 2.

More information

untitled

untitled V3041A-J/V3042A-J IP-SAN/NAS Infinova Infinova Infinova Infinova www.infinova.com.cn Infinova Infinova Infinova 1 2 1 2 V3041A-16R-J V3041A-24R-J V3042A-16R-J V3042A-24R-J V3049-EXD-R16 V3049-EXD-R24 ...

More information

投影片 1

投影片 1 4 1 4-1 類 料, 兩 類 2 類 RAM (Random Access Memory, ) ROM (Read Only Memory, 讀 ) 兩, 類, 見 3 類 4 說 CPU, 料都, CPU 行 理 不 力 料, 料便, 料便, 料, CPU 料, 便 料, CPU 行 理 5 料 索 了 便 錄 讀 錄 度 量 量 6 (Virtual Memory) 數 Windows Linux

More information

目 录 简 介.3 ` 体 系 结 构...4 数 据 层...5 数 据 连 接 器...6 Tableau Server 组 件...7 网 关 / 负 载 平 衡 器...8 客 户 端 :Web 浏 览 器 和 移 动 应 用 程 序...8 客 户 端 :Tableau Desktop..

目 录 简 介.3 ` 体 系 结 构...4 数 据 层...5 数 据 连 接 器...6 Tableau Server 组 件...7 网 关 / 负 载 平 衡 器...8 客 户 端 :Web 浏 览 器 和 移 动 应 用 程 序...8 客 户 端 :Tableau Desktop.. Neelesh Kamkolkar, 产 品 经 理 Ellie Fields, 产 品 营 销 副 总 裁 Marc Rueter, 战 略 解 决 方 案 高 级 总 监 适 用 于 企 业 的 Tableau: IT 概 述 目 录 简 介.3 ` 体 系 结 构...4 数 据 层...5 数 据 连 接 器...6 Tableau Server 组 件...7 网 关 / 负 载 平 衡

More information

Microsoft Word - 实用案例.doc

Microsoft Word - 实用案例.doc 计 算 机 系 统 应 用 2009 年 第 12 期 嵌 入 式 Linux 下 温 湿 度 传 感 器 的 设 计 与 实 现 1 Design and Implementation of Temperature and Humidity Sensor Based on Embedded Linux 陈 博 刘 锦 高 ( 华 东 师 范 大 学 电 子 科 学 技 术 系 上 海 200241)

More information

NEXT SDT2.51 C:\ARM251 SDT2.51 ARM SDT 2.51 ARM PROJECT MANAGER SDT 2

NEXT SDT2.51 C:\ARM251 SDT2.51 ARM SDT 2.51 ARM PROJECT MANAGER SDT 2 S3C44B0 SDT DRAGNBOY MICROSTAR ARM 51 ARM S3C44B0 ARM SDT2.51 IAR ADS SDT2.51 S3C44B0 LEDTEST SDT ARM 1 2 SDT embed.8800.org SDT2.51 SDT2.51 ARM ARM CPU ARM SDT ADS ADS MULTI-ICE SDT JTAG JTAG SDT SDT2.51

More information

05_資源分享-NFS及NIS.doc

05_資源分享-NFS及NIS.doc 5 NFS NFS Server NFS Client NIS NIS 5-0 (Network File System, NFS) Unix NFS mount NFS... Network Information Service NIS Linux NIS NIS NIS / / /etc/passwd /etc/group NFS NIS 5-1 NFS 5-1-1 NFS NFS Network

More information