以下通過(guò)一個(gè)具體實(shí)例向讀者介紹將程序添加到uClinux的標準方法。
例如要把前面提到的源程序lednxy.c添加到運行于目標板上的uClinux操作系統中,則
文件應在目錄/home/nie/uClinux-Samsung/user下,進(jìn)入uClinux-Samsung/user目錄并建立
個(gè)自己的子目錄,比如鍵入:
mkdir myapp,
這樣在user目錄下就建立了一個(gè)新的子目錄myapp,把lednxy.c拷貝到myapp目錄下,
將該源文件相應的makefile文件也拷貝到該目錄下。注意,為了使用標準方法,我們應該
改一下剛才的makefile文件,這個(gè)文件名應為Makefile,寫(xiě)成這樣的形式:
EXEC = lednxy
OBJS = lednxy.o
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) –o $@ $(OBJS) $(LDLIBS)
romfs:
$(ROMFSINST) /bin/$(EXEC)
clean:
rm –f $(EXEC) *.elf *.gdb *.o
進(jìn)入user目錄,增加一行語(yǔ)句到該目錄下的Makefile文件中,
dir_$(CONFIG_USER_MYAPP_LEDNXY) += myapp
該語(yǔ)句的作用是讓編譯器可以訪(fǎng)問(wèn)到我們所創(chuàng )建的myapp目錄下的makefile文件,保
后退出。
切換到目錄/home/nie/uClinux-Samsung/config下,編輯Configure.help文件,即輸入一
命令
cd ../config
vi Configure.help
這是一個(gè)包含了在配置的時(shí)候出現的所有文本信息的文件。在這個(gè)文件中加入類(lèi)似下面
的語(yǔ)句塊:
CONFIG_USER_ MYAPP_LEDNXY
This program is an example.
注意第二行文本信息必須要空兩格開(kāi)始。每行的字符要小于70個(gè)。添加完畢后,保存退出。
不過(guò),用戶(hù)也可不必修改該文件,因為它僅僅是提供一個(gè)在線(xiàn)文本信息顯示的功能,對于添加用戶(hù)程序到uCllinux影響不大。
接下來(lái)需要修改uClinux系統中對編譯器來(lái)講比較重要的一個(gè)文件config.in。
仍然是在config目錄下,打開(kāi)該文件,在最后增加類(lèi)似下面的語(yǔ)句:
#################################################################
mainmenu_option next_comment
comment ‘ My Application ‘
bool ‘lednxy’ CONFIG_USER_MYAPP_LEDNXY
comment ‘ My Application’
endmenu
#################################################################
現在我們已經(jīng)把要做的修改的相關(guān)工作完成了,接下來(lái)需要進(jìn)行內核的編譯工作,按照在7.3.3 中談到的編譯uClinux內核的步驟進(jìn)行就可以了。
值得注意的一點(diǎn)是在第一步make menuconfig 進(jìn)行內核配置的時(shí)候,在Target Platform Selection,要選中Customize Vendor/User Settings (NEW)如圖7.10所示,選中了該選項后,與最初我們配置內核過(guò)程不同的是,它還會(huì )在 makemenuconfig的最后出現如圖7.11所示對話(huà)框,讓你進(jìn)行用戶(hù)應用程序的配置,在對話(huà)框里出現的文字是在config.in文件中添加的文字,選中要編譯的應用程序所在路徑,就會(huì )出現如圖7.12所示的對話(huà)框,顯示所選中目錄下的,在config.in中所設定的應用程序文件名,選中要編譯的文件名,保存好內核配置后退出。用這種方法生成的可執行文件在romfs/bin下。
圖7.10 添加用戶(hù)應用程序配置
ARM 應用系統開(kāi)發(fā)詳解──基于 S3C4510B 的系統設計
圖7.11 選擇要配置的用戶(hù)應用程序
圖7.12 選擇要編譯的源文件
當用戶(hù)應用程序做了修改后,需要重新編譯內核,但是此時(shí)只要進(jìn)行內核編譯的后四步,即從make user_only開(kāi)始即可,不必再從內核配置開(kāi)始了。
以上介紹的是一種基本的添加用戶(hù)應用程序的方法,如果讀者覺(jué)得比較麻煩,還可以使用下面一種較為簡(jiǎn)單的方法,這種方式是將用戶(hù)的應用程序作為uClinux自身的應用程序對待,在內核編譯時(shí)一起完成。
在uClinux-Samsung/romfs/usr下面編寫(xiě)用戶(hù)應用程序源代碼以及它對應的makefile文件,就在該目錄下編譯這個(gè)makefile文件,將生成的可執行文件拷貝到uClinux-Samsung/romfs/bin下。
進(jìn)行內核的部分編譯工作,用這種方法只需要做編譯內核的最后三步工作,即:
make romfs
make iamge
make
最后都把在uClinux-Samsung/images下生成的image.rom文件燒寫(xiě)到系統的FLASH存
ARM 應用系統開(kāi)發(fā)詳解──基于 S3C4510B 的系統設計
儲器中,uClinux啟動(dòng)后,用戶(hù)的應用程序在/bin目錄下,此時(shí)可運行用戶(hù)程序。
在Windows環(huán)境中,可以使用超級終端建立串口與目標硬件連接。超級終端的一些端口屬性需要設置,該內核默認的端口設置為:COM1,波特率為19200,數據位為8,無(wú)校驗,停止位為1,無(wú)流控。通過(guò)超級終端可以看到整個(gè)uClinux的啟動(dòng)過(guò)程。
對于本例,在uClinux啟動(dòng)后,從超級終端中鍵入cd bin,進(jìn)入到bin目錄下,運行lednxy程序,可以看到該程序對兩個(gè)LED顯示器的控制效果。
上面介紹的方法中,在將用戶(hù)應用程序添加到uClinux內核運行時(shí),都需要對內核進(jìn)行部分或全部的編譯,每次對內核編譯完成后,都要先將FLASH存儲器中的內容擦除,然后重新燒寫(xiě)新編譯好的內核到FLASH存儲器中去,這對于程序開(kāi)發(fā)來(lái)說(shuō),是非常不方便的。下面介紹一種通過(guò)網(wǎng)絡(luò )來(lái)傳輸可執行文件,避免每次測試程序運行效果時(shí)都要編譯一次內核。
通過(guò)網(wǎng)絡(luò )添加應用程序到目標系統
作為一款優(yōu)秀的網(wǎng)路控制器,基于S3C4510B的系統一般都提供以太網(wǎng)接口,通過(guò)以太網(wǎng)接口從網(wǎng)絡(luò )添加用戶(hù)程序到目標系統運行,顯然比前面所介紹的方法方便得多,特別是在用戶(hù)應用程序的調試過(guò)程中,若每做一點(diǎn)修改都要求重新編譯內核并燒寫(xiě)入FLASH存儲器運行,其工作量是可想而知的。
事實(shí)上,鑒于uClinux操作系統本身強大的網(wǎng)絡(luò )功能,同時(shí)基于S3C4510B的系統提供以太網(wǎng)接口,通過(guò)局域網(wǎng)可方便的在運行uClinux目標系統和運行Linux宿主機上進(jìn)行文件傳輸。運行目標系統的uClinux內核在編譯的過(guò)程中,已默認選擇了FTP和其他一些網(wǎng)絡(luò )服務(wù),同時(shí),宿主機上的Linux在默認時(shí),也會(huì )安裝運行FTP服務(wù),因此,當目標系統的uClinux啟動(dòng)運行以后,可將目標系統作為FTP客戶(hù)端,而運行Linux宿主機作為FTP服務(wù)器,進(jìn)行雙向的文件傳輸。
但由于目前所使用的uClinux操作系統內核采用ROMFS作為其根文件系統,當目標系統的uClinux啟動(dòng)運行以后,其目錄大多數是建在FLASH存儲器中,因而是不可寫(xiě)的,只有/var、/tmp等少數幾個(gè)目錄是建立在SDRAM,是可讀寫(xiě)的,但若目標系統掉電,內容就丟失了,因此只能作為應用程序調試之用,當應用程序調試完成后,還應將其寫(xiě)入FLASH存儲器。當然,若能在目標系統中使用JFFS/JFFS2,用以代替ROMFS作為其根文件系統,則整個(gè)目標系統就像有磁盤(pán)一樣方便,用戶(hù)應用程序的加載再也不用像前面介紹的方式進(jìn)行了。關(guān)于JFFS/JFFS2文件系統的建立,請讀者參考相關(guān)技術(shù)資料,在此僅描述如何將用戶(hù)程序通過(guò)局域網(wǎng),從FTP服務(wù)器(運行Linux宿主機)上,傳輸到運行uClinux的目標系統(FTP客戶(hù)機)并執行的過(guò)程:
將目標系統與Linux宿主機連接在同一網(wǎng)段中,在宿主機的任意目錄下編寫(xiě)應用程序,并用交*編譯工具生成flat格式的文件。
啟動(dòng)目標系統的uClinux,通過(guò)超級終端,輸入下面的命令:
ifconfig eth0 192.168.100.50
ifconfig命令用于顯示及設置目標系統的網(wǎng)卡配置,例如,IP地址,子網(wǎng)掩碼,IRQ及IOPort等。在上述命令中,參數eth0代表目標系統的網(wǎng)絡(luò )設備,IP地址192.168.100.50為目標系統的IP地址,注意應與宿主機在同一網(wǎng)段內(此時(shí)宿主機的IP地址為:192.1681.100.21)。
執行命令:
ifconfig –all
可以看到目標系統的IP地址已被正確配置,顯示信息如下:
ARM 應用系統開(kāi)發(fā)詳解──基于 S3C4510B 的系統設計
/var/tmp> ifconfig -all
eth0 Link encap:Ethernet HWaddr 00:40:95:36:35:34
inet addr:192.168.100.52 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING MTU:1500 Metric:1
RX packets:30533 errors:10 dropped:0 overruns:0 frame:0
TX packets:21090 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:17
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:19 errors:0 dropped:0 overruns:0 frame:0
TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
這里我們介紹幾個(gè)比較重要的名詞。
Link encap即Link encapsulate,是用來(lái)表示將信息分割為數據包的方法,比如Ethernet。
Hwaddr即Hardware address,網(wǎng)卡的硬件地址,又稱(chēng)為MAC(Media Access Control)地址,它是直接燒寫(xiě)到網(wǎng)卡芯片上的。由12個(gè)16進(jìn)制值組成,每?jì)蓚€(gè)數字為一組,每組之間用“:”分割開(kāi)。
inet addr即internet address,就是主機的IP地址。
Bcast即Broadcast,這個(gè)是指廣播地址,若接收者的地址為廣播地址,則表示該信息可在同一時(shí)間發(fā)送到網(wǎng)絡(luò )中的所有計算機。通常,廣播地址是由主機的IP地址所屬的地址類(lèi)來(lái)決定,
Mask是子網(wǎng)掩碼,主要是用來(lái)將IP地址分成網(wǎng)絡(luò )ID和主機ID兩部分。它是由一連串的“1”和一連串的“0”組成。“1”對應于網(wǎng)絡(luò )號碼和子網(wǎng)號碼字段,而“0”對應于主機號碼字段。對于不同類(lèi)的IP地址,對應的子網(wǎng)掩碼是不同的。表7.2是不同類(lèi)的IP地址使用范圍,表7.3是不同類(lèi)的IP地址所使用的子網(wǎng)掩碼。
表7.2 IP地址使用范圍
網(wǎng)絡(luò )類(lèi)別
最大網(wǎng)絡(luò )數目
第一個(gè)可用的
網(wǎng)絡(luò )號碼
最后一個(gè)可用的網(wǎng)絡(luò )號碼
每個(gè)網(wǎng)絡(luò )中的最大主機數
A
126
1
126
16777214
B
16382
128.1
191.254
65534
C
2097150
192.0.1
223.255.254
254
表7.3 不同類(lèi)的IP地址使用的子網(wǎng)掩碼
Class IP
子網(wǎng)掩碼
A
255.0.0.0
B
255.255.0.0
C
255.255.255.0
子網(wǎng)掩碼和IP地址轉換為二進(jìn)制數后,將兩者相“與”,相與之后得到的結果就是網(wǎng)絡(luò )ID。
MTU即Maximum Transmission Unit,網(wǎng)絡(luò )傳輸時(shí),數據包最大的傳輸單位,Ethernet的MTU默認值是1500字節。
Metric來(lái)源主機將信息送至目的地主機,所需經(jīng)過(guò)的轉送次數,有些路由通信協(xié)議,在
ARM 應用系統開(kāi)發(fā)詳解──基于 S3C4510B 的系統設計
計算最短路徑時(shí),必須參考此數值。
RX表示已經(jīng)接收的數據包總數,數據包流失數量以及碰撞的數量。
TX表示已經(jīng)發(fā)送的數據包總數,數據包流失數量以及碰撞的數量。
測試一下與宿主機的連接,鍵入命令:
ping 192.168.100.21
應能得到宿主機的應答信息,類(lèi)似如下所示:
/var/tmp> ping 192.168.100.21
PING 192.168.100.21 (192.168.100.21): 56 data bytes
64 bytes from 192.168.100.21: icmp_seq=0 ttl=255 time=0.0 ms
64 bytes from 192.168.100.21: icmp_seq=1 ttl=255 time=0.0 ms
64 bytes from 192.168.100.21: icmp_seq=2 ttl=255 time=0.0 ms
64 bytes from 192.168.100.21: icmp_seq=3 ttl=255 time=0.0 ms
64 bytes from 192.168.100.21: icmp_seq=4 ttl=255 time=0.0 ms
當目標系統與宿主機已正確建立連接后,進(jìn)入目標系統的可寫(xiě)目錄/var或/tmp,并登錄到宿主機:
cd var
ftp 192.168.100.21
此時(shí)輸入宿主機上的合法用戶(hù)名及密碼,便與宿主機建立了FTP連接。為傳輸二進(jìn)制文件,鍵入命令:
ftp>binary
200 Type set to I
這里請讀者注意:在用FTP進(jìn)行文件傳輸的時(shí)候,一定要選好文件傳輸的模式,FTP缺省模式為二進(jìn)制模式,但是為了保險起見(jiàn),還是手動(dòng)把傳輸模式顯式改寫(xiě)為二進(jìn)制模式。通常的txt,html和絕大多數PS文件都是文本格式的,而其他的可執行文件,壓縮文件都是二進(jìn)制格式。兩種格式之間要用ascii和binary命令切換,兩者都可以適當縮寫(xiě)。
傳輸已編譯好的可執行文件(如lednxy)到目標系統并退出FTP服務(wù),鍵入如下所示命令:
ftp>get lednxy
ftp>bye
此時(shí),可執行文件lednxy已傳輸至目錄/var或/tmp下,但文件的可執行屬性未被設置,添加文件的可執行屬性,鍵入命令:
chmod 755 lednxy
chmod是一個(gè)文件權限修改的命令,在文件創(chuàng )建的時(shí)候會(huì )自動(dòng)設置存取權限,若是這些默認權限無(wú)法適合企業(yè)環(huán)境的需求,就可以利用chmod命令來(lái)修改存取權限。通常在權限修改的時(shí)候可以用兩種方式表示權限類(lèi),數字表示法和文字表示法。
這里我們采用的是數字表示法,就是說(shuō)將讀取(r),寫(xiě)入(w)和執行(x)分別以4,2,1來(lái)代表,沒(méi)有授予的權限的部分就表示值為0,然后再把所授予的權限先加而成。表7.4為讀者列出了幾個(gè)例子。
表7.4 存取權限范例
原始權限
轉換為數字
數字表示法
rwxrwxr-x
(421) (421)(421)
775
rwxr-xr-x
(421)(401)(401)
755
rw-rw-r--
(420)(420)(400)
664
rw-r--r--
(420)(400)(400)
644
ARM 應用系統開(kāi)發(fā)詳解──基于 S3C4510B 的系統設計
每三位字符為一組,這樣權限可以被分為三組,第一組表示此文件擁有者的存取權限,第二組表示該文件擁有者所屬組成員的存取權限,最后一組表示該文件擁有者所屬組之外的用戶(hù)存取權限。希望讀者能夠研究清楚權限的分配。
這里所鍵入的命令表示授予文件擁有者讀取寫(xiě)入和執行的權限,而該文件擁有者所屬組成員和該文件擁有者所屬組之外的用戶(hù)只擁有讀取和執行的權限。
執行程序lednxy,鍵入命令:
./lednxy
顯然,這種方法在應用程序的開(kāi)發(fā)中是比較有用的,使用這種方式可以使用戶(hù)在宿主機的開(kāi)發(fā)環(huán)境下,編譯代碼,但編譯出來(lái)的flat格式的文件并沒(méi)有放到硬件目標系統的FLASH存儲器,而是在系統的SDRAM中運行,這就大大節省了調試的時(shí)間,內核編譯只需要進(jìn)行一次,使開(kāi)發(fā)人員能夠將更多的精力投入到應用程序的開(kāi)發(fā)中來(lái)。
聯(lián)系客服