資料介紹
應用實例的編寫實際上已經不屬于Linux操作系統移植的范疇,但是為了保證本系列文章的完整性,這里提供一系列針對嵌入式Linux開發應用程序的實例。
編寫Linux應用程序要用到如下工具:
(1)編譯器:GCC
GCC是Linux平臺下最重要的開發工具,它是GNU的C和C++編譯器,其基本用法為:gcc[options][filenames]。
我們應該使用arm-linux-gcc。
?。?)調試器:GDB
gdb是一個用來調試C和C++程序的強力調試器,我們能通過它進行一系列調試工作,包括設置斷點、觀查變量、單步等。
我們應該使用arm-linux-gdb。
?。?)Make
GNUMake的主要工作是讀進一個文本文件,稱為makefile。這個文件記錄了哪些文件由哪些文件產生,用什么命令來產生。Make依靠此makefile中的信息檢查磁盤上的文件,如果目的文件的創建或修改時間比它的一個依靠文件舊的話,make就執行相應的命令,以便更新目的文件。
Makefile中的編譯規則要相應地使用arm-linux-版本。
?。?)代碼編輯
可以使用傳統的vi編輯器,但最好采用emacs軟件,它具備語法高亮、版本控制等附帶功能。
在宿主機上用上述工具完成應用程序的開發后,可以通過如下途徑將程序下載到目標板上運行:
?。?)通過串口通信協議rz將程序下載到目標板的文件系統中(感謝Linux提供了rz這樣的一個命令);
?。?)通過ftp通信協議從宿主機上的ftp目錄里將程序下載到目標板的文件系統中;
?。?)將程序拷入U盤,在目標機上mountU盤,運行U盤中的程序;
?。?)如果目標機Linux使用NFS文件系統,則可以直接將程序拷入到宿主機相應的目錄內,在目標機Linux中可以直接使用。
1.文件編程
Linux的文件操作API涉及到創建、打開、讀寫和關閉文件。
創建
intcreat(constchar*filename,mode_tmode);
參數mode指定新建文件的存取權限,它同umask一起決定文件的最終權限(mode&umask),其中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]=‘’;
printf(“%sn”,str);
close(fd);
}
2.進程控制/通信編程
進程控制中主要涉及到進程的創建、睡眠和退出等,在Linux中主要提供了fork、exec、clone的進程創建方法,sleep的進程睡眠和exit的進程退出調用,另外Linux還提供了父進程等待子進程結束的系統調用wait。
fork
對于沒有接觸過Unix/Linux操作系統的人來說,fork是最難理解的概念之一,因為它執行一次卻返回兩個值,以前“聞所未聞”。先看下面的程序:
intmain()
{
inti;
if(fork()==0)
{
for(i=1;i《3;i++)
printf(“Thisischildprocessn”);
}
else
{
for(i=1;i《3;i++)
printf(“Thisisparentprocessn”);
}
}
執行結果為:
Thisischildprocess
Thisischildprocess
Thisisparentprocess
Thisisparentprocess
fork在英文中是“分叉”的意思,一個進程在運行中,如果使用了fork,就產生了另一個進程,于是進程就“分叉”了。當前進程為父進程,通過fork()會產生一個子進程。對于父進程,fork函數返回子程序的進程號而對于子程序,fork函數則返回零,這就是一個函數返回兩次的本質。
exec
在Linux中可使用exec函數族,包含多個函數(execl、execlp、execle、execv、execve和execvp),被用于啟動一個指定路徑和文件名的進程。exec函數族的特點體現在:某進程一旦調用了exec類函數,正在執行的程序就被干掉了,系統把代碼段替換成新的程序(由exec類函數執行)的代碼,并且原有的數據段和堆棧段也被廢棄,新的數據段與堆棧段被分配,但是進程號卻被保留。也就是說,exec執行的結果為:系統認為正在執行的還是原先的進程,但是進程對應的程序被替換了。
編寫Linux應用程序要用到如下工具:
(1)編譯器:GCC
GCC是Linux平臺下最重要的開發工具,它是GNU的C和C++編譯器,其基本用法為:gcc[options][filenames]。
我們應該使用arm-linux-gcc。
?。?)調試器:GDB
gdb是一個用來調試C和C++程序的強力調試器,我們能通過它進行一系列調試工作,包括設置斷點、觀查變量、單步等。
我們應該使用arm-linux-gdb。
?。?)Make
GNUMake的主要工作是讀進一個文本文件,稱為makefile。這個文件記錄了哪些文件由哪些文件產生,用什么命令來產生。Make依靠此makefile中的信息檢查磁盤上的文件,如果目的文件的創建或修改時間比它的一個依靠文件舊的話,make就執行相應的命令,以便更新目的文件。
Makefile中的編譯規則要相應地使用arm-linux-版本。
?。?)代碼編輯
可以使用傳統的vi編輯器,但最好采用emacs軟件,它具備語法高亮、版本控制等附帶功能。
在宿主機上用上述工具完成應用程序的開發后,可以通過如下途徑將程序下載到目標板上運行:
?。?)通過串口通信協議rz將程序下載到目標板的文件系統中(感謝Linux提供了rz這樣的一個命令);
?。?)通過ftp通信協議從宿主機上的ftp目錄里將程序下載到目標板的文件系統中;
?。?)將程序拷入U盤,在目標機上mountU盤,運行U盤中的程序;
?。?)如果目標機Linux使用NFS文件系統,則可以直接將程序拷入到宿主機相應的目錄內,在目標機Linux中可以直接使用。
1.文件編程
Linux的文件操作API涉及到創建、打開、讀寫和關閉文件。
創建
intcreat(constchar*filename,mode_tmode);
參數mode指定新建文件的存取權限,它同umask一起決定文件的最終權限(mode&umask),其中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]=‘’;
printf(“%sn”,str);
close(fd);
}
2.進程控制/通信編程
進程控制中主要涉及到進程的創建、睡眠和退出等,在Linux中主要提供了fork、exec、clone的進程創建方法,sleep的進程睡眠和exit的進程退出調用,另外Linux還提供了父進程等待子進程結束的系統調用wait。
fork
對于沒有接觸過Unix/Linux操作系統的人來說,fork是最難理解的概念之一,因為它執行一次卻返回兩個值,以前“聞所未聞”。先看下面的程序:
intmain()
{
inti;
if(fork()==0)
{
for(i=1;i《3;i++)
printf(“Thisischildprocessn”);
}
else
{
for(i=1;i《3;i++)
printf(“Thisisparentprocessn”);
}
}
執行結果為:
Thisischildprocess
Thisischildprocess
Thisisparentprocess
Thisisparentprocess
fork在英文中是“分叉”的意思,一個進程在運行中,如果使用了fork,就產生了另一個進程,于是進程就“分叉”了。當前進程為父進程,通過fork()會產生一個子進程。對于父進程,fork函數返回子程序的進程號而對于子程序,fork函數則返回零,這就是一個函數返回兩次的本質。
exec
在Linux中可使用exec函數族,包含多個函數(execl、execlp、execle、execv、execve和execvp),被用于啟動一個指定路徑和文件名的進程。exec函數族的特點體現在:某進程一旦調用了exec類函數,正在執行的程序就被干掉了,系統把代碼段替換成新的程序(由exec類函數執行)的代碼,并且原有的數據段和堆棧段也被廢棄,新的數據段與堆棧段被分配,但是進程號卻被保留。也就是說,exec執行的結果為:系統認為正在執行的還是原先的進程,但是進程對應的程序被替換了。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 【Linux】嵌入式Linux系統的移植(上篇:交叉編譯器、連接方式)
- 【嵌入式】基于ARM的嵌入式Linux開發總結
- ARM11嵌入式系統Linux下LCD的驅動的設計
- 基于arm的嵌入式linux內核的裁剪移植
- 基于ARM和Linux的嵌入式遠程視頻監控系統的設計
- 嵌入式實時操作系統FreeRTOS在ARM7上移植實現
- 如何使用ARM進行嵌入式linux的系統設計
- 基于TMS320DM6467的嵌入式Linux操作系統移植的研究 3次下載
- 基于DSP的嵌入式Linux內核移植的研究與實現_王曉東 1次下載
- 嵌入式ARM系統原理與實例開發 0次下載
- 基于ARM9的嵌入式導航計算機Linux系統移植_本科畢業設計 0次下載
- ARM嵌入式系統硬件設計及應用實例 802次下載
- 嵌入式Linux在s3c2440上的移植研究 67次下載
- 基于ARM-Linux的嵌入式系統GUI開發研究
- 嵌入式Linux系統的移植研究
- 嵌入式系統應用實例的詳細資料介紹 4604次閱讀
- 基于嵌入式Linux內核的ARM9運行實現方式介紹 1475次閱讀
- 基于ARM的嵌入式操作系統該如何設計 1480次閱讀
- 基于Yocto Project的定制嵌入式Linux產品設計淺析 1w次閱讀
- 基于32位ARM920T內核的微處理器的嵌入式Linux系統構建詳解 1776次閱讀
- 基于嵌入式Linux系統下Mini GUI的移植方法與過程詳解 3549次閱讀
- 基于嵌入式Linux系統的Bootloader模型在MIPS64上的移植設計淺析 853次閱讀
- 關于嵌入式Linux在PMP消費類電子產品上的應用探討淺析 947次閱讀
- 從RTOS到嵌入式Linux的應用移植步驟以及相關的關鍵技術分析 3186次閱讀
- 關于Linux嵌入式操作系統的優勢特征詳解 5521次閱讀
- ARM嵌入式系統硬件設計及應用實例詳解 1w次閱讀
- 嵌入式C實現延時程序的不同變量的區別 幾種Linux嵌入式開發環境的簡單介紹 1566次閱讀
- 嵌入式Linux系統移植的實現 2210次閱讀
- 如何將Linux2.4移植到ARM平臺的嵌入式系統 3659次閱讀
- 基于Linux的嵌入式實時操作系統的研究 2298次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 6基于FPGA的C8051F單片機開發板設計
- 0.70 MB | 2次下載 | 免費
- 751單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21548次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多