ARM的嵌入式Linux移植體驗之應用實(shí)例
應用實(shí)例的編寫(xiě)實(shí)際上已經(jīng)不屬于Linux操作系統移植的范疇,但是為了保證本系列文章的完整性,這里提供一系列針對嵌入式Linux開(kāi)發(fā)應用程序的實(shí)例。
本文引用地址:http://dyxdggzs.com/article/149093.htm(1)編譯器:GCC
GCC是Linux平臺下最重要的開(kāi)發(fā)工具,它是GNU的C和C++編譯器,其基本用法為:gcc[options][filenames]。
我們應該使用arm-linux-gcc。
(2)調試器:GDB
gdb是一個(gè)用來(lái)調試C和C++程序的強力調試器,我們能通過(guò)它進(jìn)行一系列調試工作,包括設置斷點(diǎn)、觀(guān)查變量、單步等。
我們應該使用arm-linux-gdb。
(3)Make
GNUMake的主要工作是讀進(jìn)一個(gè)文本文件,稱(chēng)為makefile。這個(gè)文件記錄了哪些文件由哪些文件產(chǎn)生,用什么命令來(lái)產(chǎn)生。Make依靠此makefile中的信息檢查磁盤(pán)上的文件,如果目的文件的創(chuàng )建或修改時(shí)間比它的一個(gè)依靠文件舊的話(huà),make就執行相應的命令,以便更新目的文件。
Makefile中的編譯規則要相應地使用arm-linux-版本。
(4)代碼編輯
可以使用傳統的vi編輯器,但最好采用emacs軟件,它具備語(yǔ)法高亮、版本控制等附帶功能。
在宿主機上用上述工具完成應用程序的開(kāi)發(fā)后,可以通過(guò)如下途徑將程序下載到目標板上運行:
(1)通過(guò)串口通信協(xié)議rz將程序下載到目標板的文件系統中(感謝Linux提供了rz這樣的一個(gè)命令);
(2)通過(guò)ftp通信協(xié)議從宿主機上的ftp目錄里將程序下載到目標板的文件系統中;
(3)將程序拷入U盤(pán),在目標機上mountU盤(pán),運行U盤(pán)中的程序;
(4)如果目標機Linux使用NFS文件系統,則可以直接將程序拷入到宿主機相應的目錄內,在目標機Linux中可以直接使用。
1.文件編程
Linux的文件操作API涉及到創(chuàng )建、打開(kāi)、讀寫(xiě)和關(guān)閉文件。
創(chuàng )建
intcreat(constchar*filename,mode_tmode);
參數mode指定新建文件的存取權限,它同umask一起決定文件的最終權限(modeumask),其中umask代表了文件在創(chuàng )建時(shí)需要去掉的一些存取權限。umask可通過(guò)系統調用umask()來(lái)改變:
intumask(intnewmask);
該調用將umask設置為newmask,然后返回舊的umask,它只影響讀、寫(xiě)和執行權限。
打開(kāi)
intopen(constchar*pathname,intflags);
intopen(constchar*pathname,intflags,mode_tmode);
讀寫(xiě)
在文件打開(kāi)以后,我們才可對文件進(jìn)行讀寫(xiě)了,Linux中提供文件讀寫(xiě)的系統調用是read、write函數:
intread(intfd,constvoid*buf,size_tlength);
intwrite(intfd,constvoid*buf,size_tlength);
其中參數buf為指向緩沖區的指針,length為緩沖區的大?。ㄒ宰止潪閱挝唬?。函數read()實(shí)現從文件描述符fd所指定的文件中讀取length個(gè)字節到buf所指向的緩沖區中,返回值為實(shí)際讀取的字節數。函數write實(shí)現將把length個(gè)字節從buf指向的緩沖區中寫(xiě)到文件描述符fd所指向的文件中,返回值為實(shí)際寫(xiě)入的字節數。
以O_CREAT為標志的open實(shí)際上實(shí)現了文件創(chuàng )建的功能,因此,下面的函數等同creat()函數:
intopen(pathname,O_CREAT|O_WRONLY|O_TRUNC,mode);
定位
對于隨機文件,我們可以隨機的指定位置讀寫(xiě),使用如下函數進(jìn)行定位:
intlseek(intfd,offset_toffset,intwhence);
lseek()將文件讀寫(xiě)指針相對whence移動(dòng)offset個(gè)字節。操作成功時(shí),返回文件指針相對于文件頭的位置。參數whence可使用下述值:
SEEK_SET:相對文件開(kāi)頭
SEEK_CUR:相對文件讀寫(xiě)指針的當前位置
SEEK_END:相對文件末尾
offset可取負值,例如下述調用可將文件指針相對當前位置向前移動(dòng)5個(gè)字節:
lseek(fd,-5,SEEK_CUR);
由于lseek函數的返回值為文件指針相對于文件頭的位置,因此下列調用的返回值就是文件的長(cháng)度:
lseek(fd,0,SEEK_END);
關(guān)閉
只要調用close就可以了,其中fd是我們要關(guān)閉的文件描述符:
intclose(intfd);
下面我們來(lái)編寫(xiě)一個(gè)應用程序,在當前目錄下創(chuàng )建用戶(hù)可讀寫(xiě)文件example.txt,在其中寫(xiě)入HelloWorld,關(guān)閉文件,再次打開(kāi)它,讀取其中的內容并輸出在屏幕上:
#include
#include
#include
#include
#defineLENGTH100
main()
{
intfd,len;
charstr[LENGTH];
fd=open(hello.txt,O_CREAT|O_RDWR,S_IRUSR|S_IWUSR);/*創(chuàng )建并打開(kāi)文件*/
if(fd)
{
write(fd,Hello,SoftwareWeekly,strlen(Hello,softwareweekly));
/*寫(xiě)入Hello,softwareweekly字符串*/
close(fd);
}
fd=open(hello.txt,O_RDWR);
len=read(fd,str,LENGTH);/*讀取文件內容*/
str[len]='国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放