![嵌入式軟件開(kāi)發(fā)簡(jiǎn)介以linux為例.ppt_第1頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2021-1/11/c0931ed0-2714-417f-9bea-b673347a6ec8/c0931ed0-2714-417f-9bea-b673347a6ec81.gif)
![嵌入式軟件開(kāi)發(fā)簡(jiǎn)介以linux為例.ppt_第2頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2021-1/11/c0931ed0-2714-417f-9bea-b673347a6ec8/c0931ed0-2714-417f-9bea-b673347a6ec82.gif)
![嵌入式軟件開(kāi)發(fā)簡(jiǎn)介以linux為例.ppt_第3頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2021-1/11/c0931ed0-2714-417f-9bea-b673347a6ec8/c0931ed0-2714-417f-9bea-b673347a6ec83.gif)
![嵌入式軟件開(kāi)發(fā)簡(jiǎn)介以linux為例.ppt_第4頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2021-1/11/c0931ed0-2714-417f-9bea-b673347a6ec8/c0931ed0-2714-417f-9bea-b673347a6ec84.gif)
![嵌入式軟件開(kāi)發(fā)簡(jiǎn)介以linux為例.ppt_第5頁(yè)](http://file1.renrendoc.com/fileroot_temp2/2021-1/11/c0931ed0-2714-417f-9bea-b673347a6ec8/c0931ed0-2714-417f-9bea-b673347a6ec85.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式軟件開(kāi)發(fā)簡(jiǎn)介以linux為例,a,2,2,課程安排,嵌入式Linux開(kāi)發(fā)環(huán)境搭建 嵌入式Linux概述 Linux快速入門(mén) 熟悉嵌入式開(kāi)發(fā)平臺(tái) 熟悉引導(dǎo)啟動(dòng)代碼和內(nèi)核的燒寫(xiě) NFS環(huán)境構(gòu)建,a,3,3,課程安排,嵌入式Linux下的應(yīng)用程序開(kāi)發(fā) 嵌入式Linux開(kāi)發(fā)工具與開(kāi)發(fā)流程 理解交叉編譯 嵌入式Linux下的應(yīng)用程序調(diào)試技巧 Make工程管理器,a,4,4,嵌入式系統(tǒng)的特點(diǎn),嵌入式系統(tǒng)低功耗、體積小,專(zhuān)用性強(qiáng)。嵌入式系統(tǒng)與PC機(jī)的最大不同就是嵌入式CPU大多工作在為特定用戶(hù)群設(shè)計(jì)的系統(tǒng)中,能夠把PC機(jī)中許多由板卡完成的任務(wù)集成在芯片內(nèi)部,從而有利于嵌入式系統(tǒng)設(shè)計(jì)趨于小型化。 為了提
2、高執(zhí)行速度和系統(tǒng)可靠性,嵌入式系統(tǒng)中的軟件一般都固化在存儲(chǔ)器芯片或單片機(jī)本身中,而不是存貯于磁盤(pán)等載體中。 嵌入式系統(tǒng)的硬件和軟件都必須高效率地設(shè)計(jì),系統(tǒng)要精簡(jiǎn)。操作系統(tǒng)一般和應(yīng)用軟件集成在一起。 對(duì)軟件代碼質(zhì)量要求很高。應(yīng)該盡最大可能避免死機(jī)的情況發(fā)生。 嵌入式系統(tǒng)開(kāi)發(fā)需要專(zhuān)門(mén)的開(kāi)發(fā)工具和開(kāi)發(fā)環(huán)境,a,5,5,如何選擇嵌入式CPU,ARM PowerPC MIPS Xscale DSP X86,a,6,6,典型的嵌入式操作系統(tǒng),Linux uC/OS Windows CE VxWorks Palm OS Symbian,a,7,7,嵌入式系統(tǒng)開(kāi)發(fā)流程,a,8,8,嵌入式系統(tǒng)開(kāi)發(fā)的內(nèi)容,a,9
3、,9,嵌入式Linux開(kāi)發(fā)模式,Linux,JTAG,CPU CORE,Flash,Target,Host,串口,網(wǎng)口,NFS模式,Root fs,a,10,10,Linux快速入門(mén),a,11,11,Linux簡(jiǎn)介,Linus Torvalds于1991編寫(xiě) Linux是一個(gè)Unix兼容的系統(tǒng),大部分通用的Unix工具和程序都可以在Linux系統(tǒng)下運(yùn)行。UNIX-堂兄 Linux表弟 使用GNU工具開(kāi)發(fā): gcc,glibc,binutils,make等 GNU = GNU is Not Unix GPL = General Public License,a,12,12,一些發(fā)行版,RedHa
4、t Fedora Core Suse Debian Ubuntu Cent OS Aisanux,a,13,13,認(rèn)識(shí)Linux內(nèi)核版本,主版本 1.02.0 2,3年更新 穩(wěn)定版 2.0.402.2.12 2.4.18 2.6.7 2.6.30 1,2月更新 穩(wěn)定版更新 1,2周更新,a,14,14,Linux體系結(jié)構(gòu),用戶(hù)空間,內(nèi)核空間,shell,命令、程序或shell腳本,文件 系統(tǒng),I/O,中斷 異常 處理,內(nèi)存 管理,Cache,調(diào)度,系統(tǒng)調(diào)用(system calls,內(nèi)核,a,15,15,內(nèi)核結(jié)構(gòu),a,16,16,Linux
5、優(yōu)點(diǎn),提供了先進(jìn)的網(wǎng)絡(luò)支持 多任務(wù)、多用戶(hù) 符合IEEE POSIX標(biāo)準(zhǔn) 核心能仿真FPU 支持?jǐn)?shù)十種文件系統(tǒng)格式 完全運(yùn)行于保護(hù)模式 開(kāi)放源代碼 采用先進(jìn)的內(nèi)存管理機(jī)制,更加有效地利用物理內(nèi)存,a,17,17,Linux分區(qū),Linux分區(qū)的形式 Swap分區(qū) 根分區(qū)/ Boot分區(qū) 其他,a,18,18,Linux的基本命令,Shell命令行使用技巧 :Tab自動(dòng)補(bǔ)齊、 ctrl+a+e等 cd:轉(zhuǎn)換目錄 ls:列出文件名(根目錄瀏覽) ll:查看文件屬性(文件屬性與權(quán)限 ) cp:復(fù)制文件(cp /mnt/hgfs/share/*.* /root/) mv:移動(dòng)文件(可用于文件或目錄的改
6、名) rm:刪除文件(rm rf (目標(biāo))) mkdir:創(chuàng)建目錄 rmdir:刪除目錄,a,19,19,Linux的基本命令(2,cat:顯示文本文件 less/more:分屏顯示文件 grep:查找字符串(ls all | grep *) head:顯示文件開(kāi)頭 tail:顯示文件結(jié)尾 sort:按次序顯示文件 uniq:去掉文件中重復(fù)的行 diff:比較兩個(gè)文件 file:測(cè)試文件內(nèi)容,a,20,20,Linux的基本命令(3,echo:顯示文本 date:顯示時(shí)間和日期 gzip:壓縮文件 gunzip:解壓縮文件 bzip2:壓縮文件 tar:打包和解包文件 whereis:查找命令
7、 which:查找實(shí)用程序,a,21,21,Linux的基本命令(4,ps:列出進(jìn)程 df :檢查文件系統(tǒng)空間占用情況 du:顯示磁盤(pán)空間的使用情況 kill:殺死進(jìn)程 chmod :改變文件或目錄的訪問(wèn)權(quán)限 chown:改變文件或目錄的屬主和組 chgrp:改變文件或目錄所屬的組 info:獲得幫助,a,22,22,Linux的基本命令(5,pwd:顯示當(dāng)前工作目錄的絕對(duì)路徑 rpm:文件包管理 clear:清屏 ln:創(chuàng)建文件鏈接 who:列出系統(tǒng)上的用戶(hù)名單 write:發(fā)送消息 talk:與其他用戶(hù)通信 man:獲取幫助,a,23,23,熟悉嵌入式開(kāi)發(fā)平臺(tái) 熟悉引導(dǎo)啟動(dòng)代碼和內(nèi)核的燒寫(xiě)
8、,a,24,24,需要熟悉的內(nèi)容,開(kāi)發(fā)板硬件基本配置 開(kāi)發(fā)板與PC機(jī)連接方式 PC機(jī)相關(guān)配置 熟悉bootloader的使用 深入理解開(kāi)發(fā)內(nèi)容 鞏固開(kāi)發(fā)流程,a,25,25,Bootloader燒寫(xiě)示范,Linux環(huán)境(虛擬機(jī))簡(jiǎn)介 超級(jí)終端和DNW的配置 Bootloader的顯示信息簡(jiǎn)介(標(biāo)準(zhǔn)BIOS) 內(nèi)核、文件系統(tǒng)的演示,a,26,26,嵌入式Linux下的應(yīng)用程序開(kāi)發(fā),a,27,27,開(kāi)發(fā)工具-編輯器vi,vi的基本使用方法,輸入模式,命令模式,a,28,28,vi-開(kāi)始編輯,新增 (append)- a 從 光 標(biāo) 所 在 位 置 後 面 開(kāi) 始 新 增 資 料, 光 標(biāo) 後 的
9、資 料 隨 新 增 資 料 向 後 移 動(dòng)。- A 從 光 標(biāo) 所 在 列 最 後 面 的 地 方 開(kāi) 始 新 增 資 料。 插 入 (insert) - i 從 光 標(biāo) 所 在 位 置 前 面 開(kāi) 始 插 入 資 料, 光 標(biāo) 後 的 資 料 隨 新 增 資 料 向 後 移 動(dòng)。- I 從 光 標(biāo)列 的 第 一 個(gè) 非 空 白 字 符 前 面 開(kāi) 始 插 入 資 料。 開(kāi) 始 (open)- o 在 光 標(biāo) 所 在 列 下 新 增 一 列 并 進(jìn) 入 輸 入 模 式。- O 在 光 標(biāo) 所 在 列 上 方 新 增 一 列 并 進(jìn) 入 輸 入 模 式,a,29,29,vi-刪除與修改,x 刪除
10、光標(biāo)所在字符。 dd 刪除光標(biāo)所在的列。 r 修改光標(biāo)所在字符,r後接著要修正的字符 R進(jìn)入取代狀態(tài),新增資料會(huì)覆改原先資料, 直到按ESC回到指令模式下為止。 s 刪除光標(biāo)所在字符,并進(jìn)入輸入模式。 S 刪除光標(biāo)所在的列,并進(jìn)入輸入模式,a,30,30,vi-退出命令,不保存退出 不保存強(qiáng)制性退出 保存編輯 存入文件filename 中 強(qiáng)制性存入文件filename 中 ()保存并退出(shift+zz,a,31,31,vi-光標(biāo)移動(dòng)命令,移動(dòng)到當(dāng)前單詞的開(kāi)始 移動(dòng)到當(dāng)前單詞的結(jié)尾 向前移動(dòng)一個(gè)單詞 向前移動(dòng)一個(gè)字符 向上移動(dòng)一行 向下移動(dòng)一行 向后移動(dòng)一個(gè)字符,a,32,32,vi-改變
11、與替換操作命令,替換光標(biāo)所在的字符 替換字符序列 替換一個(gè)單詞 同 替換光標(biāo)所在的前一字符 替換自光標(biāo)位置至行尾的所有字符 同 替換當(dāng)前行,a,33,33,vi-拷貝與粘貼命令,將光標(biāo)所在單詞拷入剪貼板 將光標(biāo)至行尾的字符拷入剪貼板 同 將當(dāng)前行拷入剪貼板 將剪貼板中的內(nèi)容粘貼在光標(biāo)后 將剪貼板中的內(nèi)容粘貼在光標(biāo)前,利用Vi編寫(xiě)一個(gè)helloworld程序,a,34,34,a,35,35,開(kāi)發(fā)工具 -編譯器GCC,全稱(chēng)為GNU CC ,GNU項(xiàng)目中符合ANSI C標(biāo)準(zhǔn)的編譯系統(tǒng) 編譯如C、C+、Object C、Java、Fortran、Pascal、Modula-3和Ada等多種語(yǔ)言 一個(gè)交
12、叉平臺(tái)編譯器 ,適合在嵌入式領(lǐng)域的開(kāi)發(fā)編譯,a,36,36,GCC編譯器,GNU Compiler Collection C, C+, Objective-C, Fortran, Java, Ada ,GCC 4.2.2,GCC 2.95,July 31, 1999,GCC 3.0,June 18, 2001,GCC 3.2,August 14, 2002,GCC 3.3,May 13, 2003,Oct 9, 2007,December 3, 1997,a,37,37,GCC簡(jiǎn)介,gcc所支持后綴名解釋 .cC原始程序 .C/.cc/.cxxC+原始程序 .
13、mObjective-C原始程序 .i已經(jīng)過(guò)預(yù)處理的C原始程序 .ii已經(jīng)過(guò)預(yù)處理的C+原始程序 .s/.S 匯編語(yǔ)言原始程序 .h預(yù)處理文件(頭文件) .o目標(biāo)文件 .a/.so編譯后的庫(kù)文件,a,38,38,編譯器的作用,Gcc的編譯流程分為四個(gè)步驟 預(yù)處理(Pre-Processing) 編譯(Compiling) 匯編(Assembling) 鏈接(Linking,a,39,39,hello”的演變歷程,a,40,40,理解交叉編譯及環(huán)境建立,a,41,41,GCC 交叉編譯器,GNU Binutils GNU Binutils 的主要工具有兩個(gè),一個(gè)是連接程序ld,另外一個(gè)是匯編程序
14、as。其主要目的是為GNU 系統(tǒng),提供匯編和連接工具。 GNU GCC GNU GCC 就是上面提到的GCC,GCC 主要是為GNU 系統(tǒng)提供C 編譯器。現(xiàn)在支持多種語(yǔ)言,這其中包括C/C+、Fortran、Java、Objective-C、甚至還有Ada。 GNU GLibc 用于定義系統(tǒng)調(diào)用和其它一些基本的函數(shù)調(diào)用,a,42,42,GCC交叉編譯器的生成,第1步,取得Binutils、GCC、Glibc 源碼。 第2步,配置并編譯Binutils 取得我們所需要的匯編和連接程序。 第3步,配置并編譯GCC 源碼生成GCC 編譯器。一般是C 編譯器首先生成,然后以這個(gè)為基礎(chǔ)在結(jié)合下一步生成的
15、Glibc 的C 函數(shù)庫(kù),再編譯生成其它編譯器。 第4步,配置Glibc 并編譯生成Glibc 的C 函數(shù)庫(kù)。 第5步,再次配置和編譯GCC 源碼,生成其它語(yǔ)言的編譯器,如C+編譯器等,a,43,43,工具鏈代碼結(jié)構(gòu),a,44,44,TARGET常用的值,a,45,45,交叉編譯流程,a,46,crosstool介紹,crosstool是由Dan Kegel開(kāi)發(fā)的一套腳本程序,可以自動(dòng)編譯不同版本的gcc、glibc,并做出測(cè)試。 在crosstool軟件包中,提供了從互聯(lián)網(wǎng)下載軟件包的腳本,例如glibc-get.sh腳本可以下載glibc軟件包。 有關(guān)crosstool的詳細(xì)信息,讀者可以
16、訪問(wèn)其官方網(wǎng)站和其他一些網(wǎng)絡(luò)資源: http:/ http:/ /doc/debian-policy,46,,a,47,47,環(huán)境變量,Linux環(huán)境變量PATH 有關(guān)配置文件 etc/profile .bashrc,a,48,48,設(shè)置交叉編譯器的環(huán)境變量,etc/profile文件中的PATH定義了找存放命令的路徑,若把交叉編譯器的路徑在PATH中進(jìn)行定義,則執(zhí)行命令時(shí)就可以找到對(duì)應(yīng)的命令。 示例:使用2.95.3版本的交叉編譯器 將usr/local/arm/2.95.3/bin路徑添加到etc/profile文件中,并
17、用將原來(lái)的3.4.4的屏蔽(如果有的話(huà)),然后在etc路徑下執(zhí)行source profile。然后arm-linux-gcc v,如果顯示是2.9.53。則說(shuō)明環(huán)境配置成功。 更改環(huán)境變量有幾種方法,其中之一是更改etc/profile文件(開(kāi)機(jī)啟動(dòng)時(shí)配置)中的PATH,將相沖突的屏蔽掉。 另一種方法是重新定義PATH,然后用export導(dǎo)出(export命令可以修改,但重啟之后?):可編輯/etc/bashrc文件,在最后增加路徑 export PATH=/usr/local/arm/2.95.3/bin:|$PATH,則以后編譯內(nèi)核或其它程序均可用arm-linux- 來(lái)制定交叉編譯器,a
18、,49,49,嵌入式Linux下的 應(yīng)用程序調(diào)試技巧,a,50,50,調(diào)試器-Gdb調(diào)試流程,首先使用gcc對(duì)test.c進(jìn)行編譯,注意一定要加上選項(xiàng)-g # gcc -g test.c -o test # gdb test GNU gdb Red Hat Linux (-1.21rh) Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/
19、or distribute copies of it under certain conditions. Type show copying to see the conditions. There is absolutely no warranty for GDB. Type show warranty for details. This GDB was configured as i386-redhat-linux-gnu.Using host libthread_db library /lib/libthread_db.so.1. (gdb,a,51,51,Gdb調(diào)試流程,查看文件 (g
20、db) l 設(shè)置斷點(diǎn) (gdb) b 6 查看斷點(diǎn)情況 (gdb) info b 運(yùn)行代碼 (gdb) r,查看變量值 (gdb) p n 單步運(yùn)行 (gdb) n (gdb) s 恢復(fù)程序運(yùn)行 (gdb) c 幫助 (gdb) help command,a,52,52,Gdb的使用切記點(diǎn),在Gcc編譯選項(xiàng)中一定要加入-g。 只有在代碼處于“運(yùn)行”或“暫?!睜顟B(tài)時(shí)才能查看變量值。 設(shè)置斷點(diǎn)后程序在指定行之前停止,a,53,53,Gdb調(diào)試,運(yùn)行被調(diào)試程序,設(shè)置所有的能影響該程序的參數(shù)和變量。 保證被調(diào)試程序在指定的條件下停止運(yùn)行。 當(dāng)被調(diào)試程序停止時(shí),讓開(kāi)發(fā)工程師檢查發(fā)生了什么。 根據(jù)每次調(diào)試
21、器的提示信息來(lái)做響應(yīng)的改變,以便修正某個(gè)錯(cuò)誤引起的問(wèn)題,a,54,54,嵌入式程序調(diào)試-NFS,熟悉Uboot的燒寫(xiě)方法和使用 按照實(shí)驗(yàn)指導(dǎo)配置tftp服務(wù) 按照實(shí)驗(yàn)指導(dǎo)配置NFS服務(wù) 利用NFS調(diào)試經(jīng)交叉編譯后的程序,a,55,55,Makefile簡(jiǎn)介,a,56,56,工程管理器-Make,工程管理器,顧名思義,是指管理較多的文件 Make工程管理器也就是個(gè)“自動(dòng)編譯管理器”,這里的“自動(dòng)”是指它能構(gòu)根據(jù)文件時(shí)間戳自動(dòng)發(fā)現(xiàn)更新過(guò)的文件而減少編譯的工作量,同時(shí),它通過(guò)讀入Makefile文件文件的內(nèi)容來(lái)執(zhí)行大量的編譯工作 Make將只編譯改動(dòng)的代碼文件,而不用完全編譯,a,57,57,Mak
22、efile基本結(jié)構(gòu),Makefile是Make讀入的唯一配置文件 由make工具創(chuàng)建的目標(biāo)體(target),通常是目標(biāo)文件或可執(zhí)行文件 要?jiǎng)?chuàng)建的目標(biāo)體所依賴(lài)的文件(dependency_file) 創(chuàng)建每個(gè)目標(biāo)體時(shí)需要運(yùn)行的命令(command) Makefile格式 target: dependency_files command 例子 hello.o: hello.c hello.h gcc c hello.c o hello.o,a,58,58,Makefile規(guī)則,隱式規(guī)則 隱含規(guī)則能夠告訴make怎樣使用傳統(tǒng)的技術(shù)完成任務(wù),這樣,當(dāng)用戶(hù)使用它們時(shí)就不必詳細(xì)指定編譯的具體細(xì)節(jié),而只需
23、把目標(biāo)文件列出即可 C編譯:.c變?yōu)?o $(CC) c $(CPPFLAGS) $(CFLAGS) C+編譯:.cc或.C變?yōu)?o $(CXX) -c $(CPPFLAGS) $(CXXFLAGS,a,59,59,Makefile規(guī)則,模式規(guī)則 模式規(guī)則是用來(lái)定義相同處理規(guī)則的多個(gè)文件的。它不同于隱式規(guī)則,隱式規(guī)則僅僅能夠用make默認(rèn)的變量來(lái)進(jìn)行操作,而模式規(guī)則還能引入用戶(hù)自定義變量,為多個(gè)文件建立相同的規(guī)則,從而簡(jiǎn)化了Makefile的編寫(xiě) 模式規(guī)則的格式類(lèi)似于普通規(guī)則,這個(gè)規(guī)則中的相關(guān)文件前必須用“%”標(biāo)明,a,60,60,Make使用,直接運(yùn)行make 選項(xiàng) -C dir讀入指定目錄
24、下的Makefile-f file讀入當(dāng)前目錄下的file文件作為Makefile -i忽略所有的命令執(zhí)行錯(cuò)誤 -I dir指定被包含的Makefile所在目錄 -n只打印要執(zhí)行的命令,但不執(zhí)行這些命令 -p顯示make變量數(shù)據(jù)庫(kù)和隱含規(guī)則 -s在執(zhí)行命令時(shí)不顯示命令 -w如果make在執(zhí)行過(guò)程中改變目錄,打印當(dāng)前目錄名,a,61,61,Autotools簡(jiǎn)介,對(duì)于一個(gè)較大的項(xiàng)目而言編寫(xiě)Makefile難度較大 autotools系列工具只需用戶(hù)輸入簡(jiǎn)單的目標(biāo)文件、依賴(lài)文件、文件目錄等就可以輕松地生成Makefile autotools工具還可以完成系統(tǒng)配置信息的收集,從而可以方便地處理各種移
25、植性的問(wèn)題 Linux上的軟件開(kāi)發(fā)一般都用autotools來(lái)制作Makefile,a,62,62,autotools使用流程,a,63,63,使用Makefile,make 鍵入make默認(rèn)執(zhí)行make all命令,即目標(biāo)體為all make install 把該程序安裝到系統(tǒng)目錄中去 make clean 清除之前所編譯的可執(zhí)行文件及目標(biāo)文件(object file, *.o) make dist 將程序和相關(guān)的文檔打包為一個(gè)壓縮文檔以供發(fā)布,a,64,Shell腳本簡(jiǎn)介,a,65,Shell腳本的本質(zhì),編譯型語(yǔ)言 解釋型語(yǔ)言 Shell腳本語(yǔ)言是解釋型語(yǔ)言 Shell腳本的本質(zhì): She
26、ll命令的有序集合,a,66,shell 編程的基本過(guò)程,基本過(guò)程分為三步,Step1. 建立 shell 文件 包含任意多行操作系統(tǒng)命令或shell命令的文本文件,Step2. 賦予shell文件執(zhí)行權(quán)限 用chmod命令修改權(quán)限,Step3. 執(zhí)行shell文件 直接在命令行上調(diào)用shell程序,a,67,Step1: 建立shell文件 (可用任何建立文本文件的方法) $ cat prog1 who | grep $1,Step2: 賦予執(zhí)行權(quán)限: (初始文本文件無(wú)執(zhí)行權(quán)限) $ chmod 740 prog1,Step3: 執(zhí)行該shell程序 $ prog1 wdl prog1: n
27、ot found (shell在標(biāo)準(zhǔn)搜索目錄中找不到prog1命令,Step4: 指定路徑或修改環(huán)境變量PATH后執(zhí)行shell程序 $ ./prog1 wdl wdl tty06 Feb 8 09:12,實(shí)例,a,68,Shell變量,Shell允許用戶(hù)建立變量存儲(chǔ)數(shù)據(jù),但不支持?jǐn)?shù)據(jù)類(lèi)型(整型、字符、浮點(diǎn)型),將任何賦給變量的值都解釋為一串字符 Variable=value 命名規(guī)則同C+中的命名規(guī)則 count=1 Echo $count DATE=date Echo $DATE,a,69,shell變量,Bourne Shell主要有如下三種變量: 用戶(hù)自定義變量 位置變量即 shell
28、 script之參數(shù) 環(huán)境變量,a,70,用戶(hù)自定義變量,在shell編程中通常使用全大寫(xiě)變量,方便識(shí)別 $ COUNT=1 變量的調(diào)用:在變量前加$ $ echo $HOME Linux Shell/bash從右向左賦值 $Y=y $ X=$Y $ echo $X y 使用unset命令刪除變量的賦值 $ Z=hello $ echo $Z hello $ unset Z $ echo $Z,a,71,位置變量,0 與鍵入的命令行一樣,包含腳本文件名 $1,$2,$9 分別包含第一個(gè)到第九個(gè)命令行參數(shù) $# 包含命令行參數(shù)的個(gè)數(shù) $ 包含所有命令行參數(shù):“$1,$2,$9” $? 包含前一個(gè)
29、命令的退出狀態(tài) $* 包含所有命令行參數(shù):“$1,$2,$9” $ 包含正在執(zhí)行進(jìn)程的ID號(hào),a,72,shell環(huán)境變量,CDPATH:用于cd命令的查找路徑 HOME: /etc/passwd文件中列出的用戶(hù)主目錄 IFS:Internal Field Separator,默認(rèn)為空格,tab及換行符 MAIL:/var/mail/$USERNAME mail等程序使用 PATH :路徑 PS1,PS2:默認(rèn)提示符($)及換行提示符() TERM:終端類(lèi)型,常用的有vt100,ansi,vt200,xterm等,a,73,文件測(cè)試,d name 測(cè)試name 是否為一個(gè)目錄 -f name
30、測(cè)試name 是否為普通文件 -L name測(cè)試name 是否為符號(hào)鏈接 -r name 測(cè)試name 文件是否存在且為可讀 -w name 測(cè)試name 文件是否存在且為可寫(xiě) -x name 測(cè)試name 文件是否存在且為可執(zhí)行 -s name 測(cè)試name 文件是否存在且其長(zhǎng)度不為0 f1 -nt f2 測(cè)試f1 是否比f(wàn)2 更新 f1 -ot f2 測(cè)試f1 是否比f(wàn)2 更舊,a,74,ifthenfi 語(yǔ)法結(jié)構(gòu): if 表達(dá)式 then 命令表 fi 如果表達(dá)式為真, 則執(zhí)行命令表中的命令; 否則退出if語(yǔ)句, 即執(zhí)行fi后面的語(yǔ)句. if和fi是條件語(yǔ)句的語(yǔ)句括號(hào), 必須成對(duì)使用;命
31、令表中的命令可以是一條, 也可以是若干條,條件語(yǔ)句,a,75,caseesac 多路分支語(yǔ)句case用于多重條件測(cè)試, 語(yǔ)法結(jié)構(gòu)清晰自然. 其語(yǔ)法結(jié)構(gòu)為: case 字符串變量 in 模式1) 命令表1 ; 模式2) 命令表2 ; 模式n) 命令表n ; esac,case語(yǔ)句只能檢測(cè)字符串變量,各模式中可用文件名元字符,以右括號(hào)結(jié)束,命令表以單獨(dú)的雙分號(hào)行結(jié)束,退出case語(yǔ)句,模式 n常寫(xiě)為字符* 表示所有其它模式,最后一個(gè)雙分號(hào)行可以省略,多路分支語(yǔ)句,a,76,fordodone 當(dāng)循環(huán)次數(shù)已知或確定時(shí), 使用for循環(huán)語(yǔ)句來(lái)多次執(zhí)行一條或一組命令。 循環(huán)體由語(yǔ)句括號(hào)do和done來(lái)限
32、定。格式為: for 變量名 in 單詞表 do 命令表 done 變量依次取單詞表中的各個(gè)單詞, 每取一次單詞, 就執(zhí)行一次循環(huán)體中的命令. 循環(huán)次數(shù)由單詞表中的單詞數(shù)確定. 命令表中的命令可以是一條, 也可以是由分號(hào)或換行符分開(kāi)的多條。 如果單詞表是命令行上的所有位置參數(shù)時(shí), 可以在for語(yǔ)句中省略 “in 單詞表” 部分,循環(huán)語(yǔ)句,a,77,whiledodone 語(yǔ)法結(jié)構(gòu)為: while 命令或表達(dá)式 do 命令表 done while語(yǔ)句首先測(cè)試其后的命令或表達(dá)式的值,如果為真,就執(zhí)行一次循環(huán)體中的命令,然后再測(cè)試該命令或表達(dá)式的值,執(zhí)行循環(huán)體,直到該命令或表達(dá)式為假時(shí)退出循環(huán)。 w
33、hile語(yǔ)句的退出狀態(tài)為命令表中被執(zhí)行的最后一條命令的退出狀態(tài),循環(huán)語(yǔ)句,a,78,78,實(shí)驗(yàn)內(nèi)容,熟悉開(kāi)發(fā)環(huán)境的搭建 熟悉BIOS、Uboot的使用,NFS的配置 編寫(xiě)簡(jiǎn)單的C程序 使用GDB調(diào)試有問(wèn)題的C代碼 編寫(xiě)簡(jiǎn)單的Makefile 編寫(xiě)簡(jiǎn)單的SHELL腳步,Bootloader,a,80,,80,內(nèi)容提綱,a,81,什么是Bootloader,Bootloader是硬件啟動(dòng)的引導(dǎo)程序,是啟動(dòng)操作系統(tǒng)的根本; 是在操作系統(tǒng)內(nèi)核或用戶(hù)應(yīng)用程序運(yùn)行之前運(yùn)行的一段小程序。通過(guò)這段小程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的
34、狀態(tài),以便為最終調(diào)用準(zhǔn)備好環(huán)境; 在一般典型的系統(tǒng)中,整個(gè)系統(tǒng)的加載啟動(dòng)任務(wù)就完全由Bootloader來(lái)完成,,81,a,82,Bootloader不屬于操作系統(tǒng)內(nèi)核,采用匯編語(yǔ)言編寫(xiě),因此針對(duì)不同的CPU體系結(jié)構(gòu),這一部分代碼不具有可移植性; 在移植操作系統(tǒng)時(shí),這部分代碼必須加以改寫(xiě)。 Bootloader不但依賴(lài)于CPU的體系結(jié)構(gòu),而且依賴(lài)于嵌入式系統(tǒng)板級(jí)設(shè)備的配置,Bootloader的特點(diǎn),a,83,啟動(dòng)加載模式:在這種模式下,Bootloader從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個(gè)過(guò)程并沒(méi)有用戶(hù)的介入。 下載模式:在這種模式下
35、,目標(biāo)機(jī)上的Bootloader將通過(guò)串口或網(wǎng)絡(luò)等通信手段從開(kāi)發(fā)主機(jī)(Host)上下載內(nèi)核映像和根文件系統(tǒng)映像等到RAM中。然后可以再被 Bootloader寫(xiě)到目標(biāo)機(jī)上的固態(tài)存儲(chǔ)媒質(zhì)中,或者直接進(jìn)行系統(tǒng)的引導(dǎo),Bootloader的操作模式,a,84,初始化硬件 將操作系統(tǒng)內(nèi)核從Flash拷貝到SDRAM中,如果是壓縮格式的內(nèi)核,還要解壓縮 改寫(xiě)系統(tǒng)的內(nèi)存映射,原先Flash起始地址映射為0地址,這時(shí)需要將RAM的起始地址映射為0 提供Linux內(nèi)核的啟動(dòng)參數(shù) 啟動(dòng)Linux內(nèi)核 設(shè)置堆棧指針并將bss段清零將來(lái)執(zhí)行C語(yǔ)言程序和調(diào)用子函數(shù)時(shí)要用到 改變pc值,使得CPU開(kāi)始執(zhí)行真正的操作系統(tǒng)
36、內(nèi)核,Bootloader的特征,a,85,Bootloader的啟動(dòng),系統(tǒng)加電或復(fù)位后,所有CPU都會(huì)從某個(gè)地址開(kāi)始執(zhí)行 嵌入式系統(tǒng)的開(kāi)發(fā)板都要把板上ROM或FLASH映射到這個(gè)地址。因此,必須把Bootloader程序存儲(chǔ)在相應(yīng)的FLASH位置。系統(tǒng)加電后,CPU將首先執(zhí)行它,,85,a,86,屏蔽所有的中斷。為中斷提供服務(wù)通常是 OS 設(shè)備驅(qū)動(dòng)程序的責(zé)任,因此在 Boot Loader 的執(zhí)行全過(guò)程中可以不必響應(yīng)任何中斷 設(shè)置 CPU 的速度和時(shí)鐘頻率 RAM 初始化。包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器以及各內(nèi)存庫(kù)控制寄存器等 初始化 LED。其目的是
37、表明系統(tǒng)的狀態(tài)。如果板子上沒(méi)有 LED,可以通過(guò)初始化 UART 向串口打印 Bootloader 的 Logo 字符信息來(lái)完成這一點(diǎn) 關(guān)閉CPU內(nèi)部I/D cache 為加載 stage2 準(zhǔn)備 RAM 空間,跳轉(zhuǎn)到 stage2的C入口點(diǎn),Bootloader的第一階段,a,87,初始化本階段要使用到的硬件設(shè)備; 檢測(cè)系統(tǒng)內(nèi)存映射; 將內(nèi)核映像和根文件系統(tǒng)映像從Flash讀到RAM; 為內(nèi)核設(shè)置啟動(dòng)參數(shù); 調(diào)用內(nèi)核,Bootloader的第二階段,a,88,一些bootloader介紹,a,89,Configuration file /boot/grub/menu.lst /boot/gr
38、ub/grub.conf default=0 timeout=10 splashimage=(hd0,1)/boot/grub/splash.xpm.gz title MicroSoft Windows XP rootnoverify (hd0,0) chainloader +1 title Red Hat Linux (2.4.20-8) root (hd0,1) kernel /boot/vmlinuz-2.4.20-8 ro root=LABEL=/ initrd /boot/initrd-2.4.20-8.img,配置GRUB,a,90,U-Boot是ARM bootloader標(biāo)準(zhǔn)
39、armboot 加入到 ppcboot 形成了 u-boot 支持arm720, arm920, arm926, sa1100, xscale http:/ Blob blob是LART工程使用的bootloader 移植到多個(gè)ARM平臺(tái)上 http:/www.lart.tudelft.nl/lartware/blob Redboot,ARM Bootloaders,a,91,FS2410開(kāi)發(fā)板提供的BIOS,,91,a,92,DRAM控制器,DRAM芯片不能向其它微處理器總線(xiàn)資源那樣直接讀寫(xiě),它們需要特殊的硬件控制器使能讀寫(xiě)循環(huán)。 設(shè)置DRAM控制器需要詳細(xì)了解D
40、RAM體系結(jié)構(gòu)、控制器本身、 DRAM芯片使用的規(guī)范和全面的硬件設(shè)計(jì)。 Bootloader首先要完成的就是使能內(nèi)存子系統(tǒng)。初始化內(nèi)存以后,內(nèi)存可以作為一種資源進(jìn)行使用,,92,a,93,,93,內(nèi)容提綱,a,94,u-boot(Universal Boot Loader)是德國(guó)DENX小組的開(kāi)發(fā)用于多種嵌入式CPU的bootloader程序。遵循GPL條款; 從FADSROM、8xxROM 、PPCBOOT逐步發(fā)展演化而來(lái); 當(dāng)前版本號(hào):見(jiàn)include/version.h中的定義,U-boot介紹,a,95,平臺(tái)相關(guān) board, c
41、pu, lib_ppc, lib_arm, include 平臺(tái)無(wú)關(guān) common, net, fs, drivers 工具和文檔 tools, doc,U-Boot程序結(jié)構(gòu),a,96,U-Boot程序結(jié)構(gòu),a,97,U-Boot程序結(jié)構(gòu),a,98,在 Flash 中運(yùn)行匯編程序,將 Flash 中的啟動(dòng)代碼部分復(fù)制到 SDRAM 中,同時(shí)創(chuàng)造環(huán)境準(zhǔn)備運(yùn)行 C 程序; 在 SDRAM 中執(zhí)行,對(duì)硬件進(jìn)行初始化; 設(shè)置內(nèi)核參數(shù)的標(biāo)記列表,復(fù)制鏡像文件,進(jìn)入內(nèi)核的入口函數(shù),U-Boot 啟動(dòng)過(guò)程的幾個(gè)階段,a,99,99,初始化硬件 設(shè)置UART 設(shè)置網(wǎng)口 設(shè)置USB 檢測(cè)存儲(chǔ)器 設(shè)置啟動(dòng)參數(shù) 內(nèi)
42、核硬件信息 波特率 跳轉(zhuǎn)到Linux內(nèi)核的首地址 消亡,BootLoader的生命周期,a,100,設(shè)置異常的入口地址和異常處理函數(shù); 配置 PLLCON 寄存器,確定系統(tǒng)的主頻; 屏蔽看門(mén)狗和中斷;初始化 I/O 寄存器; 關(guān)閉 MMU 功能; 調(diào)用 /board/smdk2410 中的lowlevel_init.S ,初始化存儲(chǔ)器空間,設(shè)置刷新頻率; 將 U-Boot 的內(nèi)容復(fù)制到 SDRAM 中; 設(shè)置堆棧的大?。?ldr pc, _start_armboot ) ; 設(shè)置程序編譯連接的起始地址( config.mk: TEXT_BASE = 0 x33F80000,U-Boot入口函數(shù)
43、start.S,a,101,系統(tǒng)復(fù)位代碼 ldr pc, _start_armboot _start_armboot: .word start_armboot 表示u-boot完成cpu初始化,將跳轉(zhuǎn)到C程序中間。 start_armboot完成設(shè)備初始化過(guò)程,進(jìn)入main_loop循環(huán)。 start_armboot - lib_arm/board.c,cpu/arm920t/start.S,a,102,mrsr0,cpsr bicr0,r0,#0 x1f ; 位清零 orrr0,r0,#0 xd3 ; 邏輯或0 xd3= 1101 0011 msrcpsr,r0,復(fù)位,a,103,模式位含義
44、,a,104,ldr r0, =pWTCON mov r1, #0 x0 str r1, r0,關(guān)閉看門(mén)狗,a,105,movr1, #0 xffffffff ldrr0, =INTMR strr1, r0,關(guān)閉中斷,a,106,movr0, #0 mcrp15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ mcrp15, 0, r0, c8, c7, 0 /* flush v4 TLB *,刷新指令/數(shù)據(jù)緩存,a,107,mrcp15, 0, r0, c1, c0, 0 bicr0, r0, #0 x00002300 clear bits 13, 9:8
45、 (-V- -RS) bicr0, r0, #0 x00000087 clear bits 7, 2:0 (B- -CAM orrr0, r0, #0 x00000002 set bit 2 (A) Align orrr0, r0, #0 x00001000 set bit 12 (I) I-Cache mcrp15, 0, r0, c1, c0, 0,禁用MMU和緩存,a,108,板級(jí)相關(guān),/board/lowlevel_init.S movip, lr bllowlevel_init movlr, ip movpc, lr,設(shè)置RAM,a,109,globl lowlevel_initlo
46、wlevel_init: ldr r0, =SMRDATA ldrr1, _TEXT_BASE subr0, r0, r1 ldrr1, =BWSCON add r2, r0, #13*40: ldr r3, r0, #4 str r3, r1, #4 cmp r2, r0 bne 0b,lowlevel_init,a,110,調(diào)試u-boot時(shí),開(kāi)始一般是讓它在RAM中運(yùn)行,當(dāng)RAM運(yùn)行通過(guò)后才將其固化到FLASH中;這樣如果我們當(dāng)前的代碼是通過(guò)BDI2000等Load到內(nèi)存直接運(yùn)行的話(huà),u-boot就不需要去將自己從Flash搬移到內(nèi)存了;而如果u-boot是固化在Flash中在CPU復(fù)位
47、后由第一個(gè)片選信號(hào)指向開(kāi)始執(zhí)行的話(huà),則有一個(gè)從Flash搬移到內(nèi)存的過(guò)程,重定位(Relocate)的概念,a,111,relocate:/* relocate U-Boot to RAM */ adrr0, _start/*當(dāng)前代碼的地址信息 */ ldrr1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* dont reloc during debug */ beq stack_setup ldrr2, _armboot_start ldrr3, _armboot_end subr2, r3, r2/* r2
48、 - size of armboot */ addr2, r0, r2/* r2 - source end address */ copy_loop: ldmiar0!, r3-r10/* copy from source address r0 */ stmiar1!, r3-r10/* copy to target address r1 */ cmpr0, r2/* until source end addreee r2 */ blecopy_loop,重定位的實(shí)現(xiàn),a,112,lib_arm/board.c void start_armboot (void) size = flash_in
49、it (); display_flash_config (size); for (;) main_loop ();,start_armboot,a,113,系統(tǒng)調(diào)用 memcpy() 函數(shù)將內(nèi)核從 flash 和 ramdisk 復(fù)制到 SDRAM 中,具體如下: memcpy(void *)0 x30008000, (void *)0 x40000, 0 x100000) ; / 復(fù)制數(shù)據(jù)塊 memcpy(void *)0 x30800000, (void *)0 x140000, 0 x440000) ; / 復(fù)制數(shù)據(jù)塊,調(diào)用內(nèi)核啟動(dòng)函數(shù) do_bootm_linux(,0 x300080
50、00 是內(nèi)核在 SDRAM 中的起始地址 0 x40000 是內(nèi)核在 Flash 中的位置 0 x100000 是數(shù)據(jù)塊的大小,a,114,編譯U-boot,U-boot的源碼是通過(guò)gcc和Makefile組織編譯的。頂層目錄下的Makefile首先可以設(shè)置開(kāi)發(fā)板的定義,然后遞歸地調(diào)用各級(jí)子目錄下的Makefile,最后把編譯過(guò)的程序鏈接成u-boot映像。 頂層目錄下的Makefile 它負(fù)責(zé)u-boot整體配置編譯。每一種開(kāi)發(fā)板在Makefile都需要有板子配置的定義。 配置u-boot: make smdk2410_config 編譯: make,,114,a
51、,115,U-BOOT編譯生成的映像文件,,115,a,116,U-boot命令介紹,Printenv 打印環(huán)境變量。 Uboot printenvbaudrate=115200ipaddr=ethaddr=12:34:56:78:9A:BCserverip=,,116,a,117,U-boot命令介紹,setenv 設(shè)置新的變量 Uboot setenv myboard AT91RM9200DKUboot printenvbaudrate=115200ipaddr=eth
52、addr=12:34:56:78:9A:BCserverip=myboard=AT91RM9200DKEnvironment size: 102/8188 bytes saveenv 將當(dāng)前定義的所有的變量及其值存入flash中,,117,a,118,U-boot命令介紹,tftp 通過(guò)網(wǎng)絡(luò)下載程序 Uboot setenv ethaddr 12:34:56:78:9A:BCUboot setenv ipaddr Uboot setenv serverip 54Uboot tftp 20000000
53、application.bin Uboot tftp 30200000 zImage Loadb 通過(guò)串口Kermit協(xié)議下載二進(jìn)制數(shù)據(jù),,118,a,119,U-boot命令介紹,md 顯示內(nèi)存區(qū)的內(nèi)容。 mm 修改內(nèi)存,地址自動(dòng)遞增。 nm 修改內(nèi)存,地址不自動(dòng)遞增。 mw 填充內(nèi)存。 mtest 測(cè)試內(nèi)存。 cp 拷貝一塊內(nèi)存到另一塊。 cmp 比較兩塊內(nèi)存區(qū)。 mw 0 x32000000 ff 0 x10000,,119,a,120,U-boot命令介紹,Protect 寫(xiě)保護(hù)操作 protect on 1:0-3(就是對(duì)第一塊
54、FLASH的0-3扇區(qū)進(jìn)行保護(hù)) protect off 1:0-3取消寫(xiě)保護(hù) erase 擦除扇區(qū) erase: 刪除FLASH的扇區(qū) erase 1:0-2(就是對(duì)每一塊FLASH的0-2扇區(qū)進(jìn)行刪除,,120,a,121,U-boot命令介紹,run 執(zhí)行設(shè)置好的腳本 Uboot setenv flashit tftp 20000000 mycode.bin; erase 10020000 1002FFFF;cp.b 20000000 10020000 8000 Uboot saveenv Uboot run flashit bootcmd 保留的環(huán)境變量 如
55、果定義了該變量,在autoboot模式下,將會(huì)執(zhí)行該腳本的內(nèi)容,,121,a,122,U-boot命令介紹,go 執(zhí)行內(nèi)存中的二進(jìn)制代碼,一個(gè)簡(jiǎn)單的跳轉(zhuǎn)到指定地址 bootm 執(zhí)行內(nèi)存中的二進(jìn)制代碼 要求二進(jìn)制代碼為制定格式的。通常為mkimage處理過(guò)的二進(jìn)制文件。啟動(dòng)Uboot工具制作的壓縮Linux內(nèi)核 bootp 通過(guò)網(wǎng)絡(luò)啟動(dòng),需要提前設(shè)置好硬件地址,,122,a,123,U-boot命令介紹,usb reset 復(fù)位(rescan) USB 控制器 usb stop f - 停止USB usb tree - 顯示USB 設(shè)備樹(shù)
56、usb info dev 顯示可用的USB設(shè)備 usb storage - 顯示USB存儲(chǔ)設(shè)備詳細(xì)信息 usb dev dev - show or set current USB storage device usb part dev - print partition table of one or all USB storage devices usb read addr blk# cnt - read cnt blocks starting at block blk# to memory address addr,,123,a,124,U-boot命令介紹,n
57、and info: 顯示NAND 設(shè)備 nand device dev:顯示或設(shè)置當(dāng)前設(shè)備 nand bad 顯示壞塊 nand read.jffs2s addr off size nand write.jffs2 addr off size nand erase clean off size nand read.oob addr off size nand write.oob addr off size,,124,a,125,U-boot命令介紹,nfs nfs 32000000 :aa.txt 把中的NFS文件系統(tǒng)中的
58、aa.txt 讀入內(nèi)存0 x32000000處,,125,配置編譯LINUX內(nèi)核,a,127,內(nèi)容提綱,a,128, wget /pub/linux/kernel/. wget /././linux-*.bz2.sign gpg verify linux-2.xx.tar.bz2.sign tar jxvf linux-2.xx.tar.bz2,下載內(nèi)核,a,129,內(nèi)核配置與編譯,使用補(bǔ)丁升級(jí) 如果你有一個(gè)版本可以到下載相應(yīng)的升級(jí)補(bǔ)丁 如果想從2.4
59、.26 升級(jí)到 2.4.27 則可以 wget -c /pub/linux/kernel/v2.4/patch-2.4.27.bz2 wget /pub/linux/kernel/v2.4/patch-2.4.27.bz2.sign 如果想從 2.6.11 升級(jí)到 2 則可以 wget /pub/linux/kernel/v2.6/patch-2.bz2 wget /pub/linux/kernel/v2.6/patch-2.bz2.sign 確認(rèn)下載的補(bǔ)丁是否正確 gpg verify patch-2.4.27.bz2.sign 為內(nèi)核代碼打補(bǔ)丁 cd linux2.4.26/ bzcat ./patch-2.4.27.bz2 | patch -p1 cd . mv linux-2.4.26 linux-2.4.27,a,130,init kernel mm ipc lib fs net drivers,Linux內(nèi)核結(jié)構(gòu),arch,i386 arm ppc m68k sh,include,a,131,查看完整命令行 make V = 1 刪除生成的文件 make clea
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年超小型鈕子開(kāi)關(guān)項(xiàng)目可行性研究報(bào)告
- 2025年離子噴霧機(jī)項(xiàng)目可行性研究報(bào)告
- 2025年玻璃圓形切割臺(tái)項(xiàng)目可行性研究報(bào)告
- 2025年汽車(chē)不解體探傷儀項(xiàng)目可行性研究報(bào)告
- 2025年普通型鋼珠滑軌項(xiàng)目可行性研究報(bào)告
- 2025年承接式管道密封圈項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)啟動(dòng)機(jī)油泵試驗(yàn)臺(tái)行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2031年中國(guó)保溫冰袋行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025年亞麻粘項(xiàng)目可行性研究報(bào)告
- 2025年P(guān)ET耐高溫瓶吹瓶機(jī)項(xiàng)目可行性研究報(bào)告
- 2023年菏澤醫(yī)學(xué)專(zhuān)科學(xué)校單招綜合素質(zhì)模擬試題及答案解析
- 常見(jiàn)食物的嘌呤含量表匯總
- 人教版數(shù)學(xué)八年級(jí)下冊(cè)同步練習(xí)(含答案)
- SB/T 10752-2012馬鈴薯雪花全粉
- 2023年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ))試題庫(kù)含答案解析
- 濕型砂中煤粉作用及檢測(cè)全解析
- 積累運(yùn)用表示動(dòng)作的詞語(yǔ)課件
- 機(jī)動(dòng)車(chē)登記證書(shū)英文證書(shū)模板
- 第8課《山山水水》教學(xué)設(shè)計(jì)(新人教版小學(xué)美術(shù)六年級(jí)上冊(cè))
- T∕ZSQX 008-2020 建設(shè)工程全過(guò)程質(zhì)量行為導(dǎo)則
- 質(zhì)量管理體系基礎(chǔ)知識(shí)培訓(xùn)-2016
評(píng)論
0/150
提交評(píng)論