




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、基于ARM的視頻采集系統(tǒng)的設計與實現(xiàn)摘 要本文根據(jù)家庭視頻采集系統(tǒng)的要求,提出一種基于ARM的網(wǎng)絡視頻采集方案。方案要求視頻的實時傳輸、實時監(jiān)控。本系統(tǒng)以Intel Xscale 芯片和嵌入式Linux系統(tǒng)為平臺,在平臺中搭建網(wǎng)絡視頻服務器,并以它為中介,負責將USB攝像頭采集到得視頻數(shù)據(jù)傳輸?shù)骄W(wǎng)絡服務器中,最后發(fā)送到申請監(jiān)控的遠程PC機中,遠程PC只需在網(wǎng)頁中便能實時的看到監(jiān)控端的視頻圖像。論文首先闡述了嵌入式網(wǎng)絡視頻采集技術的發(fā)展、現(xiàn)狀和前景,然后介紹了嵌入式硬件系統(tǒng)結構和嵌入式Linux操作系統(tǒng)的特點,闡述了嵌入式硬件整體結構,使大家大體的完整的對系統(tǒng)硬件有詳細的了解,實際記錄了嵌入式操
2、作系統(tǒng)內(nèi)核的編譯和移植,介紹了Bootloader的基本原理和啟動過程,實現(xiàn)了視頻采集程序的編譯和移植,研究了嵌入式一般驅動程序的使用。隨后,本文詳細描述了視頻采集程序的整體結構框圖和具體功能代碼塊、網(wǎng)絡通信編程技術、圖像編解碼、嵌入式視頻服。關鍵詞:ARM;嵌入式;Linux;視頻采集 可修改 歡迎下載 精品 Word目 錄摘 要I第1章 引言11.1 課題的背景和來源11.2 本文的內(nèi)容及主要工作3第2章 嵌入式ARM系統(tǒng)硬件結構簡介32.1 視頻監(jiān)控系統(tǒng)結構簡介32.2 ARM處理器簡介32.3 XScale體系結構42.4 主要硬件電路說明7第3章 嵌入式ARM系統(tǒng)軟件結構93.1 L
3、inux操作系統(tǒng)簡介93.2 交叉編譯環(huán)境的建立103.3 嵌入式Linux操作系統(tǒng)移植113.3.1 BootLorder移植113.3.2 Linux 內(nèi)核移植123.3.3 嵌入式文件系統(tǒng)133.4 Linux下的程序調(diào)試14第4章 USB設備驅動程序設計154.1 設備驅動程序簡介154.2 Linux下驅動程序的實現(xiàn)184.3 USB攝像頭驅動程序設計20第5章 視頻采集功能的設計235.1 基于V4L的編程245.1.1 攝像頭相關數(shù)據(jù)結構245.1.2 攝像頭基本功能實現(xiàn)255.1.3 視頻數(shù)據(jù)采集295.2 圖像編解碼325.2.1 編解碼介紹325.2.2 系統(tǒng)壓縮技術33第
4、1章 引言1.1 課題的背景和來源二十一世紀的網(wǎng)絡化、數(shù)字化讓人們的生活每天都發(fā)生著翻天覆地的變化,獲取信息的方便和快捷可以使人們在信息化的今天領先一步創(chuàng)造出巨大的利益,而獲取信息的重要途徑就是眼睛。據(jù)統(tǒng)計,人類采集信息的80%來自視覺。圖像和視頻是對客觀事物生動、形象的描述,是一種最直觀的表現(xiàn)方式。而視頻監(jiān)控技術因為它方便快捷、生動形象、信息豐富等特點日益受到人們的青睞,并在各行各業(yè)得到廣泛的應用。與此同時,現(xiàn)代網(wǎng)絡和數(shù)字技術的快速發(fā)展也為視頻監(jiān)控技術的發(fā)展奠定了堅實的基礎。二十一世紀,嵌入式技術、多媒體處理技術進一步發(fā)展,為視頻監(jiān)控系統(tǒng)的發(fā)展提供了新的出路嵌入式視頻監(jiān)控系統(tǒng)。嵌入式系統(tǒng)是以
5、應用為中心,軟硬件可以剪裁,具有高穩(wěn)定、低成本、功耗低、速度快、實時好的專用計算機系統(tǒng),它由嵌入式微處理器,配以周邊硬件設備,接口電路組成。嵌入式系統(tǒng)內(nèi)部使用嵌入式操作系統(tǒng),安裝專用的功能軟件。嵌入式技術把硬件和軟件集于一體,獨立工作。嵌入式視頻監(jiān)控系統(tǒng)比其他視頻采集系統(tǒng)在布局區(qū)域范圍上要廣泛;由于使用IP技術,嵌入式視頻監(jiān)控技術比其他視頻采集系統(tǒng)更具緊密的結合度,能夠充分利用現(xiàn)代網(wǎng)絡技術的成果,并能構成復雜的視頻監(jiān)控網(wǎng)絡;性能上,嵌入式視頻采集系統(tǒng)繼承了嵌入式技術的優(yōu)點,非常適合自動化的環(huán)境。因此,嵌入式視頻采集技術正在我國快速的發(fā)展,積極的研究會加強我們在這方面技術的學習,也會為視頻監(jiān)控技
6、術的發(fā)展貢獻力量。1.2 本文的內(nèi)容及主要工作根據(jù)畢業(yè)設計的初衷,我們需要設計基于ARM的網(wǎng)絡視頻采集系統(tǒng)。在監(jiān)控系統(tǒng)中,視頻采集、傳輸、播放的功能不是由專門視頻處理芯片完成,而是由軟件實現(xiàn)。論文首先介紹了嵌入式ARM系統(tǒng)的硬件結構和軟件結構,方便大家熟悉ARM和Linux系統(tǒng),包括嵌入式設備的硬件結構,邏輯框圖和Linux的基本操作、安裝方法;第二,研究了嵌入式的一些驅動程序,主要是攝像頭驅動程序V4L,系統(tǒng)中選用的攝像頭芯片中星微301;第三,研究了視頻監(jiān)控的具體流程和實現(xiàn)方式,讓大家在總體上對整個系統(tǒng)有一個大概的認知。本次設計的目的只有一個,就是實現(xiàn)視頻的實時監(jiān)控。圍繞它,不管是硬件結構
7、還是軟件流程,都需要學習和研究,不斷調(diào)試,決不放棄??傊?,論文的內(nèi)容都是圍繞如何建立一個視頻采集系統(tǒng)。無論是從哪個方面,我們都是為這個目標而努力。第2章 嵌入式ARM系統(tǒng)硬件結構簡介2.1 視頻監(jiān)控系統(tǒng)結構簡介網(wǎng)絡視頻監(jiān)控系統(tǒng)是基于嵌入式技術設計的。嵌入式并沒有統(tǒng)一的定義,但目前有一個廣泛而又被認可的規(guī)范:將軟件產(chǎn)品固化到硬件平臺上,完成應有的功能既是嵌入式?;谇度胧紸RM技術的視頻監(jiān)控系統(tǒng)服務器端采用攝像頭不斷的采集圖像,壓縮成視頻流,然后通過網(wǎng)絡發(fā)送到申請監(jiān)控的客戶端。監(jiān)控系統(tǒng)的使用者可以在遠程實現(xiàn)網(wǎng)頁上的實時監(jiān)控和一些簡單的功能操作。系統(tǒng)整體結構如圖2.1所示1。圖2.1 系統(tǒng)整體結構
8、圖該系統(tǒng)中CPU采用基于ARM的PXA270微處理器,通過在其上運行Linux操作系統(tǒng),執(zhí)行Boa視頻服務器,接受并處理來自攝像頭的圖像信號,通過以太網(wǎng)控制器發(fā)送至遠端,實現(xiàn)視頻數(shù)據(jù)的遠程傳輸和接受,達到視頻監(jiān)控的目的2。2.2 ARM處理器簡介ARM,既是一個公司的名字,也是對一類微處理器的通稱。ARM嵌入式微處理器是全球領先的16/32位RISK處理器芯片知識產(chǎn)權設計供應商ARM(AdvancedRISKMachines)公司的產(chǎn)品。ARM公司本身不直接從事芯片生產(chǎn),而是依靠轉讓設計許可,由合作公司生產(chǎn)各具特色的芯片。ARM處理器以其完整的體系結構,極小的體積、極低的功耗、極低的成本、極高
9、的性能,及時根據(jù)嵌入對象的不同進行功能上的擴展的優(yōu)勢,在眾多種類的嵌入式微處理器中脫穎而出?;贏RM技術的微處理器應用占據(jù)了32位RISC微處理器75%以上的市場份額,ARM技術正在逐步滲入到我們生活的各個方面。采用RISC架構的ARM微處理器一般具有如下特點:(1) 采用固定長度的指令格式,指令規(guī)整、簡單、基本尋址方式有23種;(2) 使用單周期指令,便于流水線操作執(zhí)行;(3) 大量使用寄存器,數(shù)據(jù)處理指令只對寄存器進行操作,以提高指令的執(zhí)行效率;(4)所有的指令都可根據(jù)前面的執(zhí)行結果決定是否被執(zhí)行,從而提高指令的執(zhí)行效率;(5)可用加載/存儲指令批量傳輸數(shù)據(jù),以提高數(shù)據(jù)的傳輸效率;(6)
10、可在一條數(shù)據(jù)處理指令中同時完成邏輯處理和移位處理;(7)在循環(huán)處理中使用地址的自動增減來提高運行效率。目前,ARM處理器有ARM7、ARM9、ARM9E、 ARM10、ARM10E、SecurCore、StrongARM和XScale等系列。每個系列除了具有ARM體系結構的共同特點以外,都有各自的特點和應用領域。2.3 XScale體系結構Xscale核是采用ARM V5TE架構的處理器,是Intel公司的StrongARM的升級換代產(chǎn)品,它具有高性能、低功耗等特點,并在流水線設計、DSP處理和指令設計中有很大改進3。ARM的體系結構是基于RISK的,XScale是ARM處理器的一種,所以XS
11、cale具有RISK的基本特性。而且針對嵌入式系統(tǒng),XScale構架還引入了Pentium處理器工藝和系統(tǒng)結構技術,實現(xiàn)了Pentium微處理器體系結構的一系列高性能技術,達到了高性能、低功耗和小體積等嵌入式系統(tǒng)要求的特性。它的特點有:超流水線、高主頻、存儲體系、分支預測和指令集體系結構。本設計采用的就是基于英特爾Xscale構架的一種32位嵌入式處理器,它除了應用于掌上電腦之中外,還可以應用于智能手機、網(wǎng)絡存儲設備、骨干網(wǎng)路由器等電子設備。PXA27x系列處理器是英特爾當前最新推出的嵌入式處理器。它的時鐘頻率從312到624MHz不等,并內(nèi)建64MB的堆棧型Intel StrataFlash
12、內(nèi)存。內(nèi)置了英特爾的無線MMX技術,能夠顯著提升多媒體性能。OURS-PXA270-EP是一款基于INTELXSCALE PXA270處理器,針對高效嵌入式系統(tǒng)教學和實驗科研的平臺。這款設備主要包括核心板與底版兩個部分,核心板主要集成了高速的PXA270 CPU,配套的存儲器,網(wǎng)卡等設備;底版主要是各種類型的接口與擴展口。核心板(8層PCB電路)系統(tǒng)包括:CPU: INTEL PXA270(520M),支持GDB調(diào)試;SDRAM: 64M 工作在104M外頻上;FLASH: 32M INTEL Nor FLASH;Net: 10/100M Ethernet controller (LAN91C
13、111);SUPERIO: WINBOND 83977;CPLD: XILINX 95144 (117USER IO);總線驅動器: 若干;核心板正面如圖2.2所示,核心板背面如圖2.3所示。圖2.2 核心板正面圖圖2.3 核心板背面圖底版(4層PCB電路)如圖2.4所示。包括:Ethernet: 10/100接口1個UART: 6個(包括RS232,RS485,IRDA,全功能串口)USB1.1:2個(1個host 一個device)PS2:2個(KEYBOARD&MOUSE)標準并口:1個PCMCIA: 1個IDE:1個SD/MMC: 1個SMC:1個CAMERA:1個96PIN功
14、能擴展口:2個4X5 小鍵盤CPU_JTAG CPLD_JTAGLEDSHARP LQ080V3DG01 8寸真彩LCD640X480VGA 640X480LED 8X8點陣一組7段LED數(shù)碼管 4個 圖2.4 底版圖2.4 主要硬件電路說明嵌入式設備除了以ARM芯片為主要控制單元,也有很多周邊電路和外圍設備,它們有的幫助ARM處理信號、有的負責存儲數(shù)據(jù)、有的進行網(wǎng)絡連接、有的用來數(shù)據(jù)通信,這些周邊設備缺一不可,不能替代。首先介紹CPU核心總線4,總線是CPU和其他設備的橋梁。CPU是通過總線信號來控制SDRAM ,FLASH,網(wǎng)卡,SUPERIO等外部設備的,無論是低速還是高速,只要是與總線
15、相關的芯片,都要和CPU總線信號有關。其次,研究嵌入式系統(tǒng)內(nèi)存SDRAM。SDRAM是嵌入式系統(tǒng)的內(nèi)存,具有單位空間存儲容量大和價格便宜的優(yōu)點,已廣泛應用在各種嵌入式系統(tǒng)中。當系統(tǒng)啟動時,CPU首先從復位地址0x0處讀取啟動代碼,在完成系統(tǒng)的初始化后,程序代碼一般應調(diào)入SDRAM中運行,以提高系統(tǒng)的運行速度。同時,系統(tǒng)及用戶堆棧、運行數(shù)據(jù)也都放在SDRAM中。SDRAM的存儲單元可以理解為一個電容,總是傾向于放電,為避免數(shù)據(jù)丟失,必須定時刷新(充電)。因此,要在系統(tǒng)中使用SDRAM,就要求微處理器具有刷新控制邏輯,或在系統(tǒng)中另外加入刷新控制邏輯電路。PXA270芯片在片內(nèi)具有獨立的SDRAM刷
16、新控制邏輯,可方便地與SDRAM接口。除了SDRAM,F(xiàn)LASH也是一種存儲媒介。FLASH一般具有NOR型和NAND型。NAND型FLASH單元密度高,寫入和擦除速度非??欤乙话鉔AND型FLASH的存儲容量很大。NOR型FLASH的優(yōu)點是芯片內(nèi)執(zhí)行命令,這樣應用程序可以直接在FLASH內(nèi)運行,不用進入內(nèi)存,使得它的傳輸效率很高。嵌入式設備最大的優(yōu)點就是網(wǎng)絡功能強大,它能像PC一樣方便地連接到互聯(lián)網(wǎng)上,這些功能都是網(wǎng)絡控制器的作用。也就是Ethernet Controller,本系統(tǒng)采用SMSC公司的單芯片的網(wǎng)絡控制器,LAN91C111。它可以工作在兩種速度下,10M以太網(wǎng)或者100M
17、以太網(wǎng)。LAN91C111的工作流程是,驅動程序將要發(fā)送的數(shù)據(jù)包按指定格式寫入芯片并啟動發(fā)送命令,LAN91C111會自動把數(shù)據(jù)包轉換成物理幀格式在物理信道上傳輸;反之芯片收到物理信號后自動將其還原成數(shù)據(jù),并按指定格式存放在芯片RAM中以便主機程序取用。就是LAN91C111完成數(shù)據(jù)包和電信號之間的相互轉換。最后,說明一下串口電路,在嵌入式視頻監(jiān)控系統(tǒng)中,串口起到了很重要地作用,嵌入式系統(tǒng)啟動的信息都可以通過串口傳到PC上,極大地方便了系統(tǒng)的移植和軟件的調(diào)試。大多數(shù)情況下,嵌入式CPU的串口0會作為CPU的一個終端,為用戶與CPU交互提供基本的輸出輸入信息。當CPU運行BOOT代碼時,通常只有
18、這個終端 ;運行LINUX內(nèi)核時,如果有LCD顯示,串口0與LCD終端會同時有效。串口0終端的交互方式是命令行的模式,在BOOT階段,支持簡單的BOOT命令。第3章 嵌入式ARM系統(tǒng)軟件結構3.1 Linux操作系統(tǒng)簡介Linux是一個類似Unix的操作系統(tǒng),它起源于芬蘭一個名為LinusTorvaldS的業(yè)余愛好者,現(xiàn)已成為最流行的一款開放源代碼的操作系統(tǒng)。Linux從問世至今,短短時間內(nèi)已發(fā)展成為一個功能強大、設計完善的操作系統(tǒng)。Linux系統(tǒng)不僅能夠運行于PC平臺,還在嵌入式系統(tǒng)方面大放光芒。由于Linux的源碼開放,內(nèi)核精簡且性能強悍,不依賴于具體廠商,能廣泛適用于各種硬件設備,系統(tǒng)二
19、次開發(fā)成本極低,因此在IT業(yè)界已經(jīng)達成共識,即采用嵌入式Linux作為嵌入式操作系統(tǒng)是大勢所趨5。嵌入式Linux是目前嵌入式系統(tǒng)領域中發(fā)展勢頭非常迅猛的系統(tǒng)。嵌入式Linux是指對Linux經(jīng)過小型化裁剪后,能夠固化在容量只有幾百K字節(jié)或幾M字節(jié)的存儲器芯片或單片機中,應用于特定嵌入式場合的專用操作系統(tǒng)。目前正在開發(fā)的嵌入式系統(tǒng)中,49%的項目選擇嵌入式Linux作為操作系統(tǒng)。嵌入式Linux現(xiàn)已成為嵌入式操作系統(tǒng)的理想選擇6。目前基于嵌入式Linux的應用已經(jīng)遍布很多領域,比如移動多媒體設備、手持設備、車載導航系統(tǒng)、機械控制等。嵌入式Linux分為兩種類型:在沒有使用MMU的平臺上(無內(nèi)存
20、虛實地址轉換和映射)的一般為uCLinux;而在有MMU平臺上,則使用原本地嵌入式Linux版本。由于在目前的主流嵌入式ARM中大多不具有MMU,因此只用IM左右的內(nèi)核就能實現(xiàn)網(wǎng)絡功能和任務調(diào)度的Linux系統(tǒng)就可以適用于從高端服務器到嵌入式應用的各級平臺。ARM技術和Linux成功地結合,應用于數(shù)以千計的商業(yè)產(chǎn)品中。從便攜式消費品、網(wǎng)絡和無線設備,到自動化設備、醫(yī)療設備和存儲產(chǎn)品,這一應用列表與日俱增。ARM和Linux的結合充分滿足了各類應用對嵌入式平臺高性能、低功耗和低價格的要求,通過開發(fā)環(huán)境、開源社區(qū)和ARM的商業(yè)伙伴的優(yōu)勢為嵌入式開發(fā)提供了更靈活的選擇。本次設計的開發(fā)環(huán)境為redha
21、t9.0系統(tǒng),在Windows XP 下安裝虛擬機,在虛擬機中安裝Linux系統(tǒng),這樣可以屏蔽底層差別,避免硬件驅動帶來的麻煩,而且還能方便的使用串口、并口、USB接口,快速的進入實驗環(huán)境。圖3.1為虛擬機下Linux系統(tǒng)啟動后的情況。 圖3.1 虛擬機下Linux操作系統(tǒng)3.2 交叉編譯環(huán)境的建立通常嵌入式系統(tǒng)的軟件編譯和執(zhí)行是在兩個不同平臺上進行的。編譯是在宿主機,一般為裝有Linux的pc;執(zhí)行是在目標機,即嵌入式系統(tǒng)的硬件平臺。一般是在宿主機上通過跨平臺交叉編譯器把源文件編譯成目標平臺上可執(zhí)行的文件,再通過串口、并口或者網(wǎng)絡下載至目標平臺上的FLASH或者其它存儲介質(zhì),然后由目標機來運
22、行這些軟件。這里所說的跨平臺編譯器和一般的編譯器功能類似,都是把源代碼通過編譯器編譯成目標文件,然后通過鏈接器、可重定位器程序和定位器把目標文件重新定位成可執(zhí)行文件。和通用的編譯器之間最大的差別就在于跨平臺編譯器編譯出來的可執(zhí)行程序通常只能在特定CPU所屬平臺上運行。所以一般來說每種CPU都對應有不同的跨平臺編譯器。本系統(tǒng)采用基于XScale的PXA270,可以使用常用的ARM-LINUX-GCC交叉編譯器。要成功構建完整的交叉編譯環(huán)境需要在宿主機上創(chuàng)建一系列的工具包括C/C+編譯器、匯編器、鏈接器、嵌入式系統(tǒng)的標準C庫和GDB代碼級調(diào)試器。成功建立好開發(fā)環(huán)境后便可以運用這些工具進行嵌入式系統(tǒng)
23、開發(fā)7。3.3 嵌入式Linux操作系統(tǒng)移植3.3.1 BootLorder移植BootLoader是系統(tǒng)加電后運行的第一段代碼。一般只是在啟動時運行很短的時間,然而對一個嵌入式系統(tǒng)來說,這一部分卻是整個系統(tǒng)的一個無比重要的組成部分,不可缺少。在一般嵌入式系統(tǒng)中,系統(tǒng)復位或者加電后通常從地址0x00000000處開始執(zhí)行,而這個地址一般正是存放的BootLoader啟動代碼。通過這段程序,可以初始化硬件設備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終加載操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。BootLoader一般情況下需要包含以下幾個必備的功能 :(l)初始化處理器。
24、這個動作都是用匯編語言完成的,稱為重置碼(resetcode)或者稱為bootcode,而且對于每個CPU都不一樣的,當電源接通后就會執(zhí)行這個動作,通常只有兩三個匯編指令,目的是將CPU的控制權轉給硬件初始化的程序。(2)初始化一些必要的硬件。這個動作也大都由匯編語言來完成,主要是初始化CPU、SDRAM等,其他的硬件,例如串口,可以由c語言等比較高級的程序語言來完成后續(xù)動作。(3)設置處理器的寄存器以及內(nèi)存,關掉所有的輸入管腳(包括中斷管腳),以防止突然有信號進入妨礙接下來的硬件初始化動作。然后初始化串口,以便后續(xù)運行的程序能夠同HOST端進行通信,便于調(diào)試。(4)從特定的位置把操作系統(tǒng)和文
25、件系統(tǒng)調(diào)入內(nèi)存,并設置一些操作系統(tǒng)所必需的參數(shù),然后把CPU控制權交給操作系統(tǒng)。有的BootLoader會先從串口或者網(wǎng)絡等其他途徑得到內(nèi)核的映像文件,然后把這些文件寫入目標系統(tǒng)的FLASH或者其它存儲介質(zhì),最后再把內(nèi)核載入RAM執(zhí)行,交出控制權。一般BootLoader都包含兩種不同的操作模式:“啟動加載”模式和“下載”模式,這種區(qū)別僅對于開發(fā)人員才有意義。從最終用戶的角度看,BootLoader的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動加載模式與下載模式的區(qū)別。(l)啟動加載(Bootloading)模式:這種模式也稱為“自主”(Autonomous)模式,即BootLoader從目
26、標機上的某個固態(tài)存儲設備上將操作系統(tǒng)加載到RAM中運行,整個過程并沒有用戶的介入。這種模式是BootLoader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時候,BootLoader顯然必須工作在這種模式下。(2)下載(Downloading)模式:在這種模式下,目標機上的BootLoader將通過串口連接或者網(wǎng)絡連接等通信手段從主機(HOST)下載文件,比如下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被BootL0ader保存到目標機的RAM中,然后再被BootLoader寫到目標機上的FLASH類固態(tài)存儲設備中。BootLoader的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時被使用,
27、此外,以后的系統(tǒng)更新也會使用BootLoader的這種工作模式。工作于這種模式下的BootLoader通常都會向它的終端用戶提供一個簡單的命令行接口。BootLoader的實現(xiàn)依賴于CPU的體系結構,一般來說啟動過程分為兩個階段。第一階段依賴于CPU體系結構的代碼,比如設備初始化代碼等,通常都放在第一階段中,而且通常都用匯編語言來實現(xiàn),運行效率比較高。這個階段完成的任務一般如下:( l) 硬件設備初始化(屏蔽所有的中斷、關閉處理器內(nèi)部的指令/數(shù)據(jù)cache);(2) 為第二階段準備RA.M空間;(3) 復制BootLoader的第二階段代碼到RAM空間中;(4) 設置好堆棧并跳轉到第二階段的C
28、程序入口點。第二階段則通常用C語言來實現(xiàn),這樣可以實現(xiàn)復雜的功能,而且代碼會具有更好的可讀性和可移植性。這個階段主要任務有:( l)初始化本階段要使用的硬件設備;(2)檢測系統(tǒng)內(nèi)存映射;(3)將內(nèi)核映像和根文件系統(tǒng)從FLASH讀到RAM中;(4)為內(nèi)核設置啟動參數(shù);(5)調(diào)用內(nèi)核文件運行。本設計中的Bootloader采用Blob,Blob是Boot Loader Object的縮寫,是一款功能強大的Bootloader。Blob最初是由Jan-Derk Bakker和Erik Mouw兩人為一塊名為LART(Linux Advanced Radio Terminal)的開發(fā)板寫的,該板使用的
29、處理器是StrongARM SA-1100,現(xiàn)在Blob已經(jīng)被成功移植到許多基于ARM的CPU上了。本設計中的Intel Xcale就是采用Blob作為Bootloader8。3.3.2 Linux 內(nèi)核移植選用嵌入式Linux作為目標機操作系統(tǒng),一方面由于Linux是一款免費的操作系統(tǒng),能很好的降低成本,同時Linux的開發(fā)應用現(xiàn)在已經(jīng)成為熱門,有大量的資源可用于學習與重復應用,并且Linux系統(tǒng)具有良好的可移植性和可裁剪性,能自動支持多任務管理。一般常用的GUI如QT/E,MiniGUI等都支持Linux。Linux的開發(fā)工具也都可以很方便的免費獲得。系統(tǒng)采用的嵌入式Linux內(nèi)核為隨實驗
30、平臺光盤中的Linux內(nèi)核,它是針對這套實驗平臺所配置的Linux內(nèi)核,內(nèi)核版本為Linux2.4.209。在實驗過程中,只需要在這個內(nèi)核的基礎上進行添加和刪減所需要和不需要的功能,編譯后就可以使用了。在編譯內(nèi)核之前,需要對內(nèi)核進行必要的配置,通過虛擬機進入/pxa270_linux/linux/目錄后在終端執(zhí)行make menuconfig10命令,就可以可視化的配置內(nèi)核需要的功能和要求,本次試驗,主要是針對視頻方面,選擇了對V4L的靜態(tài)加載、對spca5xx攝像頭驅動的動態(tài)加載,這樣就結束了對內(nèi)核的配置。編譯內(nèi)核需要創(chuàng)建內(nèi)核依賴關系、創(chuàng)建內(nèi)核鏡像文件和創(chuàng)建內(nèi)核模塊。首先執(zhí)行makedep命
31、令,讀取配置過程生成的配置文件,來創(chuàng)建對應于配置的依賴關系樹,從而決定哪些需要編譯而哪些不需要;接著需要makeclean刪除前面步驟留下的文件,以避免出現(xiàn)一些錯誤;然后便可以生成所需要的內(nèi)核文件了,用make zlmage來實現(xiàn)得到可移植的內(nèi)核。內(nèi)核文件通過并口下載線燒寫入開發(fā)板中,便可以通過BootLoader加載運行。3.3.3 嵌入式文件系統(tǒng)嵌入式Linux操作系統(tǒng)一般采用FLASH作為存儲介質(zhì)。FLASH具有獨特的物理特性,所以必須使用專門的嵌入式文件系統(tǒng)。嵌入式系統(tǒng)對文件的操作是通過層次結構實現(xiàn)的。對于用戶程序來說,文件是有結構的文件,用戶程序通過對文件IO函數(shù)操作文件。嵌入式文件
32、系統(tǒng)是嵌入式操作系統(tǒng)的一部分,它的任務是對邏輯文件進行管理,其工作包括提供對邏輯文件的操作(復制、刪除、修改等)接口,方便用戶操作文件和目錄。在文件系統(tǒng)內(nèi)部,根據(jù)存儲設備的特點,使用不同的文件組織模式來實現(xiàn)文件的邏輯結構。此外,文件系統(tǒng)要對管理文件的安全性負責。文件系統(tǒng)不能直接控制物理設備,它是通過FLASH驅動實現(xiàn)控制的11。目前FLASH支持的文件系統(tǒng)技術主要有JFFS2,YAFFS2,TrueFFS,F(xiàn)TL/NTFL,RAMFS,CRAMFS和ROMFS等等。本系統(tǒng)采用的是JFFS2文件系統(tǒng)。JFFS2文件系統(tǒng)是專門為NAND閃存設計的嵌入式文件系統(tǒng),根據(jù)NAND閃存以頁面為單位存取的特
33、點,將文件組織成固定大小的數(shù)據(jù)段。利用NAND閃存提供的每個頁面16B的備用空間來存放ECC(ErrorCorrectionCode)和文件系統(tǒng)的組織信息、,不僅能夠實現(xiàn)錯誤檢測和壞塊處理,也能夠提高文件系統(tǒng)的加載速度。JFFS2采用一種多策略混合的垃圾回收算法,結合了貪心策略的高效性和隨機選擇的平均性,達到了兼顧損耗平均和系統(tǒng)開銷的目的。它是日志結構的文件系統(tǒng),提供了損耗平衡和掉電保護,可以有效地避免意外掉電對文件系統(tǒng)一致性和完整性的影響。JFFS2文件系統(tǒng)是按層次結構設計的,分為文件系統(tǒng)管理層接口、JFFS2內(nèi)部實現(xiàn)層和NAND接口層,這樣就簡化了其與系統(tǒng)的接口設計,可以方便地集成到系統(tǒng)中
34、去。與YAFFS相比,它增加了一些功能,因此功能更強。3.4 Linux下的程序調(diào)試調(diào)試是程序開發(fā)過程中必不可少的一個重要環(huán)節(jié),通用PC機的程序調(diào)試與嵌入式操作系統(tǒng)的調(diào)試環(huán)境上有著明顯的區(qū)別,前者調(diào)試器和被調(diào)試的程序往往是運行在同一臺機器上,是相同操作系統(tǒng)下的兩個不同的進程,調(diào)試器通過操作系統(tǒng)專用調(diào)用接口控制被調(diào)試進程,后者通常為遠程調(diào)試,調(diào)試器一般運行于桌面操作系統(tǒng)上,而被調(diào)試的程序則運行在嵌入式系統(tǒng)之上,因此需要協(xié)調(diào)這兩個程序之間的通信。Linux下的調(diào)試工具非常的少,gdb是Linux下最著名的調(diào)試工具,它是GNUC自帶的調(diào)試工具,它可以使開發(fā)人員了解程序運行的詳細細節(jié),從而消除程序的錯
35、誤,達到調(diào)試的目的,gdb還具有遠程調(diào)試功能,可以滿足嵌入式系統(tǒng)調(diào)試的要求,在調(diào)試過程中PC機也稱為宿主機和嵌入式系統(tǒng)通過串口協(xié)議或者TCP/IP協(xié)議連接起來,遠程主機上運行被gdb規(guī)范斷點改造過的內(nèi)核,當條件成立時,斷點被激活,然后等待本地宿主機的連接命令,一旦連接成功,宿主機就可以向遠程嵌入式系統(tǒng)發(fā)送調(diào)試命令了。在調(diào)試過程中gdb通過調(diào)試stub來完成通信功能,調(diào)試stub是嵌入式操作系統(tǒng)中的一小段代碼,它提供了運行gdb的宿主機和嵌入式系統(tǒng)進程之間交互的一個媒介。除了使用調(diào)試器外還可以直接在程序中使用printf()或printk打印函數(shù),這種方法功能比較弱,效率低下,但在內(nèi)核模塊調(diào)試時
36、這是唯一的方法。第4章 USB設備驅動程序設計4.1 設備驅動程序簡介Linux系統(tǒng)中,設備驅動程序扮演著特殊的角色。它就像一個獨立的黑盒子一樣,使某個特定的硬件可以相應一個定義良好的內(nèi)部編程接口并且完成隱藏設備的作用。用戶只需調(diào)用一組標準化的函數(shù)完成操作,而且這些操作與特定的驅動程序無關。驅動程序的任務就是將這些函數(shù)映射到作用硬件的具體操作上。這樣的模塊化的驅動程序結構使得Linux系統(tǒng)中的驅動程序可以獨立于內(nèi)核的其他部分,可以在需要使用的時候將驅動“插入”內(nèi)核。從系統(tǒng)運行順序來看,硬件平臺啟動運行Linux后,啟用了MMU單元即內(nèi)存管理單元,在這種模式下系統(tǒng)不能直接對物理地址進行訪問。若要
37、對某一硬件外設進行讀寫,需要通過內(nèi)核調(diào)用該硬件的驅動來實現(xiàn)。上面已經(jīng)說過,驅動程序的作用在于向應用程序提供訪問硬件設備的接口,驅動程序屏蔽了硬件實現(xiàn)上的細節(jié)操作,于是應用程序可以像操作普通文件一樣對硬件設備進行操作。Linux以模塊的形式加載設備類型,通常是一個模塊對應實現(xiàn)一個設備驅動。模塊是內(nèi)核的一部分,它們沒有被編譯到內(nèi)核中,而是分別被編譯并鏈接成一組目標文件。可以根據(jù)用戶的需要在不需要對內(nèi)核進行重新編譯的情況下動態(tài)載入正在運行的內(nèi)核,或從正在運行的內(nèi)核中卸載。利用這種機制,內(nèi)核尺寸可以保持在最小,并具有最大的靈活性,也便于檢驗新的內(nèi)核代碼,而不需要重新編譯內(nèi)核并重新引導。設備驅動程序一般
38、需要完成以下功能:( l)對設備初始化和釋放;(2)把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù);(3)讀取應用程序傳送給設備文件的數(shù)據(jù)和回送應用程序的請求數(shù)據(jù);(4)檢測和處理設備出現(xiàn)的錯誤。在Linux操作系統(tǒng)下有兩類主要設備文件類型:塊設備、字符設備。用戶進程正是通過設備文件來與硬件打交道。每個設備文件都有其文件屬性,表示是字符設備還是塊設備。另外每個文件都有2個設備號,第一個是主設備號,標識驅動程序;第二個是從設備號,標識使用同一個設備驅動程序的不同硬件設備。設備文件的主設備號必須與設備驅動程序在登記時申請的設備號一致,否則用戶進程將無法訪問驅動程序。Linux驅動程序可以分為三個主要部分:
39、( l)自動配置和初始化子程序,負責檢測所要驅動的硬件設備是否存在和能否正常工作。如果該設備正常,則對這個設備及其他必需的條件位口中斷、DMA通道)進行申一請并初始化。這部分驅動程序僅在初始化時被調(diào)用一次。(2)服務于I/O請求的子程序,又稱為驅動程序的上半部分。調(diào)用這部分程序是由于系統(tǒng)調(diào)用的結果。這部分程序在執(zhí)行時,系統(tǒng)仍認為是與進行調(diào)用的進程屬于同一個進程,只是由用戶態(tài)變成了核心態(tài),但仍具有進行此系統(tǒng)調(diào)用的用戶程序的運行環(huán)境,因而可以在其中調(diào)用與進程運行環(huán)境相關的函數(shù)。(3)中斷服務子程序,又稱為驅動程序的下半部分。在Linux操作系統(tǒng)中,并不是直接從中斷向量表中調(diào)用設備驅動程序的中斷服務
40、子程序,而是由Linux系統(tǒng)來接收硬件中斷,再由系統(tǒng)調(diào)用中斷服務子程序。中斷可以在任何一個進程運行時產(chǎn)生,因而在中斷服務子程序被調(diào)用時,不能依賴于任何進程的狀態(tài),也就不能調(diào)用任何與進程運行環(huán)境有關的函數(shù)。因為設備驅動程序一般支持同一類型的若干設備,所以一般在系統(tǒng)調(diào)用中斷服務子程序時,都帶有一個或多個參數(shù),以唯一標識請求服務的設備。在系統(tǒng)內(nèi)部,I/O設備的存取通過設備驅動程序提供的一組固定的入口點來進行,這組入口點在驅動程序初始化時向系統(tǒng)進行登記,以便在系統(tǒng)適當?shù)臅r候調(diào)用。一般來說,字符型設備驅動程序能夠提供如下幾個入口點:(1)open入口點:打開設備準備I/O操作,對字符特別設備進行打開操作
41、,都會調(diào)用設備的open入口點。open子程序必須對將要進行的I/O操作做好必要的準備工作,如清除緩沖區(qū)等。如果設備是獨占的,即同一時刻只能有一個程序訪問此設備,則open子程序必須設置一些標志以表示設備的狀態(tài)。(2)close入口點:關閉一個設備,當最后一次使用設備結束后,調(diào)用dose子程序。獨占設備必須標記設備可再次使用。(3)read入口點:讀取設備,對于有緩沖區(qū)的I/0操作,一般從緩沖區(qū)里讀取設備數(shù)據(jù)。(4)write入口點:向設備寫數(shù)據(jù),對于有緩沖區(qū)的I/O操作,一般向緩沖區(qū)里寫入數(shù)據(jù)。(5)ioctl入口點:執(zhí)行讀寫之外的操作。USB(Universal Serial Bus)即“
42、通用串行外部總線”,用途廣泛,可以外接硬盤、鍵盤、鼠標、打印機等多種設備,USB能夠使用盡可能少的接口支持盡可能多的外設,尤為適合在嵌入式設備中使用,是嵌入式接口標準的一個很好的選擇。USB總線規(guī)范有1.1版和2.0版。USB1.1支持兩種傳輸速率:低速1.5Mbit/s、全速12Mbit/s,這樣的速率完全滿足鼠標、鍵盤、CD-ROM等設備,但是在嵌入式視頻監(jiān)控系統(tǒng)中,這樣的速度還是很慢。所以,USB2.0提供了一種更好的傳輸速率:高速,它可以達到480Mbit/s。USB2.0向下兼容USB1.1,可以將遵循USB1.1規(guī)范的設備連接到USB2.0控制器上,也可以把USB2.0的設備鏈接到
43、USB1.1控制器上。USB總線的硬件拓撲結構12如圖4.1所示。圖4.1 USB總線硬件拓撲圖USB主機控制器通過根集線器與其他USB設備相連。集線器也屬于USB設備,通過它可以在一個USB接口上擴展出多個接口。除根集線器外,最多可以層疊5個集線器,每條USB電纜的最大長度是5m,所以USB總線的最大距離為30m。一條USB總線上可以外接127個設備,包括根集線器和其他集線器。整個結構圖是一個星狀結構,一條USB總線上所有設備共享一條通往主機的數(shù)據(jù)通道,同一時刻只能有一個設備與主機通信。通過USB主機控制器來管理外接的USB設備,USB主機控制器共分3種:UHCI、OHCI和EHCI。在配置
44、Linux內(nèi)核的時候,看到的“HCD”字樣表示“Host Controller Drivers”,即主機控制器驅動程序。USB驅動程序分為兩類:USB主機控制器驅動程序(Host Controller Drivers)、USB設備驅動程序(USB device drivers)。它們在內(nèi)核中的層次如圖4.2所示。圖4.2 USB驅動程序層次結構在試驗中,教學平臺上的Linux嵌入式內(nèi)核已經(jīng)配置了USB主機控制器驅動程序,只需要添加需要的USB設備驅動程序,就能實現(xiàn)USB設備的正常使用。4.2 Linux下驅動程序的實現(xiàn)Linux操作系統(tǒng)下對硬件設備進行驅動開發(fā)的一般步驟如下:(l)注冊設備在系
45、統(tǒng)啟動時或者在模塊加載的時候需要將設備和重要的數(shù)據(jù)結構登記到內(nèi)核的設備數(shù)組中,并確定該設備的主次設備號。在Linux系統(tǒng)中,對于字符設備一般通過調(diào)用register_chrdev向系統(tǒng)注冊設備驅動程序,register_chrdev在fs/deviees.c文件中的定義如下:int register_chrdev(unsigned int major,const char*name,struct file_operations fops)定義中的major是設備驅動程序向系統(tǒng)申請的主設備號,如果major為O,則系統(tǒng)為該驅動程序動態(tài)的分配一個主設備號,不過此設備號是臨時的;name是設備名:f
46、ops是各個調(diào)用入口點的說明。函數(shù)返回O表示注冊成功,返回-INVAL表示申請的主設備號非法,返回-EBUSY表示申請的主設備號正在被其它設備驅動程序使用。以后對設備驅動程序的file_operations的操作都可以通過該主設備號的索引來完成。register_chrdev函數(shù)操作成功后,設備名便出現(xiàn)在/proc/devices文件目錄中,使用命令cat/proc/devices可以查看設備的工作狀態(tài)。(2)定義操作集驅動程序中要通過一系列函數(shù)完成對設備的不同操作,這些操作在面向對象編程術語中也稱為方法,該操作集通過數(shù)據(jù)結構file_operations實現(xiàn)。內(nèi)核內(nèi)部通過file結構識別設備
47、,通過file_operations數(shù)據(jù)結構提供的文件系統(tǒng)的入口點函數(shù)訪問設備。file_operations定義在<linux/fs.h>中的函數(shù)指針表: struct file_operations struct module*owner; loff_t (*llseek) (struct file*, loff_t, int); ssize_t (*read) (struct file*, size_t, loff_t*); ssize_t (*write) (struct file*, const char*, size_t, loff_t*); int (*readdir
48、) (struct file*, void*, filldir_t*); unsigned int (*poll) (struct file*, struct poll_table_struct*); int (*ioctl) (struct inode*, struct file*, unsigned int, unsigned long); int (*mmap) (struct file*, struct vm_area_struct*); int (*open) (struct inode*, struct file*); int (*flush) (struct file*); in
49、t (*release) (struct inode*, struct file*); int (*fsync) (struct file*, struct dentry*, int datasync);int (*fsyne) (int, struct file*, int); int (*lock) (struct file*,int, struct file_lock*); ssize_t (*readv) (struct file*, const struct iovec*, unsigned long, loff_t*); ssize_t (*writev) (struct file
50、*, const struct iovec*, unsigned long, loff_t*); ssize_t (*sendpage) (struct file*, struct page*, int, size_t, loff_t*, int); unsigned long (*get_unmapped_area) (struct file*, unsigned long, unsigned long, unsigned long, unsigned long);這個結構的每一個成員的名字對應一個系統(tǒng)調(diào)用,在用戶程序利用系統(tǒng)調(diào)用對設備文件進行諸如讀/寫操作時,系統(tǒng)調(diào)用會通過設備文件的主設備
51、號找到相應的驅動程序,然后讀取這個數(shù)據(jù)結構的相應函數(shù)指針,把控制權交給該函數(shù)。對于具體的設備驅動并不需要實現(xiàn)結構中所有的例程,只要完成設備功能就可以了。例如對于一個常見的字符設備驅動來說,可能只有操作open(),write(),read(),ioctl()和close(),當用戶程序通過系統(tǒng)調(diào)用訪問設備時,最終要通過這些操作集來完成。(3)卸載模塊當不再需要使用一個模塊或設備時,需要將其從內(nèi)核中卸載下來,這時會動態(tài)調(diào)用模塊中的module_exit()函數(shù),并需要在該函數(shù)中調(diào)用modul_unregister_chrdev()或module_unregister_blkdev()釋放掛入內(nèi)核
52、的數(shù)據(jù)結構同時釋放該設備號。4.3 USB攝像頭驅動程序設計攝像頭屬于視頻設備,在Linux內(nèi)核中,VideoforLinux(簡稱V4L)是關于視頻設備的驅動標準。這個標準為應用程序定義了一系列的接口函數(shù),內(nèi)核、驅動和應用程序都是依靠這個標準來進行交流。本系統(tǒng)所使用的USB攝像頭正是基于該標準來編寫驅動和應用程序的。Linux內(nèi)核是依據(jù)設備號來操作設備文件的,在內(nèi)核中,攝像頭對應的設備文件名為/dev/video0,主設備號是81,次設備號根據(jù)攝像頭數(shù)目來確定,本系統(tǒng)中僅使用一個攝像頭,所以可以通過mknod/dev/video0 c 81 0來創(chuàng)建節(jié)點。USB攝像頭驅動程序實現(xiàn)原理如圖4.
53、3所示。USB攝像頭的驅動和通用設備的驅動準則一樣,但需要與內(nèi)核提供的視頻驅動掛鉤。即首先在驅動中聲明一個 video_device結構,并為其指定文件操作函數(shù)指針數(shù)組fops,向系統(tǒng)注冊。在應用程序發(fā)出文件操作的相關命令時,核心根據(jù)這些指針調(diào)用相應函數(shù),并將該結構作為參數(shù)傳遞給它們。這樣,就完成了驅動和核心之間的通信。例如:Static struct video_devie vdev_template=;聲明 video_deviee,指出掛接驅動圖4.3 攝像頭驅動實現(xiàn)框圖Static Struct file_operation spcasxx_fops= ;聲明本驅動的文件操作函數(shù)指針S
54、truct video_device*vdev=video_devdata (file);從文件指針中提取出 video_deviee結構在video_deviee結構中,有一個私有指針priv,可以將它指向一塊保留內(nèi)存。在這塊內(nèi)存中,保存著本驅動、本設備的相關初始化信息。這塊內(nèi)存的申請、初始化、指針指向等工作都是在USB驅動的枚舉函數(shù)probe中完成。這樣,在枚舉函數(shù)將控制權返還給系統(tǒng)后,因為內(nèi)核不銷毀保留內(nèi)存,所以驅動仍然保留著自己的信息。在驅動卸載函數(shù)中需要將申請的各塊內(nèi)存全部釋放。Linux系統(tǒng)中任何USB傳輸都通過URB實現(xiàn)。為提高速度,可以考慮擴大URB的緩沖,這樣可以降低每個US
55、B事務中握手信息所占比例,提高有效數(shù)據(jù)的輸速度。但是受限于總線帶寬和具體的USB設備芯片,單純擴大URB的緩沖不能無限制地解決問題。USB在操作系統(tǒng)中每次傳輸都要包括URB的建立、發(fā)出、回收、數(shù)據(jù)整理等階段,這些時間不產(chǎn)生有效數(shù)據(jù)。因此可以建立兩個URB,在等待一個URB被回收時,也就是圖像正在被傳感器采集時,處理、初始化另一個URB,并在回收后立刻將其發(fā)出。兩個URB交替使用,大大減少了額外時間。 由于嵌入式平臺上運行的Linux2.4.20內(nèi)核,內(nèi)部已經(jīng)集成了對USB2.0的支持,所以無需移植相應的USB驅動。在設計中,攝像頭芯片采用中星微的Z301系列芯片,Linux2.4內(nèi)核并不支持這
56、種芯片,所以我們通過移植芯片驅動程序來達到目的。芯片的驅動程序是spca5*系列,如果不重新編譯內(nèi)核的話,將驅動程序動態(tài)加載就可以正常使用。設計中動態(tài)加載的命令使用insmod命令,它和modprobe命令在使用上有所不同,modprobe在加載模塊時不用指定模塊文件的絕對路徑,也不用帶模塊文件的后綴.o或.ko;而insmod需要的是模塊的所在目錄的絕對路徑,并且一定要帶有模塊文件名后綴的.o或者.ko。但是在功能上,它們所達到的效果基本相同13。第5章 視頻采集功能的設計視頻采集程序是基于V4L開發(fā)的,包括攝像頭的初始化、打開/關閉、參數(shù)設置和數(shù)據(jù)讀取等操作,視頻采集程序流程圖如圖5.1所
57、示14。圖5.1 視頻采集程序流程圖5.1 基于V4L的編程5.1.1 攝像頭相關數(shù)據(jù)結構攝像頭的組成部分是傳感器、DSP、鏡頭、外殼、USB連線、電路板和周邊電路構成,其中最重要的是傳感器和DSP(數(shù)字信號處理器)。本系統(tǒng)選用的攝像頭采用了CMOS傳感器和中星微301處理器。V4L15提供了一系列的接口應用程序,可以利用這些程序實現(xiàn)對攝像頭的調(diào)用,其中有read、open、ioctl等。V4l同時將這些函數(shù)和參數(shù)封裝成一個數(shù)據(jù)結構vdIn。struct vdInint fd;char *videodevice ;struct video_mmap vmmap;struct video_capability videocap;int mmapsize;struct video_mbuf videombuf;struct video_picture videopict;struct video_window videowin;struct video_channel videochan;struct video_param video
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞斯萊斯魅影購車合同范本
- 為要使用合同范本
- pvc銷售合同范本
- 代辦旅游合同范本
- 兼職司機 合同范本
- 養(yǎng)生店合同范本
- 分期車輛協(xié)議合同范本
- 2024年上海健康醫(yī)學院招聘考試真題
- 北京一對一合伙合同范本
- 下鋪門店轉讓合同范本
- 《思想道德修養(yǎng)與法律基礎》說課(獲獎版)課件
- 幼兒園中班居家安全教案
- 網(wǎng)頁設計和制作說課稿市公開課金獎市賽課一等獎課件
- 《新媒體營銷》新媒體營銷與運營
- 食用油營銷整合規(guī)劃(含文字方案)
- 蘇教版科學五年級下15《升旗的方法》教案
- 現(xiàn)代工業(yè)發(fā)酵調(diào)控緒論
- 超高性能混凝土項目立項申請(參考模板)
- 電纜橋架招標文件范本(含技術規(guī)范書)
- 試車場各種道路施工方案設計
- PS零基礎入門學習教程(適合純小白)PPT課件
評論
0/150
提交評論