新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM的嵌入式Linux移植體驗之應用實例

        ARM的嵌入式Linux移植體驗之應用實例

        作者: 時間:2012-05-11 來源:網絡 收藏

        的編寫實際上已經不屬于操作系統的范疇,但是為了保證本系列文章的完整性,這里提供一系列針對開發程序的

        本文引用地址:http://www.104case.com/article/149093.htm

        編寫程序要用到如下工具:

        (1)編譯器:GCC

        GCC是Linux平臺下最重要的開發工具,它是GNU的C和C++編譯器,其基本用法為:gcc[options][filenames]。

        我們應該使用arm-linux-gcc。

        (2)調試器:GDB

        gdb是一個用來調試C和C++程序的強力調試器,我們能通過它進行一系列調試工作,包括設置斷點、觀查變量、單步等。

        我們應該使用arm-linux-gdb。

        (3)Make

        GNUMake的主要工作是讀進一個文本文件,稱為makefile。這個文件記錄了哪些文件由哪些文件產生,用什么命令來產生。Make依靠此makefile中的信息檢查磁盤上的文件,如果目的文件的創建或修改時間比它的一個依靠文件舊的話,make就執行相應的命令,以便更新目的文件。

        Makefile中的編譯規則要相應地使用arm-linux-版本。

        (4)代碼編輯

        可以使用傳統的vi編輯器,但最好采用emacs軟件,它具備語法高亮、版本控制等附帶功能。

        在宿主機上用上述工具完成應用程序的開發后,可以通過如下途徑將程序下載到目標板上運行:

        (1)通過串口通信協議rz將程序下載到目標板的文件系統中(感謝Linux提供了rz這樣的一個命令);

        (2)通過ftp通信協議從宿主機上的ftp目錄里將程序下載到目標板的文件系統中;

        (3)將程序拷入U盤,在目標機上mountU盤,運行U盤中的程序;

        (4)如果目標機Linux使用NFS文件系統,則可以直接將程序拷入到宿主機相應的目錄內,在目標機Linux中可以直接使用。

        1.文件編程

        Linux的文件操作API涉及到創建、打開、讀寫和關閉文件。

        創建

        intcreat(constchar*filename,mode_tmode);

        參數mode指定新建文件的存取權限,它同umask一起決定文件的最終權限(modeumask),其中umask代表了文件在創建時需要去掉的一些存取權限。umask可通過系統調用umask()來改變:

        intumask(intnewmask);

        該調用將umask設置為newmask,然后返回舊的umask,它只影響讀、寫和執行權限。

        打開

        intopen(constchar*pathname,intflags);

        intopen(constchar*pathname,intflags,mode_tmode);

        讀寫

        在文件打開以后,我們才可對文件進行讀寫了,Linux中提供文件讀寫的系統調用是read、write函數:

        intread(intfd,constvoid*buf,size_tlength);

        intwrite(intfd,constvoid*buf,size_tlength);

        其中參數buf為指向緩沖區的指針,length為緩沖區的大小(以字節為單位)。函數read()實現從文件描述符fd所指定的文件中讀取length個字節到buf所指向的緩沖區中,返回值為實際讀取的字節數。函數write實現將把length個字節從buf指向的緩沖區中寫到文件描述符fd所指向的文件中,返回值為實際寫入的字節數。

        以O_CREAT為標志的open實際上實現了文件創建的功能,因此,下面的函數等同creat()函數:

        intopen(pathname,O_CREAT|O_WRONLY|O_TRUNC,mode);

        定位

        對于隨機文件,我們可以隨機的指定位置讀寫,使用如下函數進行定位:

        intlseek(intfd,offset_toffset,intwhence);

        lseek()將文件讀寫指針相對whence移動offset個字節。操作成功時,返回文件指針相對于文件頭的位置。參數whence可使用下述值:

        SEEK_SET:相對文件開頭

        SEEK_CUR:相對文件讀寫指針的當前位置

        SEEK_END:相對文件末尾

        offset可取負值,例如下述調用可將文件指針相對當前位置向前移動5個字節:

        lseek(fd,-5,SEEK_CUR);

        由于lseek函數的返回值為文件指針相對于文件頭的位置,因此下列調用的返回值就是文件的長度:

        lseek(fd,0,SEEK_END);

        關閉

        只要調用close就可以了,其中fd是我們要關閉的文件描述符:

        intclose(intfd);

        下面我們來編寫一個應用程序,在當前目錄下創建用戶可讀寫文件example.txt,在其中寫入HelloWorld,關閉文件,再次打開它,讀取其中的內容并輸出在屏幕上:

        #include

        #include

        #include

        #include

        #defineLENGTH100

        main()

        {

        intfd,len;

        charstr[LENGTH];

        fd=open(hello.txt,O_CREAT|O_RDWR,S_IRUSR|S_IWUSR);/*創建并打開文件*/

        if(fd)

        {

        write(fd,Hello,SoftwareWeekly,strlen(Hello,softwareweekly));

        /*寫入Hello,softwareweekly字符串*/

        close(fd);

        }

        fd=open(hello.txt,O_RDWR);

        len=read(fd,str,LENGTH);/*讀取文件內容*/

        str[len]='

        主站蜘蛛池模板: 马鞍山市| 同江市| 潞城市| 新干县| 林州市| 页游| 大关县| 南宁市| 台中县| 福安市| 洛隆县| 北宁市| 海南省| 西吉县| 文化| 壶关县| 密云县| 宁河县| 冀州市| 湾仔区| 布尔津县| 宜川县| 凤冈县| 文登市| 巍山| 攀枝花市| 东山县| 顺平县| 绵竹市| 浙江省| 陆良县| 松阳县| 白朗县| 长乐市| 甘洛县| 沧州市| 涡阳县| 咸丰县| 红原县| 安岳县| 仲巴县|