第一篇:嵌入式論文
信息工程學院
課程設計報告書
專 業: 電子信息科學與技術 班 級: 0312412 學 號: 031241217 學生姓名: 肖文洲 指導教師: 劉三軍
計算機專業嵌入式系統課程的研究與實踐
【摘 要】隨著電子技術的發展,嵌入式技術成為當今信息技術發展的主流技術。嵌入式技術作為高校計算機專業的一個新方向已被許多學校采用。本文通過對嵌入式技術的分析,提出了嵌入式系統課程體系建設的基本方法,包括專業培養計劃、嵌入式系統教學實踐平臺建設以及嵌入式系統教學模式與教學方法創新等。【關鍵詞】嵌入式技術;研究與實踐;計算機專業
隨著電子技術和信息技術的快速發展及嵌入式硬件技術與軟件技術的不斷成熟,嵌入式系統的應用越來越廣泛,如智能家電、手機、汽車電子、網絡通信及電子娛樂產品等,隨之而來的是社會對嵌入式產品開發人才的需求也越來越多。因此,許多高校都開設了嵌入式系統開發方面的系列課程。由于嵌入式系統課程涉及的知識面寬、實踐性強,對實驗教學的要求較高,包括實驗教師、硬件配置、實驗項目的設置等。因此,作為對新技術研究和探索最活躍的群體,高等院校如何接受嵌入式技術帶來的挑戰,盡快開設嵌入式系統的相關理論與實驗課程,并逐漸形成較規范的教學體系已成為一個重要的研究課題。
一、嵌入式系統教學的特點
設置嵌入式系統課程的目的是讓未來的軟硬件開發人員了解和掌握必要的嵌入式系統設計方法的概念、方法和工具。同時由于嵌入式系統對其他學科領域的滲透,其他相關專業的學生也有學習該課程的需求與必要。如其他電子、自動化專業都可開設相應的選修課程,在某種程度上可以提升畢業學生的競爭力、就業率。嵌入式系統課程的教學內容應包括嵌入式系統體系結構、硬件構架、軟件編程及外圍設備接口和驅動等,注重培養學生的設計能力和軟件開發能力;盡量反映該領域近年來最新的理論與技術,使學生了解學科的最新發展。嵌入式系統課程的特點是涉及知識面廣、綜合性強、實踐性強,并且學科發展快,因而學習難度大,難以形成一個簡單明確的知識體系。同時該課程講授難度很大,它要求教師不僅具備一般的計算機系統的軟硬件知識,而且需要真正從事過嵌入式系統的開發實踐,才能對嵌入式系統中的實時性等抽象概念和系統調試過程有感性認識。嵌入式系統教學主要有以下三個特點:(1)基礎性。嵌入式系統技術涉及多個專業,如計算機工程、軟件工程、工業自動控制、機電工程、精密儀器和電子工程等,嵌入式技術與各個專業相互滲透融合,將逐漸形成新的學科研究方向,因此,嵌入式系統可作為上述各專業的基礎平臺課,以強化專業基礎知識。(2)綜合性。嵌入式系統是軟件和硬件設計的完美結合。它涉及電子信息、計算機、自動控制等諸多專業相關課程的內容,如語言、微機原理、單片機設計和操作系統等課程,有很強的綜合性,因此,可以有效地對學生進行綜合能力的培養。(3)實踐性。嵌入式系統是理論與實踐結合密切的課程。實驗是嵌入式系統課程的重要組成部分,缺乏實驗的嵌入式系統課程學習是紙上談兵,因此,學生必須通過大量的實驗和實踐環節,來加深對嵌入式系統理論知識的理解。
二、適合計算機專業的嵌入式系統課程體系
嵌入式系統涉及電子、計算機、自動控制等諸多專業知識,專業性強,包括了操作系統、微機原理、編程語言程序設計、計算機網絡和接口設計等內容,是軟件、硬件的完美結合。因此,嵌入式系統的設計原理與技術不是一門課程所能講授的,需要建立一個課程體系。
嵌入式系統本身就是計算機系統。從廣義上講,目前計算機科學與技術專業的課程體系中所設置的許多專業基礎課,比如數字邏輯、C/C++程序設計、計算機網絡等,對嵌入式系統設計的學習者來說同樣重要。在此,只從狹義的角度探討嵌入式系統的課程體系設置。
由于嵌入式系統涉及的知識面廣、應用層面廣,所以應針對嵌入式系統設計與應用的不同層面的需求,設置不同層面的課程體系。從狹義上劃分,嵌入式系統課程體系可以有以下三個不同的層面: 第一層面:針對將來只是應用嵌入式系統硬件、軟件平臺來進行二次開發的學生而言,應側重培養其基于某個嵌入式系統平臺上(包括硬件平臺和軟件平臺)進行應用系統設計和開發的能力。因此,針對這一層面的學生應開設以下幾門主要課程: 《嵌入式實時操作系統》:選取一個具體的操作系統比如uCLinux為例,講授嵌入式操作系統的原理及應用,重點介紹如何進行任務劃分、如何編寫I/ O驅動程序等。《嵌入式系統設計》:重點介紹嵌入式系統設計步驟、方法,重點介紹嵌入式應用軟件的開發技術,以及嵌入式系統的測試技術及軟件優化技術。《嵌入式網絡技術》:重點介紹基于嵌入式環境下的網絡通信技術及應用,比如I2C總線技術、USB接口技術、嵌入式Web技術等,掌握相關的通信技術及接口編程。
第二層面:針對將來從事嵌入式系統平臺設計及合作開發的學生而言,除需要學習上述三門課程外,還必須開設《嵌入式系統結構》課程。該課程重點介紹某個具有代表性的嵌入式CPU(如ARM系列)的系統結構、匯編指令系統、中斷管理機制、常用外圍接口,使學生掌握嵌入式平臺設計的基礎知識。前提是學生具備數字邏輯方面的相關基礎知識。對于與第一個層面相同的課程,其授課中重點也不完全一樣。比如,《嵌入式操作系統》課程可以嵌入式Linux為主,重點介紹進程調度、進程間通信、內存管理和I/O驅動機制等,使學生具備進行操作系統的裁剪、移植的基本能力。
第三層面:針對將來從事SOC(systemonChip)系統設計及開發的學生而言。主要課程有數字邏輯設計與應用、電子電路原理與PCB技術、EDA技術(FPGA設計及應用)、嵌入式系統結構、嵌入式操作系統等,偏重于底層的設計。
通過以上分析可以看出,第一層至第三層分別是嵌入式系統中由軟到硬、由高層至底層的三個不同應用層次,對應不同的知識結構需求。第一層偏軟,對底層的系統結構及接口等要求較低,是在當前比較容易實現的一個培養方向。在計算機本科專業中,軟件方向比較適合開展第一個層面的嵌入式系統教學,應用方向比較適合開展第二個層面的嵌入式系統的教學。根據以上分析,可以提出在計算機本科專業開設嵌入式系統方向需要參照的課程體 系:(1)專業基礎課:嵌入式系統概論、嵌入式系統原理與接口技術。(2)專業必修課:嵌入式操作系統、嵌入式系統應用設計。
(3)專業選修課:嵌入式網絡技術、嵌入式系統測試技術、嵌入式工程應用(即行業領域,如移動通信技術與應用、數字家庭網關技術等)、分布式嵌入式系統原理與設計等。
作為課程體系的一部分,實踐教學是嵌入式系統教學的關鍵。實踐教學設置的總體指導思想是:以培養創新動手能力為核心,建立“系統的多級課程實踐”的實驗體系,包含課程基礎實驗、課程設計、綜合項目設計;同時,以“項目為中心”設計多層次的集中實踐題目,各層次的題目難度不等,以適合不同層次的學生[4]。
(1)每門課保證至少30%以上的上機或實驗學時,完成基礎實驗項目。(2)至少有兩門課的課程設計(約兩周),如ARM匯編程序設計、操作系統移植實驗、LCD/觸摸屏等接口實驗等等。(3)至少完成一個綜合課程設計(課余時間+綜合實訓時間共約40學時),類似于一個簡單的工程項目,有設計、編程調試、性能測試等完整的步驟如手機游戲、校園導航、電子詞典、嵌入式WEB服務器等。
(4)校企合作,建立實習基地,聯合完成項目設計。
三、嵌入式系統課程體系在計算機專業的實踐
我們在分析了企業對嵌入式人才需求的基礎上,提出了“在計算機本科專業培養嵌入式系統人才”的具體實施方案,并在2007級、2008級本科生中進行了實踐。
該課程定位為實驗研究型。目標是通過嵌入式實驗平臺學習構建一個嵌入式系統的一般方法,熟悉一些常用的微處理器、存儲器、外設接口并學習軟硬件設計方法。掌握嵌入式操作系統,定制內核,編譯下載調試,編寫驅動程序和應用程序等,最后要求實現或部分實現一個具體嵌入式應用的解決方案,并在硬件平臺上實現出來。
課程的主要內容包括:(1)典型嵌入式系統的基本配置?硬/軟件綜合設計方法和流程?應用范例?(2)硬件環境微處理器?存儲器?I/O 口?外設接口和驅動?電源轉換和管理?總線?硬件調試?(3)嵌入式操作系統?操作系統內核?Linux 和uCLinux?任務和任務調度?實時 OS? GUI?API?文件系統等?(4)嵌入式網絡通過和計算機網絡結合, 開發基于網絡接的應用?(5)軟件開發過程?交叉編譯?鏈接調試?下載?板級支持包?(6)驅動程序?設備驅動機制?按鍵和觸摸屏驅動?網口驅動?紅外?USB 驅動?
實驗是嵌入式系統教學的一個比較重要的環節,實驗大綱的制定是保證課程教學大綱目標實現的一個重要環節,制定出符合學生實際的實驗大綱對計算機科學與技術專業培養目標的實現至關重要。按難易程度的不同,實驗內容分為兩個層次:基本實驗與綜合應用實驗。基本實驗目的是讓學生了解嵌入式軟件和硬件的一般開發環境與流程,進行基本的嵌入式程序開發。綜合應用實驗目的是讓學生綜合運用前面所學到的知識,按照指定的題目,自行設計開發嵌入式應用程序。基本實驗包括嵌入式軟件開發基礎實驗、人機接口實驗、通信與音頻接口實驗、簡單驅動程序實驗和嵌入式操作系統移植實驗等。對于綜合應用實驗,給出多個題目,選擇其一,學生也可以自選題目。設備選 擇 了 北 京 博 創 公 司 所 開 發 的PXA270教學實驗平臺,由于 PXA270 性能好,實驗開發板的外圍設備又很豐富,使得實驗選題更加靈活。
課程設計及畢業設計中對所學知識的運用與提高在理論學習結束后,學生對嵌入式系統開發的各個環節有了較深入的理解與掌握。我們的方法是在課程設計和畢業設計中深化學習。課程設計中,結合實驗用開發平臺,選擇了如MP3模擬控制系統等在實際中真正是嵌入式大行其道的應用領域。在畢業設計中,我們布置了諸如“嵌入式智能控制器”,“嵌入式音頻控制器”,“內核裁減”設計等工作,這些設計要求學生從軟硬件協同設計到軟硬件的測試方法等有深刻的掌握。還有組織學生參加大學生嵌入式設計競賽等教學活動。
四、結束語
隨著嵌入式應用的迅猛發展,企業對嵌入式人才需求的缺口越來越大,越來越多的高校開始加強嵌入式系統的教學和科研,培養更多的適應社會需求嵌入式系統人才。本文所設置的針對計算機本科專業的嵌入式系統課程體系,融合了企業的需求和計算機專業的特點,符合實際應用。針對兩年實踐中存在的問題,在以后的教學中將不斷完善。
參考文獻:
[1]田澤.嵌入式系統開發與應用教程[M].北京:北京航空航天大學出版社,2005.[2]符意德.嵌入式系統教學及實驗內容的探討[J].軍工高
[3]賈志平.嵌入式系統原理與接口技術[M].北京:清華大學出版社,2004.[4]柳翔.嵌入式軟件工程人才培養的探索與實踐[J].計算機教育,2005,5.
第二篇:嵌入式課程論文
研究生課程論文
論文題目: 無線傳感網絡中的定位算法綜述
學 院: 信息科學技術學院 專 業: 儀器儀表工程
班 級: 81430 學 號: 8143035 學生姓名:
沈天穎
二○一五 年 一 月 十 日
無線傳感器網絡(WSN)是一個多學科的研究領域,具有很廣泛的應用前景,其中,WSN的定位是非常重要的研究方向。本課程論主要對WSN定位研究進行了歸納和總結。將每種定位算法按照需不需要測距分為兩大類,而且在具體算法中討論了其以下幾個特征,包括:需要/不需要錨節點、集中式/分布式、固定/移動等。
質心定位算法
DV-Hop算法
MDS-MAP算法
分簇算法
改進的無線傳感器網絡節點定位算法
第三篇:嵌入式論文總結
嵌入式論文總結
所謂嵌入式系統(Embedded Systems).實際上是“嵌入式計算機系統”的簡稱,它是相對于通用計算機系統而言的。在有些系統里也有計算機,但是計算機是作為某個專用系統中的一個部件而存在的。像這樣“嵌入”到更大、專用的系統中的計算機系統,稱之為“嵌入式計算機”、“嵌入式計算機系統”或“嵌入式系統”。
在日常生活中,早已存在許多嵌入式系統的應用,如天天必用的移動電話、帶在手腕上的電子表、烹調用的微波爐、辦公室里的打印機、汽車里的供油噴射控制系統和防抱死剎車系統(ABS).以及現在流行的個人數字助理(PDA)、數碼相機、數碼攝像機等等,它們內部都有一個中央處理器CPU。
嵌入式系統無處不在,從家庭中的洗衣機、電冰箱、小汽車,到辦公室中的遠程會議系統等,都屬于可以使用嵌入式技術進行開發和改造的產品。嵌入式系統本身是一個相對模糊的定義,一個手持的MP3和一個P(:104的微型工業控制計算機都可以認為是嵌入式系統。根據英國電氣工程師協會(IEE)的定義:嵌入式系統是用來控制或監視機器、裝置或工廠等大規模系統的設備。可以看出此定義是扶應用上考慮的,嵌入式系統是軟件和硬件的綜合體,還可以涵蓋機電等附屬裝置。國內對嵌入式系統的一般定義是:以應用為中心.以計算機技術為基礎,軟硬件可裁剪,從而能夠適應實際應用中對功能、可靠性、成本、體積、功耗等嚴格要求的專用計算機系統。
嵌入式系統在應用數量上遠遠超過了各種通用計算機。一臺通用計算機的外部設備中就包含了5~10個嵌入式微處理器,鍵盤、硬盤、顯示器、Modem、網卡、聲卡、打印機、掃描儀、數碼相機、集線器等均是由嵌入式處理器進行控制的。在制造工業、過程控制、通信、儀器、儀表、汽車、船舶、航空、航天、軍事裝備、消費類產品等方面,嵌入式系統都有用武之地。在大型嵌入式應用系統中,為了使嵌入式開發更方便、快捷,需要具備一種穩定、安全的軟件模塊集合,用來管理存儲器分配、中斷處理、任務間通信和定時器響應,以及提供多任務處理等,這樣的軟件模塊集合就是嵌入式操作系統。嵌入式操作系統的引入大大擴展了嵌入式系的功能,方便了應用軟件的設計,但同時也占用了嵌入式系統的寶貴資源。一般在比較大型或多任務的應用場合.才考慮使用嵌入式操作系統。
早期的嵌入式系統幾乎都用于控制,或多或少都有些實時要求,所以從前“嵌入式操作系統”實際上是“實時操作系統”的代名詞。近年來,由于手持式計算機和掌上電腦等設備的出現,也有了許多不帶實時要求的嵌入式系統。另一方面,由于C:PU速度的提高,一些原先被認為是“實時”的反應速度現在已經很普遍了,以前需要在“實時操作系統”上才能實現的應用,現在己不難在常規的操作系統上實現。在這樣的背景下,“嵌入式操作系統”和“實時操作系統”就成了不同的概念和名詞
嵌入式系統是應用于特定環境下、面對專業領域的應用系統,不同于通用計算機系統的多樣化和適用性。它與通用計算機系統相比具有以下特點:
(l)嵌入式系統通常是面向特定應用的,一般都有實時要求。嵌入式處理器大多工作在為特定用戶群所設計的系統中,通常具有功耗低、體積小、集成度高、成本低等特點,從而使嵌入式系統的設計趨于小型化、專業化,同時移動能力大大增強,與網絡的耦合也越來越緊密。
(2)嵌入式系統是將先進的計算機技術、半導體工藝、電子技術和通信網絡技術與各領域的具體應用相結合的產物。這一特點決定了它必然是一個技術密集、資金密集、高度分散、不斷創新的知識集成系統。
(3)嵌入式系統與具體應用有機地結合在一起,其升級換代也與具體產品同步進行。因此,嵌入式系統產品一旦進入市場,一般具有較長的生命周期。
(4)嵌入式系統的硬件和軟件都必須高效率地設計,在保證穩定、安全、可靠的基礎上,量體裁衣,去除冗余,力爭在同樣的硅片面積上實現更高的性能。這樣,才能最大限度地降低應用成本。在縣體應用中,對處理器的選擇決定了產品的市場競爭力。(5)嵌入式系統常常還有減小功耗的要求。這一方面是為了省電,因為嵌入式系統往往以電池供電;另一方面是要減少發熱量,因為嵌入式系統中常常沒有風扇等排熱手段。
(6)可靠性與穩定性對于嵌入式系統有著特別重要的意義,所以即使邏輯上的系統結構相同,在物理組成上也會有所不同。由于對所用元器件(包括接插件、電源等等)的質量和可靠性要求都比較高,所以元器件的平均無故障時間MTBF-(Mean Time Between F-ailure)成為關鍵性的參數。此外,環境溫度也是需要重點考慮的參數。
嵌入式系統以應用為中心,強調體積和功能的可裁剪性,是以完成控制、監視等功能為目標的專用系統。在嵌入式應用系統中.執行任務的軟硬件都嵌入在實際的設備環境中,通過專門的I/()接口和外界交換信息。它們執行的任務程序一般不由用戶編制。
嵌入式系統主要用于各種信號處理與控制,目前己在國防、國民經濟及社會生活各領域普遍應用操作系統OS(Operation Systems)是一組計算機程序的集合,用來有效地控制和管理計算機的硬件和軟件資源,即合理地對資源進行調度,并為用戶提供方便的應用接口。它為應用ARM9嵌入式系統設支持軟件提供運行環境,即為程序開發者提供功能強、使用方便的開發環境。
從資源管理的角度,操作系統主要包含如下功能。1.處理器管理
對處理器進行分配,并對其運行進行有效的控制和管理。在多任務環境下,合理分配由任務共享的處理器,使CPU能滿足各程序運行的需要,提高處理器的利用率,并能在恰當的時候收回分配給某任務的處理器。處理器的分配和運行都是以進程為基本單位進行的,因此對處理器的管理可以歸結為對進程的管理,包括進程控制、進程同步、進程通信、作業調度和進程調度等。2.存儲器管理
存儲器管理的主要任務,是為多道程序的運行提供良好的環境,包括內存分配、內存保護、地址映射、內存擴充等。例如,為每道程序分配必要的內存空間,使它們各得其所,且不致因互相重疊而丟失信息;不因某道程序出現異常情況而破壞其他程序的運行;方便用戶使用存儲器;提高存儲器的利用率;能從邏輯上來擴充內存等。3.設備管理
完成用戶提出的設備請求,為用戶分配l/()設備;提高C.PU和l/()的利用率;提高l/()速度.方便用戶使用l/()設備。設備管理包括緩沖管理、設備分配、設備處理、形成虛擬邏輯設備等。4.文件管理
在計算機中,大量的程序和毅據是以文件的形式存放的。文件管理的主要任務就是對系統文件和用戶文件進行管理,方便用戶的使用,保證文件的安全性。文件管理包括對文件存儲空間的管理、目錄管理、文件的讀/寫管理以及文件的共享與保護等。
5.用戶接口
用戶與操作系統的接口是用戶能方便地使用操作系統的關鍵所在。用戶通常只需以命令形式和系統調用即程序接口形式與系統打交道。使用圖形用戶接口(GUI).可以將文字、圖形和圖像集成在一起,用非常容易識別的圖標將系統的各種功能、應用程序和文件直觀地表示出來,用戶可以通過鼠標來獲取操作系統的服務。
隨著l_inux的迅速發展,嵌入式Linux現在已經有許多版本,包括強實時的嵌入式Linux(如新墨西哥工學院的RT-I_inux和堪薩斯大學的KURT-I_inux)和一般的嵌入式Linux(如riClinux和Pocket I。lnux等)。其中.RT-Iinux通過把通常的Iinux任務優先級設為最低,而所有的實時任務的優先級都高于它,以達到既兼容通常的I。Inux任務又保證強實時性能的目的。另一種常用的嵌入式Linux是riClinux.它是針對沒有MMU的處理器而設計的。它不能使用處理器的虛擬內存管理技術,對內存的訪問是直接的,所有程序中訪問的地址都是實際的物理地址。它專為嵌入式系統做了許多小型化的工作。
嵌入式系統與通用計算機在以下幾個方面有比較明顯的差別: 1.人機交互界面
嵌入式系統和通用計算機之間的最大區別就在于人機交互界面。嵌入式系統可能根本就不存在鍵盤、顯示器等設備,它所完成的事情也可能只是監視網絡情況或者傳感器的變化情況,并按照事先規定好的過程及時完成相應的處理任務。2.有限的功能
嵌入式系統的功能在設計時已經定制好,在開發完成投入使用之后就不再變化。系統將反復執行這些預定好的任務,而不像通用計算機那樣可以隨時運行新任務。雖然嵌入式操作系統可以添加新的任務,刪除舊的任務,但這樣的變化對嵌入式系統而言是關鍵性變化,有可能會對整個系統行為產生影響。3.時間關鍵性和穩定性
嵌入式系統可能要求實時響應,具有嚴格的時序性。同時,嵌入式系統還要求有非常可靠的穩定性。其工作環境可能非常惡劣,如高溫、高壓、低溫、潮濕等,這就要求在設計時考慮目標系統的工作環境,合理選擇硬件和保護措施。軟件穩定也是一個重要特征。軟件系統需要經過反復測試,達到預先規定的要求才能真正投入使用。
嵌入式軟件的開發與傳統軟件的開發有許多共同點,它繼承了許多傳統軟件的開發習慣。由于嵌入式軟件運行于特定昀目標應用環境,而該目標環境只針對特定的應用領域,所以嵌入式軟件的功能比較專一,只完成預期要完成的功能。出于對系統成本方面的考慮,應用系統的C:PU、存儲器、通信資源都恰到好處。嵌入式軟件的開發具有其自身的特點:
在Iinux的發展歷程中.Unix和Minix扮演著十分重要的角色。1990年,芬蘭人Unus 'ror-valds在赫爾辛基大學接觸到Unix;但是當時上機學習要排隊等候很長時間,所以I。inus購買了自己的PC機,希望安裝一個類似的操作系統。由于Unix的內核代碼不容易得到,所以他安裝了Minix。Minix是一個基于微內核技術的類似于Unix的操作系統,是Andrew Tanebaum教授利用業余時間開發的用于教學的操作系統。當時.Minix并不是完全免費的,而且Andrew Tane-baum教授不允許別人為Minix再加入其他東西,目的是為了教學的簡明扼要。
第四篇:嵌入式瀏覽器論文
嵌入式瀏覽器
摘要:近幾年,嵌入式市場迅速崛起,隨著網絡技術的迅猛發展,瀏覽器成為了很多嵌入式系統必不可少的一部分。許多公司都投入到了嵌入式瀏覽器的研究和開發中。本文簡要介紹嵌入式瀏覽器的的基本概念及其現狀和發展情況。
關鍵字:嵌入式系統、瀏覽器
1.嵌入式瀏覽器的概述 1.1嵌入式系統
所謂嵌入式系統就是指以應用為中心,以計算機技術為基礎,軟件硬件可裁剪,適應應用系統對功能、可靠性、成本、體積、功耗嚴格要求的專用計算機系統。嵌入式系統非常的多樣化,不同的系統差別是非常大的。
它一般由嵌入式微處理器、外圍硬件設備、嵌入式操作系統和用戶應用程序等四個部分組成。可以實現對其他設備的控制、監視或管理等功能,廣泛應用于消費電子和通信領域,是最具有時代特征的嵌入式產品是因特網上的信息家電。
1.2瀏覽器
瀏覽器是指可以顯示網頁服務器或者文件系統的HTML文件內容,并讓用戶與這些文件交互的一種軟件。網頁瀏覽器主要通過HTTP協議與網頁服務器交互并獲取網頁,這些網頁由URL指定,文件格式通常為HTML,并由MIME在HTTP協議中指明。一個網頁中可以包括多個文檔,每個文檔都是分別從服務器獲取的。大部分的瀏覽器本身支持除了HTML之外的廣泛的格式,例如JPEG、PNG、GIF等圖像格式,并且能夠擴展支持眾多的插件。另外,許多瀏覽器還支持其他的URL類型及其相應的協議,如FTP、Gopher、HTTPS(HTTP協議的加密版本)。HTTP內容類型和URL協議規范允許網頁設計者在網頁中嵌入圖像、動畫、視頻、聲音、流媒體等。常見的網頁瀏覽器包括微軟的Internet Explorer、Mozilla的Firefox、Apple的Safari、Google Chrome、GreenBrowser瀏覽器、Avant 瀏覽器、360安全瀏覽器等等。
1.3嵌入式瀏覽器
在當今的信息社會里,網絡無處不在。嵌入式系統發展到一定階段后,網絡成為了系統中的重要組成部分,并且需求越來越大。針對嵌入式系統的瀏覽器應運而生。嵌入式瀏覽器從功能上、技術上來說,和桌面系統中使用的瀏覽器沒有什么大的區別。但由于它處于嵌入式的特殊環境中,擁有了一些自身的獨特之處。
嵌入式瀏覽器的發展依賴于嵌入式軟硬件技術和網絡通信技術的發展。在過去,嵌入式硬件的發展使得它與網絡技術的結合成為可能;在將來,它的發展又會不斷減輕硬件限制帶給嵌入式瀏覽器的發展障礙。嵌入式瀏覽器和嵌入式操作系統的關系是非常密切的,甚至是不可分割的。嵌入式瀏覽器是嵌入式操作系統中最重要的應用軟件,甚至可能成為唯一直接支持的應用軟件。其它的應用都可以通過Plug—In接口或直接用HTML、JavaScript及其擴展語言來實現。網絡通信是嵌入式瀏覽器所依賴的最關鍵的技術之一。另外,網絡通信技術也帶動了智能手機、機頂盒和其它嵌入式網絡終端的發展,從而極大的擴展了嵌入式瀏覽器的應用。
2.嵌入式瀏覽器的特點
嵌入式瀏覽器從功能上和核心技術上來說和桌面瀏覽器很相似,但是其特殊的運行環境決定了它在很多方面跟后者的不同。
(1)硬件要求低,占用空間小
嵌入式瀏覽器應用于數字電視機項盒、掌上電腦、車載GPS等各種信息電器和便攜式網絡終端中。這些設備的處理器速度相對低很多,并且沒有浮點運算器,因此,瀏覽器在運行時不能太耗資源。另外,嵌入式設備的內存很小并且無存儲量大的硬盤等設備,這就決定了嵌入式瀏覽器不可能有著桌面瀏覽器那樣龐大的體積。
(2)易于移植
嵌入式系統具有分散性、多樣性的特點,進行應用開發時在芯片選擇、系統功能定義、顯示設備特性、內存限制等方面會有許多不同的要求。所以,在現實中,沒有一種嵌入式瀏覽器可以直接滿足所有嵌入式平臺的要求。在商業應用中,也不可能針對每一個平臺都去開發一款新的瀏覽器。因此,嵌入式瀏覽器接口定義清晰、平臺相關性小、容易移植顯得尤為重要。(3)模塊化、功能可定制
瀏覽器各個相對獨立的功能分開,各模塊之間通過接口相相互調用。這有利于軟件的可裁減性和定制性,并且為瀏覽器的調試、維護、局部優化和升級等提供了極大的便利。
(4)運行穩定,容錯性好
嵌入式軟件一般發行量大,并且售出后維護困難,所以,必須確保良好的運行穩定性。3.嵌入式瀏覽器的現狀
綜觀目前國際上的嵌入式瀏覽器產品,己經有一些成熟的商業化產品。而 大多基于開源代碼的嵌入式瀏覽器,則由于缺乏足夠的技術支持,一般都不夠成熟,實用化程度不高。不過目前隨著嵌入式瀏覽器越來越得到廣泛的應用,己經有許多的開源瀏覽器在不同平臺上得到了成功的移植和應用。總的來說,主要有以下相關嵌入式瀏覽器:(1)Access Netfront NetFront是Internet設備最流行的嵌入式瀏覽器之一。自它1995年問世以來,已被用在了50多種不同的Internet設備中,包括:Internet電視、PDA、機頂盒、汽車導航系統、迷你電話、web/screen電話、視頻游戲控制臺等。NetFront在有限的空間里,有很高的運行效率。它由許多的標準模塊組成,包括:web browser, Internet mail, PPP驅動、TCP / IP模塊、及其他Internet訪問模塊。通過添加可選模塊,可以擴展NetFront的功能,包括:Java-V M、手寫識別模塊、SSL模塊、動畫模塊、流視頻/音頻模塊等。NetFront的內核小于220KB,它的模塊化和可升級的設計,使得設備制造商可以只選擇特定需要的功能。這使得他們擁有了一個具有全部功能、且高性能的嵌入式瀏覽器系統。它只要2.OMB的RAM和LOMB的ROM。NetFront2.5完全支持HTML3.2、部分HTML4.0、Frames、JavaScript、Cookies、Web-printing、和多種語言。采用獨立的用戶界面層,設備制造商可以設計自己獨特的界面,使瀏覽器看起來像是專為他們的產品設計的。(2)ViewML ViewML(Viewable Markup Language)瀏覽器是第一個免費的,Open source的Web瀏覽器,專門針對嵌入式Linux平臺進行開發。ViewML的源代碼是公開的,任何人都可以為它開發新的功能或是對它進行維護。嵌入式Linux的研究成果也會對它的發展產生促進作用。它的產生加快了帶有瀏覽器的設備的開發和應用。例如,掌上電腦,導航系統、迷你電話和機頂盒等。現在,包括界面的ViewML瀏覽器需要2.1 MB的RAM。當有磁盤鏡象時,僅需要760K。它的第一個版本支持HTML3.2、用戶界面和基本的JavaScript解釋器。它基于KDE的kfm(kde file manager)和FLTK(fast light tool kit),可以在標準的X窗口系統和Microwindows嵌入式窗口系統下運行。它提供給了OEM高質量的,小尺寸的瀏覽器。
(3)iPanel iPanel嵌入式瀏覽器由深圳茁壯網絡公司開發,得到包括國內外眾多專業芯片供應商、設備廠商的測試和移植使用,被認為是世界上最優秀的嵌入式瀏覽器之一。iPanel支持HTML4.0、HTTP1.1、JavaScriptl.3、SSL3.0和DHTML、TVHTML等格式。針對電視顯示設計了特有的字體識別優化顯示和抗閃爍算法,完全支持包括中文、日文、韓文等雙字節語言。占用存儲空間小,全部主體400KB,只需1 MB的Flash、1.5-2MB的RAM。對硬件要求低,CPU的速率可低至200MIPS,一般可在33MHz主頻以上的CPU下運行。另外由于iPanel瀏覽器是完全基于嵌入式系統環境設計的,因而有非常好的可移植性。
(4)ZEN 一個并不知名的嵌入式瀏覽器,但卻十分優秀,開放源碼項目,不僅支持表格,支持多種圖像格式(GIF、PNG、JPEG三種),而且在設計上很有特色,ZEN瀏覽器基于非常理想的模塊化結構而設計,根據功能將ZEN清晰地分為網絡模塊、解析模塊、布局模塊、UI接口模塊等。其中,還將涉及到GUI平臺的部分獨立出來,支持GTK、OFBIS兩種圖形GUI,用戶可以通過配置采用不同的GUI平臺運行,而無須對整個軟件進行修改。Zen的代碼量很小,其內核編譯后的二進制版本可以達到300K左右,運行速度快。缺點是網絡功能比較弱,沒有緩沖功能。另外不支持邊下載邊顯示的技術,所以用戶等待時間可能較長。
此外,還有其它商用嵌入式瀏覽器:Spyglass Device Mosaic, PlanetWeb、ThriveiPanel、中科院的CASS、Teknema Browser、EBSNet Microbrowser、EnReacheBrowser、Light of Adamas、ICE Browser、Espial Escape等等,上述產品除CASS和ThriveiPanel外,大都還不支持漢字顯示。
4.嵌入式瀏覽器的發展前景
近幾年,嵌入式市場迅速崛起,許多大大小小的公司都相繼投入其中,出現了一些己經商業化的產品。但沒有任何一個產品,能夠像Microsoft的Internet Explorer和Netscape的Navigator在PC市場中一樣,占壟斷地位。在嵌入式的世界里,完美的HTML顯示不是必須的。好的技術應該是能夠像顯示老的文本格式一樣,簡潔的顯示現在的網頁。如,在蜂窩電話或者Internet設備(IAs)中,用戶需要迅速訪問股票報價、體育比賽結果、全球定位數據等等。嵌入式瀏覽器要能夠靈活的根據具體應用進行定制。商家根據各自不同的側重點,發展著自己的產品。
多樣的需求為眾多商家的發展提供了機會,他們投身到嵌入式市場中,促進了技術的進步、市場的發展。嵌入式瀏覽器的技術仍然在向前發展著,除了繼續跟隨HTML、HTTP、SSL、JavaScript等協議或語言的新版本,繼續升級以及支持更多的應用外,還在繼續拓展著其他的應用模式和領域。如,瀏覽器技術和數字電視機頂盒技術集成,實現完整的數字電視軟件平臺。瀏覽器技術和Java技術的結合,解決實時性強的動態視頻處理。把瀏覽器技術應用到更多傳統的電器領域,以提供交互式的應用等等。這些都是很好的發展方向,有著很好的發展前景。
5.結束語
隨著信息技術的飛速發展和互聯網的廣泛運用,體積更小,速度更快,功能用戶化的嵌入式瀏覽器,將使強調功能全面的Netscape和IE瀏覽器顯得越來越笨拙。盡管微軟仍然占據著個人電腦專用互聯網瀏覽器的主要份額,但越來越多的專業人士認為,迅速崛起的嵌入市場將成為講來主流瀏覽器。在云時代迅速到來之際,嵌入式瀏覽器將得到越來越廣泛的運用和發展。
參考文獻: [1] 張大波.嵌入式系統.北京:電子工業出版社.2008.[2] 劉亞平.嵌入式系統基礎與應用.北京:中國人民大學出版社.2009.[3] 張申亞.基于Linux的嵌入式瀏覽器的設計及實現.信陽師范學院.2007.[4] 唐云.嵌入式瀏覽器設計的幾個技術難點研究.湖南科技學院.2010.[5] 楊立明.嵌入式瀏覽器設計與實現.東北師范學院.2010.[6] 張晶,曾憲云.嵌入式系統概述.電測與儀表.2002.[7] 孫先虎,張曦煌.基于Linux的嵌入式瀏覽器的特點和實現.計算機應用與軟件.2004.
第五篇:嵌入式論文關于觸摸屏設計
嵌入式實驗課程設計
題
目 基于嵌入式的觸摸屏控制實驗
院
系
電子工程系
專
業
信息工程
學
號
20092309022
姓
名
楊 金 磊
指導教師
董立軍
二O一二 年 六 月 八 日
目 錄
1.要求.............................................................2 1.1設計目的......................................................1 1.2 設計意義......................................................2 1.3 設計內容......................................................2 1.4 主要任務......................................................2 2.正文.............................................................3 2.1觸摸屏工作原理(觸摸屏接口工作模式)..........................3 2.2、設計總體方案.................................................4 2.3、設計所需工具.................................................5 2.4、平臺構建過程.................................................5
2.4.1、硬件平臺搭建.............................................5 2.4.2根文件系統的制作...........................................7(1)根文件系統.................................................7 3.程序............................................................11 3.1.程序流程圖:.................................................11 3.2.分析驅動.....................................................11 3.2.1、觸摸屏設備驅動中數據結構................................11 3.2.2、觸摸屏驅動模塊加載和卸載函數............................13 3.2.3、觸摸屏設備驅動的讀函數..................................15 3.2.4、觸摸屏設備驅動的輪詢與異步通知..........................15 3.2.5源程序觸摸屏驅動代碼:....................................16 3.2.6、實驗結果顯示:..........................................27 4.心得............................................................28 4.1 課程設計心得體會:...........................................28 5.參考文獻........................................................28
5.1【參考文獻】..................................錯誤!未定義書簽。
第一章 要求
1.1 設計目的
(1)基于WINDOWS操作系統,以及實驗箱,利用觸摸屏返回觸點坐標值及動作信息。
(2)坐標及動作的具體顯示:觸摸筆動作,觸點X坐標值,觸點Y坐標值。
1.2 設計意義
(1)熟悉嵌入式系統開發平臺
(2)掌握ARM嵌入式操作系統下的各個指令的使用方法(3)了解觸摸屏的原理
1.3 設計內容
(1)系統的正確移植和使用(2)根文件系統的正確移植和使用(3)驅動程序的編譯與裝載
(4)嵌入式系統下應用程序的交叉編譯及下載與調試
1.4 主要任務
(1)熟悉實驗的流程(2)理解驅動程序源代碼
(3)調用驅動程序的某些函數,編譯與調試應用程序
第二章 正文
2.1觸摸屏工作原理(觸摸屏接口工作模式)
(1)普通轉換模式
普通轉換模式(AUTO_PST = 0,XY_PST = 0)是用作一般目的下的ADC轉換。這個模式可以通過設置ADCCON和ADCTSC來進行對AD轉換的初始化;而后讀取ADCDAT0(ADC數據寄存器0)的XPDATA域(普通ADC轉換)的值來完成轉換。(2)分離的X/Y軸坐標轉換模式:X軸坐標轉換和Y軸坐標轉換。
X軸坐標轉換(AUTO_PST=0且XY_PST=1)將X軸坐標轉換數值寫入到ADCDAT0寄存器的XPDATA域。轉換后,觸摸屏接口將產生中斷源(INT_ADC)到中斷控制器。
Y軸坐標轉換(AUTO_PST=0且XY_PST=2)將X軸坐標轉換數值寫入到ADCDAT1寄存器的YPDATA域。轉換后,觸摸屏接口將產生中斷源(INT_ADC)到中斷控制器。
(3)自動(連續)X/Y軸坐標轉換模式。
自動(連續)X/Y軸坐標轉換模式(AUTO_PST=1且XY_PST= 0)以下面的步驟工作:
觸摸屏控制器將自動地切換X軸坐標和Y軸坐標并讀取兩個坐標軸方向上的坐標。觸摸屏控制器自動將測量得到的X軸數據寫入到ADCDAT0寄存器的XPDATA域,然后將測量到的Y軸數據到ADCDAT1的YPDATA域。自動(連續)轉換之后,觸摸屏控制器產生中斷源(INT_ADC)到中斷控制器。(4)等待中斷模式
當觸摸屏控制器處于等待中斷模式下時,它實際上是在等待觸摸筆的點擊。在觸摸筆點擊到觸摸屏上時,控制器產生中斷信號(INC_TC)。中斷產生后,就可以通過設置適當的轉換模式(分離的X/Y軸坐標轉換模式或自動X/Y軸
坐標轉換模式)來讀取X和Y的位置。(5)靜態(Standby)模式
當ADCCON寄存器的STDBM位被設為1時,Standby模式被激活。在該模式下,A/D轉換操作停止,ADCDAT0寄存器的XPDATA域和ADCDAT1寄存器的YPDATA(正常ADC)域保持著先前轉換所得的值。
2.2、設計總體方案
2.2.1 軟件
(1)Embest Online Flash Programmer For ARM: Embest Flash在線編程器(2)HYPER TERMINAL(超級終端):傳送vivi.nand;
傳送vivi.nand
vivi> load flash kernel x <回車> 燒寫更新內核,傳送zImage文件;等待傳送內核:
vivi>load flash root j <回車> 燒寫更新文件系統;燒寫新的文件系統 load flash root j
(3)EmbestIDE Pro for ARM: 應用于嵌入式軟件開發的新一代集成開發環境,是一個高度集成的圖形界面操作環境,包含編輯器、編譯匯編鏈接器、調試器、工程管理、Flash 編程等工具;支持的開發語言包括標準C和匯編語言。(4)cygwin: 4
一個在windows平臺上運行的unix模擬環境,它對于學習unix/linux操作環境,或者從unix到windows的應用程序移植,或者進行某些特殊的開發工作,尤其是使用gnu工具集在windows上進行嵌入式系統開發,把gcc,gdb,gas等開發工具進行了改進,能夠生成并解釋win32的目標文件。2.2.2 硬件
S3C2410處理器是Samsung公司基于ARM公司的ARM920T處理器核,32位微控制器。該處理器擁有:獨立的16KB指令Cache和16KB數據Cache,MMU,支持TFT的LCD控制器,NAND閃存控制器,3路UART,4路DMA,4路帶PWM的Timer,I/O口,RTC,8路10位ADC,Touch Screen接口,IIC-BUS 接口,IIS-BUS 接口,2個USB主機,1個USB設備,SD主機和MMC接口,2路SPI。S3C2410處理器最高可運行在203MHz。
2.3、設計所需工具
2.3.1 軟件: Embest Online Flash Programmer For ARM,HYPER TERMINAL(超級終端),EmbestIDE Pro for ARM,cygwin 2.3.2 硬件:s3c2410開發板,Embest實驗箱
2.4、平臺構建過程
2.4.1、硬件平臺搭建
硬件流程圖:
(1)Vivi燒寫過程
1)首先把SW104斷開,Flash Programmer的Program,在File選擇Open打開要燒寫的配置文件S3C2410&NandFLash_vivi.cfg,在Flash Programmer的Program頁中選擇要燒寫的文件vivi.bon&load.bin。點擊按鈕 Progarm 開始燒寫,直到燒寫成功
2)連接串口線到 PC 機 COM1,運行光盤中提供的 Windows 超級終端Hyper Terminal.ht 把開發板重新加電,程序運行后,在超級終端上可以看到串口輸出Wating,表示正在等待用戶從超級終端下載文件。這時,請點擊超級終端菜單“傳送”選擇 Xmodem 方式下載 vivi.nand 文件,點擊 OK 后等待下載燒寫結束即可。(2)內核zImage燒寫
1)首先SW104設為短接(從Nand Flash啟動),并確定已經燒寫vivi.nand,加電。)在vivi啟動等待中,敲入空格鍵進入vivi界面環境,并輸入以下命令:vivi> load flash kernel x <回車> 燒寫更新內核約1分鐘即可燒寫完畢)點擊超級終端菜單中的“傳送”,選“發送文件”zImage” 并選擇xModem方式傳送)燒寫結束,重起實驗板,觀測超級終端窗口提示信息就可以啟動linux內核,(3)新文件系統的燒寫
1)首先SW104設為短接(從Nand Flash啟動),確定已經成功燒寫vivi.nand,加電運行可以看到vivi啟動信息,輸入空格進入命令狀態;
2)雙擊運行Download.pjf(該文件在/tmp/edukit-2410/image/中)工程(將啟動Embest IDE環境),點擊連接Remote connect,程序應該正在運行(命令按鈕STOP為紅色);在串口輸入help,看看有沒有反應,如果沒反應,點擊IDE 按鈕:Reset->Start(F5);再輸入help測試,直到有反應為止;
3)如果可以輸出一些信息,再點擊IDE中的Stop,配置Debug的Download地 6
址為0x30000000,并點擊IDE菜單Project選擇Settings項,在Download頁下拉Category到Download項,在Download File選擇root.cramfs文件,點擊確定后:
點擊IDE菜單DEBUG選擇Download下載文件系統映象? 下載完畢后,點擊Start(F5)然后在超級終端里輸入: load flash root j(燒寫更新文件系統)?
注意:只能在“vivi的燒寫”操作完成后,才可以按以上方法正確燒寫root映象到Nand Flash。
重起實驗板,觀測超級終端窗口提示信息,引導整個系統啟動到linux行命令輸入狀態。
2.4.2根文件系統的制作(1)根文件系統
根文件系統是Linux系統的核心部分,包含系統使用的軟件和庫,以及所有用來為用戶提供支持架構和用戶使用的應用軟件,并作為儲存數據讀寫結果的區域。在Linux系統啟動時,首先完成內核安裝及環境初始化,最后會尋找一個文件系統作為根文件系統被加載。Linux系統中使用“/”來唯一表示根文件系統的安裝路徑。嵌入式系統中通常可以懸著的根文件系統有:Romfs、CRAMFS、RAMFS、JFFS2、EXT2等,甚至還可以使用NFS作為根文件系統。
(2)cramfs文件系統
Cramfs是Linux創始人Linux torvalds開發的一個適用于嵌入式系統的小文件系統。Cramfs是一個只讀文件系統,采用zlib壓縮,壓縮比一般可以達到1:2,但仍可以做到高效的隨機讀取。Linux系統中,通常把需要修改的目錄壓縮存放,并在系統引導的時候再將壓縮文件解開。因為cramfs不會影響系統讀取文件的速度,而且是一個高度壓縮的文件系統,因此非常廣泛應用于嵌入式系統中。
(3)cygwin簡介
Cygwin是一個在windows平臺上運行的unix/Linux模擬環境,是cygnus solutions公司開發的自由軟件。Cygwin中,“/”表示根目錄,即cygwin的安裝目錄。我們常用的set_env_linux.sh中定義的目錄有:
SOURCEDIR:/tmp/edukit-2410存儲了vivi、linux、fs等源代碼和例程 WORKDIR:/usr/local/src/edukit-2410工作區。
一般情況下都要把已經規劃好的目錄結構轉換成一個映象文件,即使用命令工具 mkcramfs(cygwin下為 mkcramfs.exe),把相應的 cramfs 目錄樹壓縮為單一的映象文件。其命令格式為:
mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile 可以使用我們提供的 mkcramfs.exe 在 cygwin 下編譯生成文件系統映象文件 root.cramfs,再固化到開發系統 FLASH 上運行。
(4)常用的Linux行命令
1)、cd 改變當前目錄(文件夾)。例如下,cd/ 返回到根目錄 cd..退回到上級目錄
cd/tmp/edukit-2410/進入/tmp/edukit-2410/文件夾 2)、ls 列出當前目錄中的內容。Ls 簡單格式列表 ls–l 使用詳細格式列表。3)、pwd 顯示當前所在的目錄。
(5)tar工具命令
tar 程序用于儲存或展開 tar 存檔文件。命令格式:
tar [-參數] [文件名][路徑]-x :extract |--get 從存檔展開文件-v :--verbose 詳細顯示處理的文件-j :--有 bz2 屬性的必須包含
-f :--file [HOSTNAME:]F 指定存檔或設備(缺省為 /dev/rmt0)
(6)解壓原文件系統(命令+解壓目錄的存放)
1)先將 root.cramfs.tar.bz2文件放在C:cygwin目錄中 2)解壓文件系統
運行cygwin,執行以下命令解壓安裝:
$> source /tmp/edukit-2410/set_env_linux.sh? Linux編譯環境變量設置 $> cd /
$> tar-xvjf root.cramfs.tar.bz2 $> ls ? root ?
root文件夾中就是我們想要的cramfs文件系統 3)如果在根目錄中產生root文件夾,解壓成功 4)在root目錄中新建xx文件夾,用于存放應用程序
進入該目錄后執行以下命令編譯鏈接測試程序: $> cd root $>mkdir xx
(7)編譯應用程序 ts.c(命令+生成文件格式+存放位置): 將編寫好的ts.c程序放在C:cygwin目錄中 進入該目錄后執行以下命令編譯鏈接測試程序: $> cd / $> arm-linux-gcc-o ts ts.c(也可以編寫Makefile來編譯)
生成文件: ts 如下圖所示
將ts文件放入root 下的xx文件夾中
(8)新文件系統的制作: 把剛才編譯輸出的ts文件拷貝到文件系統所在的工作目錄root目錄下,執行以下命令生成新的文件系統映象:
$> cd /
$> mkcramfs root root.new
剛剛編譯生成的文件系統映象 root.new 中已經包含測試程序即生成文件。解壓文件系統在root目錄中新建xx文件夾,用于存放應用 將編寫好的ts.c程序放在C:cygwin目錄中 生成文件: ts 如下圖所示
新文件系統的制作
生成文件:
第三章 程序
3.1.程序流程圖:
3.2.分析驅動
觸摸屏驅動在/kernel/drivers/char/s3c2410-ts.c 文件中。
3.2.1、觸摸屏設備驅動中數據結構
(1)觸摸屏的file_operations static struct file_operations s3c2410_fops={ owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release, #ifdef USE_ASYNC fasync: s3c2410_ts_fasync,//異步通知
#endif poll: s3c2410_ts_poll,//輪詢 };(2)觸摸屏設備結構體的成員與按鍵設備結構體的成員類似,也包含一個緩沖區,同時包括自旋鎖、等待隊列和fasync_struct指針 typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun(環形緩沖區)*/ unsigned int head, tail;/* head and tail for queued events(環形緩沖區的頭尾)*/ wait_queue_head_t wq;//* 等待隊列數據結構 spinlock_t lock;//* 自旋鎖
#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;//友善之臂專有的,我后面的代碼刪除了這段 #endif } TS_DEV;
(3)觸摸屏結構體中包含的TS_RET值的類型定義,包含X、Y坐標和狀態(PEN_DOWN、PEN_UP)等信息,這個信息會在用戶讀取觸摸信息時復制到用戶空 間
typedef struct { 12
unsigned short pressure;//* 壓力,這里可定義為筆按下,筆抬起,筆拖曳
unsigned short x;//* 橫坐標的采樣值 unsigned short y;//* 縱坐標的采樣值 unsigned short pad;//* 填充位 } TS_RET;
(4)在觸摸屏設備驅動中,將實現open()、release()、read()、fasync()和poll()函數,因此,其文件操作結構體定義
觸摸屏驅動文件操作結構體:static struct file_operations s3c2410fops={} _3.2.2、觸摸屏驅動模塊加載和卸載函數
(1)在觸摸屏設備驅動的模塊加載函數中,要完成申請設備號、添加cdev、申請中斷、設置觸摸屏控制引腳(YPON、YMON、XPON、XMON)等多項工作 觸摸屏設備驅動的模塊加載函數
static int __init s3c2410_ts_init(void)觸摸屏設備驅動模塊卸載函數
static void __exit s3c2410_ts_exit(void)(2)可知觸摸屏驅動中會產生兩類中斷,一類是觸點中斷(INT-TC),一類是X/Y位置轉換中斷(INT-ADC)。在前一類中斷發生后,若之前處于PEN_UP狀態,則應該啟動X/Y位置轉換。另外,將抬起中斷也放在INT-TC處理程序中,它會調用tsEvent()完成等待隊列和信號的釋放 觸摸屏設備驅動的觸點/抬起中斷處理程序
static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)
當X/Y位置轉換中斷發生后,應讀取X、Y的坐標值,填入緩沖區 觸摸屏設備驅動X/Y位置轉換中斷處理程序
static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)觸摸屏設備驅動中獲得X、Y坐標
static inline void s3c2410_get_XY(void)(3)tsEvent最終為tsEvent_raw(),這個函數很關鍵,當處于PEN_DOWN狀態時調用該函數,它會完成緩沖區的填充、等待隊列的喚醒以及異步通知信號的釋放;否則(處于PEN_UP狀態),將緩沖區頭清0,也喚醒等待隊列并釋放信號
觸摸屏設備驅動的tsEvent_raw()函數 static void tsEvent_raw(void)(4)在包含了對拖動軌跡支持的情況下,定時器會被啟用,周期為10ms,在每次定時器處理函數被引發時,調用start_ts_adc()開始X/Y位置轉換過程
觸摸屏設備驅動的定時器處理函數
static void tstimerhandler(unsigned long data)(5)在觸摸屏設備驅動的打開函數中,應初始化緩沖區、penStatus和定期器、等待隊列及tsEvent時間處理函數指針 觸摸屏設備驅動的打開函數
static int s3c2410tsopen(struct inode *inode, struct file *filp)
_
_
_
_ 14
(6)觸摸屏設備驅動的釋放函數非常簡單,刪除為用于拖動軌跡所使用的定時器即可
觸摸屏設備驅動的釋放函數
static int s3c2410tsrelease(struct inode *inode, struct file *filp)
_
_3.2.3、觸摸屏設備驅動的讀函數
觸摸屏設備驅動的讀函數實現緩沖區中信息向用戶空間的復制,當緩沖區有內容時,直接復制;否則,如果用戶阻塞訪問觸摸屏,則進程在等待隊列上睡眠,否則,立即返回-EAGAIN 觸摸屏設備驅動的讀函數
static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, sizet count, lofft *ppos)_
_3.2.4、觸摸屏設備驅動的輪詢與異步通知
在觸摸屏設備驅動中,通過s3c2410_ts_poll()函數實現了輪詢接口,這個函數的實現非常簡單。它將等待隊列添加到poll_table,當緩沖區有數據時,返回資源可讀取標志,否則返回0 觸摸屏設備驅動的poll()函數
static unsigned int s3c2410_ts_poll(struct file *filp, struct polltablestruct *wait)而為了實現觸摸屏設備驅動對應用程序的異步通知,設備驅動中要實現s3c2410_ts_fasync()函數 觸摸屏設備驅動的fasync()函數 __
static int s3c2410_ts_fasync(int fd, struct file *filp, int mode)3.2.5源程序觸摸屏代碼:
/* * s3c2410-ts.c * * touchScreen driver for SAMSUNG S3C2410 * * Author: Janghoon Lyu
#include
#include
#include
#ifdef CONFIG_PM #include
/* debug macros */ #undef DEBUG #ifdef DEBUG #define DPRINTK(x...)printk(“s3c2410-ts: ” ##x)#else #define DPRINTK(x...)#endif
#define PEN_UP 0
#define PEN_DOWN 1 #define PEN_FLEETING 2 #define MAX_TS_BUF 16 /* how many do we want to buffer */
#undef USE_ASYNC 1 #define DEVICE_NAME “s3c2410-ts” #define TSRAW_MINOR 1
typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun */ unsigned int head, tail;/* head and tail for queued events */ wait_queue_head_t wq;spinlock_t lock;#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;#endif } TS_DEV;
static TS_DEV tsdev;
#define BUF_HEAD(tsdev.buf[tsdev.head])#define BUF_TAIL(tsdev.buf[tsdev.tail])#define INCBUF(x,mod)((++(x))&((mod)-1))
static int tsMajor = 0;
static void(*tsEvent)(void);
#define HOOK_FOR_DRAG #ifdef HOOK_FOR_DRAG #define TS_TIMER_DELAY(HZ/100)/* 10 ms */ static struct timer_list ts_timer;#endif
#define wait_down_int(){ ADCTSC = DOWN_INT | XP_PULL_UP_EN |
XP_AIN | XM_HIZ | YP_AIN | YM_GND |
XP_PST(WAIT_INT_MODE);} #define wait_up_int(){ ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ |
YP_AIN | YM_GND | XP_PST(WAIT_INT_MODE);} #define mode_x_axis(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |
XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE);} #define mode_x_axis_n(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |
XP_PULL_UP_DIS | XP_PST(NOP_MODE);} #define mode_y_axis(){ ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT | YM_GND |
XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE);} #define start_adc_x(){ ADCCON = PRESCALE_EN | PRSCVL(49)|
ADC_INPUT(ADC_IN5)| ADC_START_BY_RD_EN |
ADC_NORMAL_MODE;
ADCDAT0;} #define start_adc_y(){ ADCCON = PRESCALE_EN | PRSCVL(49)|
ADC_INPUT(ADC_IN7)| ADC_START_BY_RD_EN |
ADC_NORMAL_MODE;
ADCDAT1;} #define disable_ts_adc(){ ADCCON &= ~(ADCCON_READ_START);}
static int adc_state = 0;static int x, y;/* touch screen coorinates */
static void tsEvent_raw(void){ if(tsdev.penStatus == PEN_DOWN){
BUF_HEAD.x = x;
BUF_HEAD.y = y;
BUF_HEAD.pressure = PEN_DOWN;
#ifdef HOOK_FOR_DRAG
ts_timer.expires = jiffies + TS_TIMER_DELAY;
add_timer(&ts_timer);#endif } else { #ifdef HOOK_FOR_DRAG
del_timer(&ts_timer);#endif
BUF_HEAD.x = 0;
BUF_HEAD.y = 0;
BUF_HEAD.pressure = PEN_UP;}
tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF);wake_up_interruptible(&(tsdev.wq));
#ifdef USE_ASYNC if(tsdev.aq)
kill_fasync(&(tsdev.aq), SIGIO, POLL_IN);#endif
#ifdef CONFIG_PM pm_access(tsdev.pm_dev);#endif }
static int tsRead(TS_RET * ts_ret){ spin_lock_irq(&(tsdev.lock));ts_ret->x = BUF_TAIL.x;ts_ret->y = BUF_TAIL.y;ts_ret->pressure = BUF_TAIL.pressure;tsdev.tail = INCBUF(tsdev.tail, MAX_TS_BUF);spin_unlock_irq(&(tsdev.lock));
return sizeof(TS_RET);}
static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){ TS_RET ts_ret;
retry: if(tsdev.head!= tsdev.tail){
int count;
count = tsRead(&ts_ret);
if(count)copy_to_user(buffer,(char *)&ts_ret, count);
return count;} else {
if(filp->f_flags & O_NONBLOCK)
return-EAGAIN;
interruptible_sleep_on(&(tsdev.wq));
if(signal_pending(current))
return-ERESTARTSYS;
goto retry;}
return sizeof(TS_RET);}
#ifdef USE_ASYNC static int s3c2410_ts_fasync(int fd, struct file *filp, int mode){ return fasync_helper(fd, filp, mode, &(tsdev.aq));} #endif
static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait){ poll_wait(filp, &(tsdev.wq), wait);return(tsdev.head == tsdev.tail)? 0 :(POLLIN | POLLRDNORM);}
static inline void start_ts_adc(void){ adc_state = 0;mode_x_axis();start_adc_x();}
static inline void s3c2410_get_XY(void){ if(adc_state == 0){
adc_state = 1;
disable_ts_adc();
y =(ADCDAT0 & 0x3ff);
mode_y_axis();
start_adc_y();} else if(adc_state == 1){
adc_state = 0;
disable_ts_adc();
x =(ADCDAT1 & 0x3ff);
tsdev.penStatus = PEN_DOWN;
DPRINTK(“PEN DOWN: x: %08d, y: %08dn”, x, y);
wait_up_int();
tsEvent();} }
static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP)s3c2410_get_XY();#ifdef HOOK_FOR_DRAG else s3c2410_get_XY();#endif spin_unlock_irq(&(tsdev.lock));}
static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP){ start_ts_adc();} else { tsdev.penStatus = PEN_UP;DPRINTK(“PEN UP: x: %08d, y: %08dn”, x, y);wait_down_int();tsEvent();
} spin_unlock_irq(&(tsdev.lock));}
#ifdef HOOK_FOR_DRAG static void ts_timer_handler(unsigned long data){ spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_DOWN){
start_ts_adc();} spin_unlock_irq(&(tsdev.lock));} #endif
static int s3c2410_ts_open(struct inode *inode, struct file *filp){ tsdev.head = tsdev.tail = 0;tsdev.penStatus = PEN_UP;#ifdef HOOK_FOR_DRAG init_timer(&ts_timer);ts_timer.function = ts_timer_handler;#endif tsEvent = tsEvent_raw;init_waitqueue_head(&(tsdev.wq));
MOD_INC_USE_COUNT;return 0;}
static int s3c2410_ts_release(struct inode *inode, struct file *filp){ #ifdef HOOK_FOR_DRAG del_timer(&ts_timer);#endif MOD_DEC_USE_COUNT;return 0;}
static struct file_operations s3c2410_fops = { owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release,#ifdef USE_ASYNC fasync: s3c2410_ts_fasync, #endif poll: s3c2410_ts_poll, };
void tsEvent_dummy(void){} #ifdef CONFIG_PM static int s3c2410_ts_pm_callback(struct pm_dev *pm_dev, pm_request_t req,void *data){ switch(req){
case PM_SUSPEND:
tsEvent = tsEvent_dummy;
break;
case PM_RESUME:
tsEvent = tsEvent_raw;
wait_down_int();
break;} return 0;} #endif
#ifdef CONFIG_DEVFS_FS static devfs_handle_t devfs_ts_dir, devfs_tsraw;#endif static int __init s3c2410_ts_init(void){ int ret;
tsEvent = tsEvent_dummy;
ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);if(ret < 0){ printk(DEVICE_NAME “ can't get major numbern”);return ret;} tsMajor = ret;
/* set gpio to XP, YM, YP and YM */ #if 0 set_GPIO_mode(GPIO106_nYPON_MD);
set_GPIO_mode(GPIO105_YMON_MD);set_GPIO_mode(GPIO104_nXPON_MD);set_GPIO_mode(GPIO103_XMON_MD);
GPUP(GPIO106_nYPON)|= GPIO_bit(GPIO106_nYPON);GPUP(GPIO105_YMON)&= GPIO_bit(GPIO105_YMON);GPUP(GPIO104_nXPON)|= GPIO_bit(GPIO104_nXPON);GPUP(GPIO103_XMON)&= GPIO_bit(GPIO103_XMON);#else set_gpio_ctrl(GPIO_YPON);set_gpio_ctrl(GPIO_YMON);set_gpio_ctrl(GPIO_XPON);set_gpio_ctrl(GPIO_XMON);#endif
/* Enable touch interrupt */ ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_adc);if(ret)goto adc_failed;ret = request_irq(IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_tc);if(ret)goto tc_failed;
/* Wait for touch screen interrupts */ wait_down_int();
#ifdef CONFIG_DEVFS_FS devfs_ts_dir = devfs_mk_dir(NULL, “touchscreen”, NULL);devfs_tsraw = devfs_register(devfs_ts_dir, “0raw”, DEVFS_FL_DEFAULT,tsMajor, TSRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,&s3c2410_fops, NULL);#endif
#ifdef CONFIG_PM #if 0 tsdev.pm_dev = pm_register(PM_GP_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif tsdev.pm_dev = pm_register(PM_DEBUG_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif printk(DEVICE_NAME “ initializedn”);
return 0;tc_failed: free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);adc_failed: return ret;}
static void __exit s3c2410_ts_exit(void){ #ifdef CONFIG_DEVFS_FS
devfs_unregister(devfs_tsraw);devfs_unregister(devfs_ts_dir);#endif unregister_chrdev(tsMajor, DEVICE_NAME);#ifdef CONFIG_PM pm_unregister(tsdev.pm_dev);#endif free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);free_irq(IRQ_TC, s3c2410_isr_tc);}
module_init(s3c2410_ts_init);module_exit(s3c2410_ts_exit);觸摸屏應用程序
#include
#define PEN_UP 0 /* 觸摸筆抬筆,即觸摸屏不被壓下 */ #define PEN_DOWN 1 /* 觸摸筆下筆,即觸摸屏被壓下 */ #define PEN_FLEETING 2 /* 觸摸筆拖動 */
typedef struct { unsigned short pressure;/* 觸摸筆動作 */ unsigned short x;
/* 觸點x座標值 */ unsigned short y;
/* 觸點y座標值 */ unsigned short pad;}TS_RET;
int main(){ int fd,ret,i;
unsigned char suba;TS_RET tsret;
fd = open(“/dev/touchscreen/0raw”, O_RDWR);/* 打開設備 */ if(fd ==-1){ printf(“nCan't open I2C device!n”);exit(-1);}
while(1){
ret = read(fd,(char *)&tsret, sizeof(TS_RET));
if(ret!= sizeof(TS_RET))
{
printf(“read touch screen error!”);
close(fd);
exit(-1);
}
else
{
printf(“pressure is: %dn”, tsret.pressure);
printf(“x is: %dn”, tsret.x);
printf(“y is: %dn”, tsret.y);
} }
close(fd);return 0;} 3.3.應用程序的調試
使用s3c2410_ts.c觸摸屏驅動編寫應用程序,讀取觸摸屏的觸點坐標值及動作信息(觸點x坐標值,y坐標及是否有壓力值press),并在串口中斷打印出來
對觸摸屏設別的操作有打開設備,關閉設備,讀操作等。編寫應用程序讀取觸摸屏的觸點坐標值及動作信息時,只需利用觸摸屏驅動程序便可實現,先打開觸摸屏設備,然后調用讀函數即可。
其中,觸摸筆動作取值如下: #define PEN_UP 0 #define PEN_DOWN
/* 觸摸筆抬筆,即觸摸屏不被壓下 */ /* 觸摸筆下筆,即觸摸屏被壓下 */
#define PEN_FLEETING 2 結構體定義如下: typedef struct { unsigned short pressure;unsigned short x;unsigned short y;unsigned short pad;}TS_RET 打開應用程序:
/* 觸摸筆拖動 */
/* 觸摸筆動作 */ /* 觸點x座標值 */ /* 觸點y座標值 */
3.2.6、實驗結果顯示:
第四部分 感想
第四章 心得
4.1 課程設計心得體會:
經過個人的努力和老師以及同學們的幫助和指導,我順利的完成了本次《嵌入式系統原理》課程設計。本次課程設計為我提供了一個理論與實踐相結合的機會,既鍛煉了我的動手能力,又加深理解了在課堂所學習的理論知識。通過本次課程設計,將課本上的理論知識和實際應用有機結合起來,培養了我又動腦,又動手,獨立思考分析問題的能力,提高了我運用所學知識解決實際問題的綜合素質。通過本次課程設計我明白了只有不斷的努力,不斷的學習,才能在將來遇到的問題中能夠游刃有余,才能夠不會捉襟見肘。
參考文獻 程昌南,方強等.《ARM Linux入門與實踐 》【M】.北京:北京航空航天大學出版社,2008.10 2 張曉林等.《嵌入式系統設計與實踐》【M】.北京:北京航空航天大學出版社,2006.1 3 李俊等.《嵌入式Linux設備驅動開發詳解》【M】.北京:北京人民郵電出版社,2008.3 4 黃智偉,鄧月明,王彥.《ARM9嵌入式系統設計基礎教程》.北京:北京航空航天大學出版社,2008.8