版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
2023/10/618.1.4嵌入式Linux開發(fā)環(huán)境組建方案
在進(jìn)行嵌入式開發(fā)之前,首先要建立一個交叉編譯環(huán)境,包括操作系統(tǒng)以及連接器、編譯器、調(diào)試器在內(nèi)的軟件開發(fā)工具。個人在進(jìn)行嵌入式開發(fā)的時候,可分別建立以LINUX為操作系統(tǒng)的開發(fā)環(huán)境或者在Windows下安裝模擬Linux環(huán)境的軟件(VMwareWorkstation、Cygwin)。2023/10/621.Windows+Linux+目標(biāo)系統(tǒng)
安裝多個操作系統(tǒng),可以解決問題,但是,如果在調(diào)試應(yīng)用程序的時候,同時需要兩個操作系統(tǒng),則需要在兩個系統(tǒng)之間來回切換,這樣很繁瑣,很浪費(fèi)時間。
2023/10/63
2.Windows+cygwin+目標(biāo)系統(tǒng)
Cygwin是一個運(yùn)行于Windows下的Linux模擬環(huán)境。但是,在使用某些特殊功能的時候,需要打一些補(bǔ)丁,對于初學(xué)者來說,比較困難。2023/10/643.Windows+虛擬機(jī)(Linux)+目標(biāo)系統(tǒng)
Vmware可以在不破壞原有操作系統(tǒng)的情況下,虛擬出一臺“真實”的電腦出來,我們只需要在這臺虛擬的電腦上安裝Linux就可以了,和操作真實機(jī)器上的Linux完全一樣。對于初學(xué)者這是一個不錯的選擇方案。
2023/10/65
4.Windows+Linux服務(wù)器+目標(biāo)系統(tǒng)Windows客戶機(jī)+Linux服務(wù)器的方式,對實驗室而言,應(yīng)該是最適合的方案了。只需多一臺Linux服務(wù)器就可以了,對客戶機(jī)和服務(wù)器的硬件要求都不沒有什么特殊高要求。2023/10/668.1.5VMWare的安裝與使用GCCforARM主要是基于Linux系統(tǒng)的,所以在安裝它之前必須要安裝Linux系統(tǒng)。這里推薦使用Windows+虛擬機(jī)VMware+RedHat的配置方案。2023/10/67共分三步來完成GCC交叉開發(fā)環(huán)境的配置:1)在Windows系統(tǒng)上安裝虛擬機(jī)軟件VMware。2)在VMware中安裝并配置RedHat。3)在RedHat中安裝并配置GCCforARM。
2023/10/68
VMWareWorkstation軟件可以從/soft/1863.html下載,它是一個不錯的虛擬機(jī),能夠在Windows環(huán)境中虛擬一個Linux操作系統(tǒng),目前能下載到5.0以上的版本。同時還需要下載Linux相關(guān)的ISO映象文件。
2023/10/69
8.1.6安裝RedHat9.0
在VMware中安裝并配置RedHat。1)打開VMwareworkstation,運(yùn)行虛擬機(jī)。2)建立一臺虛擬機(jī)。點(diǎn)擊“FILE(文件)”-“NEW(新建)”--“NewVirtualMachine(新建虛擬機(jī))”,彈出虛擬機(jī)創(chuàng)建菜單。3)選擇客戶操作系統(tǒng)。因為要裝的是Redhat,所以這里選擇Linux。配置好一個新的虛擬機(jī)后,雙擊CD-ROM1。如下圖所示。2023/10/610選擇UseISOimage,然后點(diǎn)Browse,選擇RedHat和第一張光盤,一般采用的是Redhat的鏡像安裝方式。為了以后使用網(wǎng)絡(luò)方便,在安裝過程出現(xiàn)防火墻配置時,這里選擇“無防火墻”一直點(diǎn)“下一步”。
2023/10/611直到出現(xiàn)下圖,輸入根口令用123456,確認(rèn)也填123456。至此,系統(tǒng)的基本參數(shù)已經(jīng)設(shè)置完,點(diǎn)“下一步”,開始安裝系統(tǒng)。2023/10/612在以后的安裝過程中,按屏幕給出的提示,把不同的LINUX安裝盤的ISO加載進(jìn)VMware就可以了。具體過程是:1)出現(xiàn) 提示符時,打開虛擬機(jī)菜單面板,如圖8.1.10所示。2023/10/6132)修改ISOimage的路徑
如圖8.1.11所示。2023/10/6143)設(shè)置共享目錄,選擇Options中的SharedFolders,如圖8.1.12所示。2023/10/6154)共享目錄建立完成后,就可以將Windows硬盤中的文件拷貝到到建立的共享目錄,在虛擬環(huán)境里,然后再次拷貝到LINUX目錄下。
打開“終端”,在終端方式下,輸入下列命令:[root@zxlroot]#cdmnt[root@zxlmnt]#cdhgfs[root@zxlcdrom]#cdzxl//建立的共享目錄[root@zxllinux]#cpvivi.tar.gz///拷貝文件到根目錄[root@zxllinux]#cd///回到根目錄[root@zxl/]#tar-zxvfvivi.tar.gz//解壓vivi.tar.gz包[root@localhost/]#cd/vivi//進(jìn)入//zxl2410目錄。然后就可以對文件進(jìn)行操作,為以后的開發(fā)提供了方便。2023/10/616配置minicom:超級終端配置TFTP(TrivialFileTransferProtocol):
簡單文件傳輸協(xié)議配置NFS(NetworkFileSystem)服務(wù)Samba:windows與Linux之間的共享
8.1.7配置宿主機(jī)2023/10/6171.配置minicomminicom很像Windows下面的超級終端,我們利用minicom作為被開發(fā)目標(biāo)板的終端,開發(fā)前需要正確的配置minicom。在宿主機(jī)Linux系統(tǒng)下的終端中輸入: minicom-s對minicom進(jìn)行設(shè)置。
8.1.7配置宿主機(jī)2023/10/618選擇Serialportsetup,將串口配置為:波特率115200,8位數(shù)據(jù)位,1位停止位,沒有流控和校驗。并將其設(shè)置存為默認(rèn)值。選擇Savesetupasdfl。然后選擇Exit退回到minicom界面。
正確連接串口線,PC機(jī)端使用在minicom中被配置的串口,ttyS0或ttyS1。目標(biāo)板請使用串口0。minicom就相當(dāng)于虛擬終端,通過它來操作目標(biāo)板。2023/10/619
如下圖所示為minicom啟動后的狀態(tài)。
如果要退出minicom,可以先按CTRL+A鍵,再按X鍵。按CTRL+A再按Z為進(jìn)入幫助。2023/10/6202.配置TFTPTFTP的全稱是TrivialFileTransferProtocol,即簡單文件傳輸協(xié)議。使用此服務(wù)傳送文件時沒有數(shù)據(jù)校驗、密碼驗證,非常適合小型文件的傳輸。在通過TFTP傳送文件時,需要服務(wù)端和客戶端,對于嵌入式系統(tǒng)來講,服務(wù)端就是宿主機(jī),下邊來對它進(jìn)行配置。
2023/10/621首先檢查宿主機(jī)端的TFTP服務(wù)是否已經(jīng)開通。對于REDHAT7.2以上的版本,如REDHAT9.0,則在宿主機(jī)上執(zhí)行:setup選擇Systemservices,將tftp一項選中,出現(xiàn)[*]表示選中,并去掉ipchains和iptables兩項服務(wù),即去掉它們前面的*號。然后還要選擇Firewallconfiguration,選中Nofirewall。最后,退出setup,執(zhí)行如下命令以啟動TFTP服務(wù):2023/10/622 servicexinetdrestart 配置完成后,簡單測試一下TFTP服務(wù)器是否可用,即自己tftp自己,例如在宿主機(jī)上執(zhí)行: cp/s3c2410_linux/Image/zImage/tftpboot/ /*在本地準(zhǔn)備一個文件*/ tftp192.168.2.xxx /*用tftp服務(wù)登陸本機(jī)*/ tftp>getzImage /*使用tftp服務(wù)得到zImage*/ tftp>q /*退出tftp服務(wù)*/
2023/10/623若出現(xiàn)信息“Received741512bytesin0.7seconds”就表示TFTP服務(wù)器配置成功了。若彈出信息“Timedout”,則表明未成功。此時可用如下命令確認(rèn)tftp服務(wù)是否開通: netstat-a|greptftp若TFTP服務(wù)器沒有配置成功,需要按照上述步驟重新檢查一遍。2023/10/6243.配置NFS服務(wù) NFS(NetworkFileSystem,NFS)指網(wǎng)絡(luò)文件系統(tǒng),它是Linux系統(tǒng)中經(jīng)常使用的一種服務(wù),NFS是一個RPCservice,很像windows中的文件共享服務(wù)。它的設(shè)計是為了在不同的系統(tǒng)間使用,所以它的通訊協(xié)議設(shè)計與主機(jī)及作業(yè)系統(tǒng)無關(guān)。當(dāng)使用者想用遠(yuǎn)端檔案時只要用"mount"就可把remote檔案系統(tǒng)掛接在自己的檔案系統(tǒng)之下,使得遠(yuǎn)端的檔案在使用上和local的檔案沒兩樣。
2023/10/625
在NFS服務(wù)中,宿主機(jī)(Servers)是被掛載(mount)端,為了遠(yuǎn)端客戶機(jī)(Clients)可以訪問主機(jī)的文件,我們需要主機(jī)配置兩方面內(nèi)容:打開NFS服務(wù),允許“指定用戶”使用。2023/10/626 打開宿主機(jī)的NFS服務(wù)可以使用命令: setup 選擇Systemservices,將nfs一項選中,出現(xiàn)[*]表示選中,并去掉ipchains和iptables兩項服務(wù),即去掉它們前面的*號。然后退出。 “指定用戶”是通過編輯文件“exports”: vi/etc/exports 在exports文件中加入:/s3c2410_linux/nfs6(rw,insecure,no_root_squash,no_all_squash)2023/10/627然后按<ESC>再輸入:再輸入wq然后回車,存儲退出。其中“/s3c2410_linux/nfs”是一個可以被IP地址是“6”計算機(jī)訪問到并讀寫的文件夾??梢愿倪@個ip,可以讓不同的計算機(jī)訪問。重新啟動服務(wù),使我們的設(shè)置生效:/etc/rc.d/init.d/nfsrestart現(xiàn)在NFS就可以使用了。要啟動或停止NFS服務(wù),必須以root登錄并使用以下命令來啟動NFS守護(hù)進(jìn)程,其命令格式如下:/etc/rc.d/init.d/nfsstartstoprestart2023/10/628要啟動NFS,在“#”提示符下鍵入以下命令行: /etc/rc.d/init.d/nfsstart注:在Linux的Terminal下,可以使用ifconfig命令來給設(shè)定本機(jī)ip。例如: #ifconfigeth0192.168.0.xxx 同樣在minicom中也可以用該命令給實驗箱設(shè)置ip地址。宿主機(jī)和開發(fā)板ip要配成同一網(wǎng)段內(nèi)的。在exports文件中設(shè)置宿主機(jī)可以被訪問的文件目錄,和開發(fā)板的ip地址,就可以在minicom下,讓開發(fā)板通過網(wǎng)絡(luò)掛接(mount)到宿主機(jī)的相應(yīng)文件夾。
2023/10/6294.SambaLinux與Linux之間通過NFS實現(xiàn)共享,Windows與windows之間通過共享目錄實現(xiàn)共享,Linux與windows之間怎么實現(xiàn)共享?利用Samba實現(xiàn)共享。一個Samba服務(wù)器實際上包括兩個守護(hù)進(jìn)程:smbd和nmbd。Samba服務(wù)器配置工具如圖8.1.14所示,它是用來管理Samba共享、用戶以及基本服務(wù)器設(shè)置的圖形化界面。配置Samba服務(wù)器首先是配置服務(wù)器的基本設(shè)置和幾個安全選項。然后添加Samba用戶、添加共享。2023/10/630啟動和停止Samba服務(wù)器,使用以下命令來啟動守護(hù)進(jìn)程:/etc/rc.d/init.d/smbstart使用以下命令來停止守護(hù)進(jìn)程:/etc/rc.d/init.d/smbstop2023/10/631連接Samba共享:要從MicrosoftWindows機(jī)器上連接LinuxSamba共享,可以使用“網(wǎng)上鄰居”或圖形圖形化化文件管理器。也可用以下DOS命令:\\21。smbclient命令用來存取遠(yuǎn)程Samba服務(wù)器上的資源。2023/10/632
8.2.1什么是shellLinux系統(tǒng)的Shell作為操作系統(tǒng)的外殼,為用戶提供使用操作系統(tǒng)的接口。它是命令語言、命令解釋程序及程序設(shè)計語言的統(tǒng)稱。Shell是用戶和操作系統(tǒng)之間最主要接口。通過Shell,可以同時在后臺運(yùn)行多個應(yīng)用程序,并且在把需要與用戶交互的程序放在前臺運(yùn)行。
8.2
Shell腳本2023/10/6331.Shell稱為命令解釋器負(fù)責(zé)用戶和操作系統(tǒng)之間的溝通,把用戶下達(dá)的命令解釋給系統(tǒng)去執(zhí)行,并將系統(tǒng)傳回的信息再次解釋給用戶,所以,它擁有自己內(nèi)建的Shell命令集,也能被系統(tǒng)中其他應(yīng)用程序調(diào)用。2.Shell還是一種高級程序設(shè)計語言它有變量、關(guān)鍵字,有各種控制語句,如if、case、while、for等語句,通過在多條命令的序列中使用變量和流程控制,有自己的語法結(jié)構(gòu)。利用Shell程序設(shè)計語言可以編寫出功能強(qiáng)大的代碼程序。2023/10/6343、Shell有很多種Shell有很多種,如:csh,tcsh,pdksh,ash,sash,zsh,bash等。Linux的缺省Shell為bash(BourneAgainShell)。其中最常見的是BourneShell(sh)、CShell(csh)和KornShell(ksh)。三種Shell各有優(yōu)缺點(diǎn)。
2023/10/635Bash是大多數(shù)Linux系統(tǒng)的默認(rèn)Shell。Bash有以下的優(yōu)點(diǎn):1)補(bǔ)全命令
在Bash命令提示符下輸入命令或程序名時,若沒有輸全命令或程序名,按“Tab”鍵,Bash將自動補(bǔ)全命令或程序名。2)通配符
在Bash下可以使用通配符“*”和“?”。“*”可以替代多個字符,而“?”則替代一個字符。3)歷史命令
Bash能自動跟蹤用戶每次輸入的命令,并把輸入的命令保存在歷史列表緩沖區(qū)中。2023/10/6364)別名
在Bash下,可用alias和unalias命令給命令或可執(zhí)行程序起別名和刪除別名,這樣就可以用自己習(xí)慣的方式輸入命令。 5)輸入/輸出重定向。輸入重定向用于改變命令的輸入,輸出重定向用于改變命令的輸出系統(tǒng)默認(rèn)的輸入為鍵盤、輸出為顯示器,輸入/輸出重定向可以改變輸入輸出。6)管道
管道用于將一系列的命令連接起來,也就是把前面命令的輸出作為后面命令的輸入。管道的命令是“|”。管道的功能和用法與DOS/Windows系統(tǒng)的完全相同。
2023/10/6378.2.2Shell腳本編程由于Shell擅長系統(tǒng)管理任務(wù),所以用戶可以通過使用Shell使大量的任務(wù)自動化,就象使用DOS操作系統(tǒng)的過程當(dāng)中,會執(zhí)行一些重復(fù)性的命令,將這些大量的重復(fù)性的命令寫成批處理命令,通過執(zhí)行這個批處理命令來代替執(zhí)行重復(fù)性的命令。在Linux系統(tǒng)中也有類似的批處理命令,被稱為Shell腳本。2023/10/6381.建立腳本使用vi、Emacs等編Shell腳本。Linux系統(tǒng)下的Shell默認(rèn)Bash。在建立Shell腳本程序的開始,首先應(yīng)指明使用哪種Shell來解釋所寫的腳本,第一行必須是如下格式: #!/bin/sh
2023/10/639
符號#!用來指定該腳本文件的解析程序。在上面例子中使用/bin/sh來解析該腳本。當(dāng)編輯好腳本后,如果要執(zhí)行該腳本,還必須使其具有可執(zhí)行屬性??梢岳孟旅娴恼Z句改變文件的屬性為可執(zhí)行屬性。chmod+xfilename在進(jìn)行shell編程時,以#開頭的句子表示注釋,直到這一行的結(jié)束。2023/10/6402.Shell變量Shell腳本中主要有系統(tǒng)變量、環(huán)境變量和用戶變量,其中用戶變量在編程過程中使用較多,系統(tǒng)變量在對參數(shù)判斷和命令返回值判斷會使用,環(huán)境變量主要是在程序運(yùn)行的時候需要設(shè)置,由于是解釋型的,所以變量不必事先對它進(jìn)行定義。1)常用的環(huán)境變量在用戶登錄過程中系統(tǒng)要做的一件事就是建立用戶環(huán)境,就是Shell下的控制及設(shè)置,包括文件搜索路徑、用戶目錄和系統(tǒng)提示符等。Linux(Shell)環(huán)境由許多變量和這些變量的值組成,通過設(shè)置這些環(huán)境變量來控制用戶環(huán)境。2023/10/641(1)HOME:用戶主目錄的全路徑名。主目錄是開始工作的位置,默認(rèn)情況下,普通用戶的主目錄為/home/用戶名,root用戶的主目錄為/root。例如:如果你的用戶名為myname,則HOME的值為/home/myname。 要使用環(huán)境變量或其他Shell變量,必須在變量名前加上一個“$”符號而不能直接使用變量名。2023/10/642(2)LOGNAME
用戶名(注冊名),由Linux自動設(shè)置,系統(tǒng)通過與LOGNAME變量確認(rèn)文件的所有者,有權(quán)執(zhí)行某個命令等。(3)PATH
Shell從中查找命令的目錄列表。 例如: PATH=$PATH:$HOME/bin2023/10/643(4)PS1Shell的主提示符,既在Shell準(zhǔn)備接受命令時顯示的字符串,PS1定義你的主提示符是怎樣構(gòu)成的。一般設(shè)為PS1="[\u@\h\W]\\$"意思是:[用戶名@主機(jī)名當(dāng)前目錄]。(5)PWD
你當(dāng)前的工作目錄的路徑,它指出目前你在什么位置。(6)SHELL你當(dāng)前使用的Shell和Shell放在什么位置。例如,查看用戶登錄系統(tǒng)時默認(rèn)使用的Shell。2023/10/6442)Shell用戶變量 Shell用戶變量是使用最多的變量,可以使用任何不包含空格字符的字串作為變量名稱,可以用復(fù)制符號(=)給變量賦值。變量賦值時,“=”左右兩邊都不能有空格,BASH中的語句結(jié)尾不需要分號。 下面是變量示例: #varname=value:賦值#readonlyvarname:標(biāo)記只讀 #exportvarname:標(biāo)記移出,變量可以被子進(jìn)程繼承
2023/10/645#setenvPATH=/home:/usr:/etc:/bin:/usr/bin:(csh中)#varname=expr$varname+1:變量值增1#x=$[$x+1]#echo$PATH在shell編程中,所有的變量都由字符串組成,并且不需要預(yù)先對變量進(jìn)行聲明。2023/10/646例如: #!/bin/sh #setvariablea a="helloworld" #printa Echo"Ais:" echo$a2023/10/6473.流程控制1)條件控制(1)test命令測試文件、變量的屬性,表達(dá)式的值,或命令執(zhí)行返回值。 test–d/usr[-d/usr] test–f.bashrc[-f.bashrc] test$count–gt0[$count–gt0]
2023/10/648
(2)if語句 if(expression)then command-list else command-list fi2023/10/649(3)case語句 case$varin pattern1)command-list;; pattern2)command-list;; …
esac2023/10/650(4)邏輯運(yùn)算符&&和|| #test–fmyfile.c&&echo“filefound” Iftest–fmyfile.cthen echo“filefound” fi #test–fmyfile.c||echo“filenotfound” Iftest!–fmyfile.cthen echo“filenotfound” fi2023/10/6512)循環(huán)控制(1)for語句 forvarinword-list do command-list done
2023/10/652例如:#!/bin/bash fordayin"SunMonTueWedThuFriSat" do echo$day done在該例中,在for所在那行,變量day是沒有加"$"符號的,而在循環(huán)體內(nèi),echo所在行變量$day是必須加上"$"符號的。2023/10/6534.shell腳本的執(zhí)行執(zhí)行shell腳本的方式基本上有下述三種。1)設(shè)置好腳本的執(zhí)行權(quán)限之后在執(zhí)行腳本。可以用下面的方式設(shè)置腳本的權(quán)限:
(1)chmodu+xscriptname只有自己可以執(zhí)行,其他人不能執(zhí)行。
(2)chmodug+xscriptname只有自己以及同一群可以執(zhí)行,其他人不能執(zhí)行。
(3)chmod+xscriptname所有人不能執(zhí)行。設(shè)置好執(zhí)行權(quán)限之后就可以執(zhí)行腳本程序了。2023/10/654例如:編輯好腳本文件test1.sh。
$chmod+xtest1 $./test12)使用Bash內(nèi)部命令“source” $sourcetest13)直接使用sh命令來執(zhí)行。
$shtest14)輸入重定向。即用輸入重定向方式讓shell從給定文件中讀入命令行,并進(jìn)行相應(yīng)處理。其一般形式:
bash<腳本名
$sh<dircmp2023/10/6551.元字符和文件名生成1)UNIX元字符(通配符)的定義 *匹配任何字符串,包括空字符串; ?匹配任何單個字符; [.,-,!]按照范圍、列表或不匹配等形式匹配指定的字符; \轉(zhuǎn)意符,使元字符失去其特殊的含義。例如:[a-d,x,y]匹配字符a、b、c、d、x、y; z*匹配以字符z開始的任何字符串;8.2.3shell命令的集成2023/10/6562)元字符作為文件擴(kuò)展名的使用
例如:[a-f]*匹配字符a到字符f開頭的文件名,如abc,d2,e3.c,f.dat; *z匹配以字符z結(jié)尾的任何字符串,如win.z,core.zz,a-c-5z;
rc?.d匹配以rc開始、以.d結(jié)束、中間為任何單個字符的文件名,如rc0.d,rc2.d,rcS.d; *[!o]匹配不以o結(jié)尾的文件名。2023/10/6572.管道和命令表在shell中有兩種結(jié)構(gòu)類型:管道線和命令表。當(dāng)shell檢測到一個管道操作符時,就建立一個系統(tǒng)管道文件,這是一個先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),它允許在同一時刻對管道線上的命令或程序進(jìn)行讀和寫,即允許兩個無關(guān)的命令通過管道連接交換信息。
2023/10/658
1)管道的概念管道:一個命令的標(biāo)準(zhǔn)輸出與另一個命令的標(biāo)準(zhǔn)輸入之間的連接,不經(jīng)過任何中間文件;
管道線:由管道操作符分隔的一個命令序列,最簡單的管道線是一個簡單命令;
管道操作符:用符號“|”表示。例如: w|wc-l psaux|grepftp2023/10/6592)命令表的概念命令表:一串管道線構(gòu)成了一個命令表,最簡單的命令表是一個管道線,一個命令表送回的值是該命令表中最后一個管道線的出口狀態(tài)。管道線分隔符:分隔命令表元素,確定管道線執(zhí)行的條件。各分隔符含義如下:;表示按順序執(zhí)行管道線;&&表示根據(jù)條件(true),執(zhí)行其后面的管道線;‖表示根據(jù)條件(false),執(zhí)行其后面的管道線;&表示前面的管道線在后臺(異步)執(zhí)行。2023/10/660例1:四個管道線構(gòu)成一個命令表
ls-l/tmp/root w|wc-l ps例2:與例1等價
ls-l/tmp/root;w|wc-l;ps2023/10/6613.輸入、輸出重定向1)使用標(biāo)準(zhǔn)改向符進(jìn)行重定向(改向)<輸入改向
<<追加輸入改向
>輸出改向
>>追加輸出改向2023/10/6622)使用標(biāo)準(zhǔn)文件描述字進(jìn)行重定向(改向)
在Linux系統(tǒng)中,定義了用于輸入、輸出的標(biāo)準(zhǔn)文件,其文件描述字0為進(jìn)程的標(biāo)準(zhǔn)輸入、文件描述字1為標(biāo)準(zhǔn)輸出、文件描述字2為標(biāo)準(zhǔn)錯誤輸出。3.標(biāo)準(zhǔn)錯誤輸出的改向(>、>>)格式為:
command2>file command2>>file 2023/10/663例1:將myfile1作為sort的輸入。 sort<myfile1例2:將date的輸出轉(zhuǎn)向到myfile2文件中。 date>myfile2例3:將ls\|l的輸出追加到myfile3文件中。 ls-l>>myfile3例4:將錯誤輸出改向到err-file文件。 $myprog2>err-file例5:將標(biāo)準(zhǔn)輸出和錯誤輸出改向out文件。 $myprog>out2>>out $myprog>out2>>&12023/10/6641.GNUmake1)GNU的make
使用make工具,可以將大型的開發(fā)項目分解成為多個易于管理的模塊,對于一個包含眾多源文件的應(yīng)用程序,使用make和Makefile工具就可以高效處理各個源文件之間的復(fù)雜的相互關(guān)系,進(jìn)而取代了復(fù)雜的命令行操作,也大大提高了應(yīng)用程序的開發(fā)效率。8.3Makefile2023/10/6652)Makefilemake在執(zhí)行時,需要一個命名為Makefile的文件。Makefile文件描述了整個工程的編譯,連接等規(guī)則。其中包括:工程中的哪些源文件需要編譯以及如何編譯;需要創(chuàng)建那些庫文件以及如何創(chuàng)建這些庫文件、如何最后產(chǎn)生我們想要得可執(zhí)行文件。2023/10/666
大型程序維護(hù)工具如圖所示。2023/10/667
Makefile或makefile:告訴make維護(hù)一個大型程序,該做什么。Makefile說明了組成程序的各模塊間的相互關(guān)系及更新模塊時必須進(jìn)行的動作,make按照這些說明自動地維護(hù)這些模塊。如下圖所示。2023/10/668在makefile(Makefile)中,自頂向下說明各模塊之間的依賴關(guān)系及實現(xiàn)方法:network:network.osubrs.o(1)gcc–onetworknetwork.osubrs.o
(2)network.o:network.cnetdefs.h(3)gcc–cnetwork.c
(4)subrs.o:subrs.cnetdefs.h(5)gcc–csubrs.c
(6)其中(3)—(6)可以簡化為:(隱含的規(guī)則)network.osubrs.o:netdefs.h注意:命令需要以【TAB】鍵開始2023/10/669
執(zhí)行: #make #makenetwork#make–fmakefile2023/10/6702.makefile規(guī)則規(guī)則:用于說明如何生成一個或多個目標(biāo)文件,規(guī)則格式如下: targets:prerequisites command 目標(biāo)依賴命令 main.o:main.c gcc–cmain.c 目標(biāo)?依賴?命令?2023/10/6711)目標(biāo)在Makefile中,規(guī)則的順序是很重要的,因為,Makefile中只應(yīng)該有一個最終目標(biāo)。2)依賴文件目標(biāo)文件所依賴的的文件,一個目標(biāo)文件可以依賴一個或多個文件。
2023/10/6723)文件名make命令默認(rèn)在當(dāng)前目錄下尋找名字為makefile或者M(jìn)akefile的工程文件,當(dāng)名字不為這兩者之一時,可以使用如下方法指定: make–f文件名4)偽目標(biāo)Makefile中把那些沒有任何依賴只有執(zhí)動作的目標(biāo)稱為“偽目標(biāo)”(phonytargets)。
.PHONY:clean clean: rm–fhellomain.ofunc1.ofunc2.o “.PHONY”將“clean”目標(biāo)聲明為偽目標(biāo)2023/10/6735)變量要設(shè)定一個變量,你只要在一行的開始寫下這個變量的名字,后面跟一個=號,后面跟你要設(shè)定的這個變量的值。以后你要引用這個變量,寫一個$變量,后面是圍在括號里的變量名。比如在下面:myprog:foo.obar.ogccfoo.obar.o-omyprogfoo.o:foo.cfoo.hbar.hgcc-cfoo.c-ofoo.obar.o:bar.cbar.hgcc-cbar.c-obar.o2023/10/674利用變量重寫一遍: OBJS=foo.obar.o CC=gcc CFLAGS=-Wall-O-g myprog:$(OBJS) $(CC)$(OBJS)-omyprog foo.o:foo.cfoo.hbar.h $(CC)$(CFLAGS)-cfoo.c-ofoo.o bar.o:bar.cbar.h $(CC)$(CFLAGS)-cbar.c-obar.o2023/10/675還有一些設(shè)定好的內(nèi)部變量,它們根據(jù)每一個規(guī)則內(nèi)容定義。三個比較有用的變量是:$@,$<和$^,這些變量不需要括號括住。$@擴(kuò)展成當(dāng)前規(guī)則的目標(biāo)文件名。$<擴(kuò)展成依靠列表中的第一個依靠文件。$^擴(kuò)展成整個依靠的列表,除掉了里面所有重復(fù)的文件名。利用這些變量,可以把上面的makefile寫成:2023/10/676 OBJS=foo.obar.o CC=gcc CFLAGS=-Wall-O-g myprog:$(OBJS) $(CC)$^-o$@ foo.o:foo.cfoo.hbar.h $(CC)$(CFLAGS)-c$<-o$@ bar.o:bar.cbar.h $(CC)$(CFLAGS)-c$<-o$@2023/10/677第九章BootLoader2023/10/6789.1.1Bootloader的簡介
系統(tǒng)上電之后,需要一段程序來進(jìn)行初始化:關(guān)閉WATCHDOG、改變系統(tǒng)時鐘、初始化存儲控制器、將更多的代碼復(fù)制到內(nèi)存中等等。如果它能將操作系統(tǒng)內(nèi)核(從本地Flash或通過網(wǎng)絡(luò))復(fù)制到內(nèi)存中運(yùn)行,就稱這段程序為Bootloader。
9.1Bootloader基礎(chǔ)2023/10/679大多數(shù)Bootloader包含兩種不同的操作模式:
(1)啟動加載(Bootloading)模式
這種模式也稱為自主(Autonomous)模式,也即Bootloader從目標(biāo)機(jī)上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個過程并沒有用戶的介入。這種模式是Bootloader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時侯,Bootloader工作在這種模式下。2023/10/680(2)下載(Downloading)模式在這種模式下,目標(biāo)機(jī)上的Bootloader將通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)(Host)下載文件,比如下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文件通常首先被Bootloader保存到目標(biāo)機(jī)的RAM中,然后再被Bootloader寫到目標(biāo)機(jī)上的Flash類固態(tài)存儲設(shè)備中。2023/10/681像vivi或U-Boot等這樣功能強(qiáng)大的Bootloader通常同時支持這兩種工作模式,而且允許用戶在這兩種工作模式之間進(jìn)行切換。
2023/10/6821.網(wǎng)絡(luò)啟動方式
這種方式開發(fā)板不需要配置較大的存儲介質(zhì)。但是使用這種啟動方式之前,需要把Bootloader安裝到板上的EPROM或者Flash中。Bootloader通過以太網(wǎng)接口遠(yuǎn)程下載Linux內(nèi)核映像或者文件系統(tǒng)。網(wǎng)絡(luò)啟動方式對于嵌入式系統(tǒng)開發(fā)來說非常重要。
2023/10/6832.磁盤啟動方式傳統(tǒng)的Linux系統(tǒng)運(yùn)行在臺式機(jī)或者服務(wù)器上,這些計算機(jī)一般都使用BIOS引導(dǎo),并且使用磁盤作為存儲介質(zhì)。進(jìn)入BIOS設(shè)置菜單,可以探測處理器、內(nèi)存、硬盤等設(shè)備,也可以設(shè)置BIOS從軟盤、光盤或者某塊硬盤啟動。也就是說,BIOS并不直接引導(dǎo)操作系統(tǒng)。那么在硬盤的主引導(dǎo)區(qū),還需要一個Bootloader,這個Bootloader可以從磁盤文件系統(tǒng)中把操作系統(tǒng)引導(dǎo)起來。2023/10/6843.Flash啟動方式
大多數(shù)嵌入式系統(tǒng)上都使用Flash存儲介質(zhì)。Flash有很多類型,包括NORFlash、NANDFlash和其他半導(dǎo)體盤。其中,NORFlash(也就是線性Flash)使用最為普遍。
2023/10/685
Vivi是Mizi公司針對SAMSUNG的ARM架構(gòu)CPU專門設(shè)計的,基本上可以直接使用,命令簡單方便。不過其初始版本只支持串口下載,速度較慢。在網(wǎng)上出現(xiàn)了各種改進(jìn)版本:支持網(wǎng)絡(luò)功能、USB功能、燒寫YAFFS文件系統(tǒng)映像等。9.2ViVi2023/10/6869.2.1ViVi命令ViVi有兩種工作模式:
啟動加載模式和下載模式
啟動加載模式可以在一段時間后(時間可更改)自行啟動Linux內(nèi)核,這是ViVi的默認(rèn)模式。在下載模式下,ViVi為用戶提供一個命令行接口,通過接口可以使用ViVi提供的一些命令。2023/10/687下面將介紹這些命令的意義。
1)?reset命令:復(fù)位Arm9系統(tǒng)。
2)?help命令:顯示開發(fā)板上ViVi支持的所有命令。
paramhelp:顯示param命令的用法。
3)?part命令:用于對分區(qū)進(jìn)行操作。2023/10/688
4)?load命令。下載程序到存儲器(Flash或者RAM中)。通過loadhelp,顯示系統(tǒng)對load系列命令的幫助提示。
loadflashpartnamex:使用xmodom協(xié)議通過串口下載文件并且燒寫到partname分區(qū)。2023/10/689例如:
-loadflashvivix//注意,這里的vivi是分區(qū)名
-loadflashkernelx
-loadflashrootx
loadrampartnameoraddrx:使用xmodom協(xié)議通過串口下載文件到內(nèi)存中。2023/10/6905)?param命令:用于對Bootloader參數(shù)進(jìn)行操作。通過paramhelp,顯示系統(tǒng)對param系列命令的幫助提示。
paramshow:顯示Bootloader的當(dāng)前參數(shù)值。
paramreset:將Bootloader參數(shù)值復(fù)位成系統(tǒng)默認(rèn)值。
2023/10/691
paramsetparamnamevalue:設(shè)置參數(shù)值。
paramsetlinux_cmd_line“l(fā)inuxbootparam”:設(shè)置Linux啟動參數(shù),參數(shù)linuxbootparam表示要設(shè)置的LinuxKernel命令行參數(shù)。
paramsave:保存參數(shù)設(shè)置。2023/10/692
6)?boot命令:用于引導(dǎo)Linuxkernel啟動。通過boothelp,顯示系統(tǒng)對boot命令的幫助提示。
boot:以默認(rèn)方式啟動。
bootramramaddrlenth:啟動SDRAM中ramaddr處長度為lenth的Linux內(nèi)核。
2023/10/693
7)?bon命令:用于對bon分區(qū)進(jìn)行操作。通過bonhelp,顯示系統(tǒng)對bon系列命令的幫助提示。bon分區(qū)是NANDFlash設(shè)備的一種簡單的分區(qū)管理方式。bonpartinfo:顯示系統(tǒng)中bon分區(qū)的信息。
2023/10/694
bonpart:建立系統(tǒng)的bon分區(qū)表。bon分區(qū)表被保存到NANDFlash的最后0x4000個字節(jié)中,即在NANDFlash的0x03FFC000~0x33FFFFFF范圍內(nèi),分區(qū)表起始于0x03FFC000。2023/10/695例如:下列代碼分為三個區(qū):0~192?KB、192?KB~1?MB、1?MB以上。
vivi>bonpart0192k1M
doingpartition
size=0
size=196608
size=1048576
checkbadblock
part=0end=1966082023/10/6969.2.2ViVi的配置與編譯
ViVi的配置與編譯過程如下:
1.在宿主機(jī)上安裝交叉編譯器首先以root用戶的身份登錄到Linux下,進(jìn)入/usr/local目錄,創(chuàng)建名為arm的目錄:
cd/usr/local
mkdirarm
2023/10/697
將cross-2.95.3.tar.bz2文件解壓到/usr/local/arm目錄:
tarjxvfcross-2.95.3.tar.bz2–C/usr/local/arm
然后修改PATH變量:為了可以方便使用arm-linux-gcc編譯器系統(tǒng),把a(bǔ)rm-linux工具鏈目錄加入到環(huán)境變量PATH中;2023/10/698修改/etc/profile文件,添加pathmunge/usr/local/arm/2.95.3/bin,如下所示:
#Pathmanipulation
if[`id-u`=0];then
pathmunge/sbin
pathmunge/usr/sbin
pathmunge/usr/local/sbin
pathmunge/usr/local/arm/2.95.3/binfi
pathmunge/usr/X11R6/binafter
2023/10/699保存上述修改,進(jìn)入終端控制臺輸入:
source/etc/profile//使剛才的環(huán)境變量生效
注意:設(shè)置環(huán)境變量后,重啟或注銷,設(shè)置的環(huán)境變量才能生效。最后檢測環(huán)境變量是否安裝成功,在終端控制臺輸入:arm-linux-gcc-v2023/10/61002.配置和編譯ViVi
如果vivi的源代碼已根據(jù)開發(fā)板作了相應(yīng)改動,則需要對源代碼進(jìn)行配置和編譯,以生成燒入flash的vivi二進(jìn)制映象文件。
2023/10/6101
(1)由于vivi要用到kernel的一些頭文件,所以需要kernel的源代碼,所以先要把linux的kernel準(zhǔn)備好。將vivi和kernel都解到相應(yīng)目錄下。例如:將vivi源代碼解壓到/home/exam目錄下,Linuxkernel源碼kernel-h2410eb.041024.tar.gz也解壓到/home/exam目錄下。2023/10/6102
(2)修改/vivi/Makefile里變量設(shè)置如下:LINUX_INCLUDE_DIR=/kernel/include/LINUX_INCLUDE_DIR為kernel/include的對應(yīng)目錄例如:/home/XXX/kerne-my2410eb/include/,因此修改為:
LINUX_INCLUDE_DIR=/home/XXX/kerne-my2410eb/include/
2023/10/6103
CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-
CROSS_COMPILE為arm-linux安裝的相應(yīng)目錄例如:/usr/local/arm/2.95.3/bin/arm-linux-,因此修改為:
CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-
2023/10/6104
ARM_GCC_LIBS=/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3根據(jù)arm-linux的安裝目錄進(jìn)行修改,例如/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3。
2023/10/6105(3)進(jìn)入/vivi目錄,執(zhí)行makedistclean,目的是確保編譯的有效性,在編譯之前將ViVi里所有的“*.o”和“*.o.flag”文件刪掉。(4)進(jìn)入/vivi目錄里,輸入“makemenuconfig”,開始選擇配置??梢园惭b一個寫好的配置文件,也可以自己修改。注意退出時要選“Yes”保存配置。
(5)最后輸入“make”正式開始編譯,過程比較快。如果不報錯,在/vivi目錄里面有編譯完成了的“vivi”,即為要燒寫到Flash中的Bootloader。2023/10/610610.1.1Linux移植的概念
Linux移植就是把Linux操作系統(tǒng)針對具體的目標(biāo)平臺做必要改寫之后,安裝到該目標(biāo)平臺,使其正確地運(yùn)行起來,即把內(nèi)核從一種硬件平臺轉(zhuǎn)移到另外一種硬件平臺上運(yùn)行。
10.1Linux移植概述2023/10/6107
10.1.2Linux移植的準(zhǔn)備移植之前,需要做一些準(zhǔn)備工作:
1)選擇參考板,獲取Linux內(nèi)核源代碼。
2)分析內(nèi)核代碼,弄清楚哪些設(shè)備有驅(qū)動程序,哪些還沒有。確信Linux對參考板的支持情況,配置編譯Linux內(nèi)核,在目標(biāo)板上運(yùn)行測試。最新的Linux內(nèi)核版本對開發(fā)板可能支持得最好,但是也可能需要在老內(nèi)核版本上打補(bǔ)丁。2023/10/6108
分析平臺相關(guān)的部分代碼實現(xiàn);分析內(nèi)核編譯組織方式;分析內(nèi)核啟動的初始化程序;分析驅(qū)動程序的實現(xiàn)。2023/10/610910.1.3移植過程的基本內(nèi)容
1)獲取某一版本的Linux內(nèi)核源碼
2)根據(jù)具體目標(biāo)平臺對源碼進(jìn)行必要的改寫(主要是修改體系結(jié)構(gòu)相關(guān)部分)
3)添加一些外設(shè)的驅(qū)動,打造一款適合需要的目標(biāo)平臺的新操作系統(tǒng)
4)對該系統(tǒng)進(jìn)行針對具體目標(biāo)平臺的交叉編譯,生成一個內(nèi)核映象文件
5)通過一些手段把該映象文件燒寫(安裝)到目標(biāo)平臺中。2023/10/6110
10.2Linux內(nèi)核和結(jié)構(gòu)1Linux內(nèi)核概念內(nèi)核(kernel)是操作系統(tǒng)的內(nèi)部核心程序,它向外部提供了對計算機(jī)系統(tǒng)資源進(jìn)行請求和管理的調(diào)用接口和服務(wù)。內(nèi)核是一個操作系統(tǒng)的核心,它負(fù)責(zé)管理系統(tǒng)的進(jìn)程、內(nèi)存、設(shè)備驅(qū)動程序、文件和網(wǎng)絡(luò)系統(tǒng),決定著系統(tǒng)的性能和穩(wěn)定性。2023/10/61112.Linux內(nèi)核的結(jié)構(gòu)Linux內(nèi)核主要由5個模塊構(gòu)成,它們分別是:(1)進(jìn)程調(diào)度模塊:控制進(jìn)程對CPU資源的使用。(2)內(nèi)存管理模塊:確保所有進(jìn)程能夠安全地共享機(jī)器主內(nèi)存區(qū);虛擬內(nèi)存管理。(3)文件系統(tǒng)模塊:支持對外部設(shè)備的驅(qū)動和存儲。
2023/10/6112
(4)進(jìn)程間通信模塊:支持多種進(jìn)程間的信息交換方式。(5)網(wǎng)絡(luò)接口模塊:提供對多種網(wǎng)絡(luò)通信標(biāo)準(zhǔn)的訪問并支持許多網(wǎng)絡(luò)硬件。2023/10/61133.Linux2.4移植實例1)下載源碼,建立工作目錄Linux內(nèi)核源碼可以從以下網(wǎng)址下載:/pub/linux/kernel/v2.4/linux-2.4.18.tar.gz解壓:tarjxvflinux-2.4.18-rmk7-pxal-mz4.tar.bz2交叉編譯工具:armgcc2.95.3.tar.bz22023/10/61142)移植步驟如下:(1)cdkernel#cd/usr/src/linux-2.4
進(jìn)入內(nèi)核源碼目錄后,才能夠正確執(zhí)行所有的內(nèi)核配置、編譯命令。
2023/10/6115
(2)makemrproper
目的是清除原先此目錄下殘留的.config和.o文件(object文件),如果是第一次編譯內(nèi)核,那么這一步就可以省略,但是如果已經(jīng)編譯過多次內(nèi)核的話,這一步一定要,不然以后出現(xiàn)很多小問題.(3)修改Makefile,改為交叉編譯2023/10/6116(4)修改分區(qū)表
drivers/mtd/nand/smc_s3c2410.c,如下所示:
staticstructmtd_partitionsmc_partitions[]={ { name: "bootloader", size: 0x80000, offset: 0x0, mask_flags: 0, /*forceread-only*/ },{ name: "param", size: 0x80000, offset: 0x80000, mask_flags: 0,/*forceread-only*/ }2023/10/6117{ name: "kernel", size: 0x300000, offset: 0x100000, mask_flags: 0,/*forceread-only*/},{ name: "root", size: 0x1400000, offset: 0x0400000, mask_flags: 0, /*forceread-only*/ },2023/10/6118{ name: "user", size: 0x2800000, offset: 0x1400000, mask_flags: 0, /*forceread-only*/}};2023/10/6119(5)加入LED燈驅(qū)動
◆將LED燈驅(qū)動程序放在drivers/char/目錄下;
◆
在drivers/char/目錄下編輯Config.in文件,找到sourcedrivers/serial/Config.in;在其下面加入對LED的配置:
dep_tristate‘SupportMY2410LEDS’CONFIG_MY2410_LEDS
2023/10/6120
◆在drivers/char/目錄下:
viMakefile
在196行加上:obj-$(CONFIG_MY2410_LEDS)+=my2410_leds.o
保存退出。2023/10/6121(6)加入YAFFS支持驅(qū)動
◆從官網(wǎng)(http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/yaffs/)下載源碼(yaffs.tar.gz)解壓,在Linux內(nèi)核kernel/fs/目錄下新建yaffs目錄2023/10/6122
將yaffs源碼中的文件:yaffs_fs.cyaffs_guts.cyaffs_mtdif.cyaffs_ecc.cdevextras.hyaffs_guts.hyaffs_mtdif.hyaffs_ecc.hyaffsinterface.hyportenv.h
復(fù)制到該目錄下,然后創(chuàng)建yaffs_config.h文件,加入源碼中使用到的宏定義2023/10/6123#ifdef__YAFFS_CONFIG_H__#define__YAFFS_CONFIG_H__#defineCONFIG_YAFFS_MTD_ENABLED#defineCONFIG_YAFFS_USE_OLD_MTD#endif
保存退出,并將其放入其他源文件中;在該目錄下創(chuàng)建Makefile文件,內(nèi)容如下:
O_TARGET:=yaffs.oobj-y:=yaffs_fs.oyaffs_guts.oyaffs_mtdif.oyaffs_ecc.oobj
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年裝箱單在應(yīng)對外貿(mào)出口貿(mào)易救濟(jì)措施中的策略合同3篇
- 二零二五版國際貿(mào)易特許經(jīng)營合同主體欺詐風(fēng)險管理與合同解除合同3篇
- 二零二五年電子顯示屏廣告租賃合同樣本3篇
- 二零二五版代辦房地產(chǎn)前期開發(fā)手續(xù)與建筑工程質(zhì)量檢測服務(wù)合同3篇
- 二零二五年采棉機(jī)駕駛員職業(yè)素養(yǎng)提升與勞動合同3篇
- 二零二五版能源行業(yè)凍庫租賃合同含能源物資儲備協(xié)議3篇
- 二零二五年酒店客房部服務(wù)員勞動合同書3篇
- 天津事業(yè)單位2025年度合同制聘用人員管理規(guī)范3篇
- 二零二五年度裝修合同范本:環(huán)保裝修保障您的生活品質(zhì)6篇
- 二零二五版地產(chǎn)經(jīng)紀(jì)居間合同糾紛處理指南3篇
- 【公開課】同一直線上二力的合成+課件+2024-2025學(xué)年+人教版(2024)初中物理八年級下冊+
- 高職組全國職業(yè)院校技能大賽(嬰幼兒照護(hù)賽項)備賽試題庫(含答案)
- 2024年公安部直屬事業(yè)單位招聘筆試參考題庫附帶答案詳解
- 健康教育工作考核記錄表
- 裝飾工程施工技術(shù)ppt課件(完整版)
- SJG 05-2020 基坑支護(hù)技術(shù)標(biāo)準(zhǔn)-高清現(xiàn)行
- 汽車維修價格表
- 10KV供配電工程施工組織設(shè)計
- 終端攔截攻略
- 藥物外滲處理及預(yù)防【病房護(hù)士安全警示教育培訓(xùn)課件】--ppt課件
評論
0/150
提交評論