




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、2013/01OMAP35xx(EL-ARM860)嵌入式系統(tǒng)實(shí)踐教程嵌入式系統(tǒng)實(shí)踐教程 劉彥文劉彥文()說明:本教程可作為EL-ARM860實(shí)驗(yàn)平臺實(shí)驗(yàn)內(nèi)容講授使用。授課可使用劉彥文編著,清華大學(xué)出版社出版的嵌入式系統(tǒng)原理及接口技術(shù)教材。第4章 實(shí)驗(yàn)例程 4.1 讀取、轉(zhuǎn)換時間函數(shù)編程舉例 Linux系統(tǒng)中,涉及到時間較為常用的三個名詞術(shù)語是:n GMT(Greenwich Mean Time),格林尼治標(biāo)準(zhǔn)時間。格林尼治標(biāo)準(zhǔn)時間的正午是指太陽橫穿格林尼治子午線的時間。有時GMT也表示格林尼治那個位置所處的時區(qū)。n UTC(Coordinated Universal Time),世界標(biāo)準(zhǔn)時間
2、,是由原子鐘提供的時間,比格林尼治標(biāo)準(zhǔn)時間更為準(zhǔn)確。UTC是法文單詞首字母的縮寫。n CST(China Standard Time),中國標(biāo)準(zhǔn)時間,或稱北京時間。n我們現(xiàn)在所說的標(biāo)準(zhǔn)時間,通常是指UTC時間。n北京時間CST=UTC+8小時。n另外,本節(jié)中所說的時間,除了我們通常所說的時間外,還包含日期。4.1.1Linux查看、設(shè)置時間的命令 查看時間n使用date命令可以查看時間,通常顯示的是當(dāng)?shù)貢r區(qū)的時間,例如北京時間: rootlocalhost # date 2013年 01月 10日 星期四 16:02:19 CST 上述內(nèi)容分別表示:年、月、日、星期、時、分、秒以及CST,是主
3、機(jī)Linux的輸出。n有的目標(biāo)板,配置為顯示UTC時間,例如: rootTechv_OMAP35xx:# date Thu Jan 10 16:15:31 UTC 2013 設(shè)置時間 主機(jī)Linux設(shè)置時間后,會保留;目標(biāo)板設(shè)置時間后,加電或RESET后不保留。以下是主機(jī)顯示、設(shè)置時間舉例。 使用參數(shù)u表示UTC時間 設(shè)置時間可以使用命令及參數(shù): date u MMDDhhmmYYYY.ss 其中u表示UTC,從MM開始的參數(shù)分別表示月、日、時、分、年和秒。 例如: rootlocalhost # date -u 011016302013.30 2013年 01月 10日 星期四 16:30:
4、30 UTC 系統(tǒng)會將設(shè)置的UTC時間,自動轉(zhuǎn)換成CST時間顯示,例如輸入date命令后,會顯示: rootlocalhost # date 2013年 01月 11日 星期五 00:31:42 CST 不使用參數(shù)u表示按當(dāng)?shù)貢r間設(shè)置 以下設(shè)置沒有設(shè)置秒,缺省值為0: rootlocalhost # date 011016322013 2013年 01月 10日 星期四 16:32:00 CST rootlocalhost # date 2013年 01月 10日 星期四 16:32:11 CST4.1.2 常用的讀取、轉(zhuǎn)換時間的函數(shù)n所有的Linux系統(tǒng),把GMT時間的1970年1月1日0時
5、0分0秒,作為時間的起點(diǎn),所有時間都是從那時起,以經(jīng)過的秒數(shù)來計(jì)算。n時間通過一個預(yù)定義的類型time_t來處理,這是一個以秒計(jì)算的時間的整數(shù)類型,是一個長整型,與處理時間的函數(shù)一起定義在頭文件time.h中。 time()函數(shù) 例如代碼: #include time_t the_time;/*定義類型*/ (void)time(&the_time);/*得到時間值,單位為秒*/ printf(“Raw time is %ldn”,the_time);/*輸出時間值*/ 上述代碼能夠輸出從Linux時間起點(diǎn),到time函數(shù)讀 取那一刻所經(jīng)過的時間的秒數(shù)。 關(guān)于time()函數(shù)進(jìn)一步的用
6、法,見例4.1。 gmtime()函數(shù) gmtime()函數(shù)能夠把以秒表示的時間值,轉(zhuǎn)換成用戶易讀格式的值。 gmtime()函數(shù)把底層時間值分解為一個結(jié)構(gòu),該結(jié)構(gòu)包含一些常用的成員: #include struct tm *gmtime(const time_t timeval); tm結(jié)構(gòu)被定義為至少包含表4-1所示的成員。tm成員成員含義含義tm成員成員含義含義int tm_sec秒,秒,061int tm_year從從1900年算起的年年算起的年數(shù)數(shù)int tm_min分,分,059int tm_wday星期幾,星期幾,06,0表示周日表示周日int tm_hour時,時,023int
7、 tm_yday年份中的日,年份中的日,0365int tm_mday月份中的日,月份中的日,131int tm_isdst是否夏令時是否夏令時int tm_mon月,月,011,0表示表示1月月注:注:tm_sec的范圍允許臨時閏的范圍允許臨時閏1秒或秒或2秒。秒。表表4-1 tm結(jié)構(gòu)至少包含的成員結(jié)構(gòu)至少包含的成員n函數(shù)gmtime()按GMT返回時間。n如果要看當(dāng)?shù)貢r區(qū)的時間,可以使用localtime()函數(shù),使用方法是在程序中,用localtime()函數(shù)代替gmtime()函數(shù)。n有些小規(guī)模的目標(biāo)板,生產(chǎn)商把當(dāng)?shù)貢r區(qū)的時間直接設(shè)置為GMT時間,使用者要引起注意。 ctime()函數(shù)
8、n函數(shù)ctime()返回一個長度為26個字符、有固定格式、表示當(dāng)?shù)貢r間的字符串,函數(shù)格式為: char *ctime(const time_t *timeval);n函數(shù)ctime()輸出字符串格式見例4.1。n函數(shù)ctime()將底層的時間值,即秒值,轉(zhuǎn)換成用戶易讀格式的值。 4.1.3 讀取、轉(zhuǎn)換時間的函數(shù)編程舉例 編程舉例 【例4.1】以下為讀取、轉(zhuǎn)換并輸出時間的程序,程序名為time.c,源程序保存在主機(jī)Linux,路徑為/home/nfs1/01_time。n程序中time()函數(shù)讀取時間的秒值;gmtime()函數(shù)將這個秒值轉(zhuǎn)換成一個結(jié)構(gòu),保存在tm_ptr中;ctime()函數(shù)把
9、秒值轉(zhuǎn)換成一個字符串;printf()函數(shù)將秒值、結(jié)構(gòu)、字符串輸出。sleep(3)函數(shù)表示休眠3秒,然后重復(fù)讀取秒值、轉(zhuǎn)換成結(jié)構(gòu)和字符串輸出。n程序代碼為:#include #include /*#include */int main() struct tm *tm_ptr; time_t the_time; (void)time(&the_time); tm_ptr=gmtime(&the_time); printf(Raw time is %ldn,the_time); printf(date:%2d/%2d/%2dn, tm_ptr-tm_year, tm_ptr-tm
10、_mon+1,tm_ptr-tm_mday); printf(time: %2d/%2d/%2dn, tm_ptr-tm_hour,tm_ptr-tm_min,tm_ptr-tm_sec); printf(The date is:%sn,ctime(&the_time); sleep(3); (void)time(&the_time); tm_ptr=gmtime(&the_time); printf(Raw time is %ldn,the_time); printf(date:%2d/%2d/%2dn, tm_ptr-tm_year,tm_ptr-tm_mon+1,
11、 tm_ptr-tm_mday); printf(time: %2d/%2d/%2dn, tm_ptr-tm_hour,tm_ptr-tm_min, tm_ptr-tm_sec); printf(The date is: %sn,ctime(&the_time); return 0; 程序運(yùn)行結(jié)果解釋 例4.1的源代碼經(jīng)過交叉編譯,產(chǎn)生的可執(zhí)行文件為time,能夠在目標(biāo)板運(yùn)行。 運(yùn)行可執(zhí)行文件前,為了與程序輸出的時間對比,可以先用date命令查看目標(biāo)板的時間: rootTechv_OMAP35xx:/# date Fri Jan 11 10:45:00 UTC 2013在目標(biāo)板運(yùn)行可執(zhí)
12、行文件time,輸出內(nèi)容為:rootTechv_OMAP35xx:/# cd /tmp/01_timerootTechv_OMAP35xx:/var/volatile/tmp/01_time# ./timeRaw time is 1357901145date: 113/ 1/11time: 10/45/45The date is:Fri Jan 11 10:45:45 2013 Raw time is 1357901148 date: 113/ 1/11 time: 10/45/48 The date is: Fri Jan 11 10:45:48 2013 上述內(nèi)容中,Raw time對應(yīng)的
13、是秒數(shù);date對應(yīng)的是113/1/1,表示從1900年算起經(jīng)過113年(2013年)的1月1日,time對應(yīng)的是時/分/秒;然后是ctime()函數(shù)產(chǎn)生的字符串。4.1.4 例4.1對應(yīng)的Makefile文件 對例4.1代碼進(jìn)行編譯的Makefile文件內(nèi)容如下: rootlocalhost 01_time# vi Makefile CC = /usr/local/arm/arm-2007q3/bin/arm-none-linux-gnueabi-gcc all: $(CC) -o time time.c clean: -rm -f *.o time 4.1.5 執(zhí)行例4.1程序前的操作過程
14、舉例 進(jìn)入例4.1程序所在目錄并顯示程序名 rootlocalhost nfs1# cd /home/nfs1/01_time rootlocalhost 01_time# ls -l 總計(jì) 20 -rwxr-xr-x 1 root root 116 11-19 17:09 Makefile -rwxr-xr-x 1 root root 5813 11-19 17:09 time -rwxr-xr-x 1 root root 959 2012-04-16 time.c -rwxr-xr-x 1 root root 1456 2012-04-16 time.o 檢查或設(shè)置主機(jī)、目標(biāo)板IP地址 在
15、主機(jī)終端窗口設(shè)置主機(jī)Linux IP地址 rootlocalhost 01_time# ifconfig eth0 192.168.1.5 在目標(biāo)板終端窗口設(shè)置目標(biāo)板Linux IP地址 Techv_OMAP35xx login: root rootTechv_OMAP35xx:# ifconfig eth0 192.168.1.9 eth0: link down rootTechv_OMAP35xx:# eth0: link up, 100Mbps, full-duplex1 在目標(biāo)板終端窗口測試與主機(jī)網(wǎng)絡(luò)連接狀況 rootTechv_OMAP35xx:# ping 192.168.1.5
16、在目標(biāo)板終端窗口掛接NFS # mount -o soft,nolock,rsize=1024 -v 192.168.1.5:/home/nfs1 /tmp 在主機(jī)終端窗口編譯源程序 rootlocalhost 01_time# make 在目標(biāo)板進(jìn)入相應(yīng)目錄、顯示文件名、執(zhí)行文件 rootTechv_OMAP35xx:/# cd tmp/01_time rootTechv_OMAP35xx:/var/volatile/tmp/01_time# ls Makefile time time.c time.o rootTechv_OMAP35xx:/var/volatile/tmp/01_time
17、# ./time4.2 串行端口及 標(biāo)準(zhǔn)輸入/輸出/錯誤編程舉例4.2.1 串行通信基礎(chǔ) 并行通信及串行通信圖4.1 并行通信及串行通信示意圖(a) 并行通信 (b)串行通信 串行通信基本概念 數(shù)據(jù)傳輸方式n串行通信時,數(shù)據(jù)在兩個站A與B之間的傳輸,可分為單工方式、半雙工方式和全雙工方式三種,如圖4.2所示。圖4.2 串行通信的三種方式 通信速率 通信速率反映數(shù)據(jù)傳輸速度的快慢,主要有數(shù)據(jù)傳輸率和波特率兩個指標(biāo)。 傳輸率 傳輸率定義為每秒傳送二進(jìn)制數(shù)的位數(shù)(亦稱比特?cái)?shù)),以位秒(bps)為單位。傳輸率反映了串行通信的速率。傳輸率等于每秒傳送的字符數(shù)和每個字符位數(shù)的乘積。例如,每秒傳送120個字
18、符,每個字符包含10位(1個起始位,7個數(shù)據(jù)位,1個奇偶校驗(yàn)位,1個停止位),則傳輸率為: 120字符秒10位字符1200bps 波特率 波特率定義為1位二進(jìn)制數(shù)傳送時間的倒數(shù)。每次傳送1位數(shù)時,波特率的大小和傳輸率相等。 一般異步通信的波特率在300波特115200波特之間。 信號的調(diào)制/解調(diào) 串行端口通常用12V表示高、低電平,這些信號在遠(yuǎn)距離傳輸時會發(fā)生衰減和畸變,以致信號傳到接收端時已經(jīng)是一個難以分辨的信號。如果從這樣的信號中提取數(shù)據(jù),會使誤碼率大大上升。解決這個問題的方法是改變信號傳輸?shù)男问?。圖4.3 串行通信使用MODEM對信號進(jìn)行調(diào)制和解調(diào) 通信的方式n串行通信可分為同步傳輸方式
19、和異步傳輸方式兩種。同步通信通??客綍r鐘信號來實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收,同步通信方式目前較少使用。異步通信是一種利用一幀字符中的起始位和停止位來完成收發(fā)同步的通信方式。 n異步通信接口電路以“幀(Frame)”為傳送單位,其中包含了一個字符的信息。一幀由起始位開始,停止位結(jié)束。兩個幀之間為空閑位,一幀信息由712位二進(jìn)制數(shù)組成。其格式如圖4.4所示。每幀數(shù)據(jù)由以下四個部分組成。圖4.4 異步通信數(shù)據(jù)幀格式舉例 串行通信接口n串行通信接口通常僅僅指的是UART,此處我們將電平變換電路和9針D形接插件也放在這里描述。nUART接口有的與微處理器集成在同一個芯片內(nèi),如S3C2410A;也有的與微處理器
20、是分開的,作為一個單獨(dú)的芯片,例如與8086配套使用的8251A。nUART的主要功能有: 接收CPU送來的、以字節(jié)為單位的并行數(shù)據(jù)。 按照CPU送來的控制字,將CPU送來的數(shù)據(jù)變成幀格式,串行輸出。 從串行輸入線上以位為單位讀入數(shù)據(jù),將每一幀變換成一字節(jié)數(shù)據(jù),等待CPU讀取。 判斷數(shù)據(jù)發(fā)送緩沖區(qū)空、接收緩沖區(qū)滿,產(chǎn)生相應(yīng)標(biāo)志或中斷。 檢查是否產(chǎn)生錯誤并設(shè)置相應(yīng)標(biāo)志位。圖4.5 串行通信接口電路組成n連接UART引腳的輸出信號及輸入信號使用正邏輯表示,但是RS-232C標(biāo)準(zhǔn)要求使用負(fù)邏輯。另外RS-232C標(biāo)準(zhǔn)表示邏輯0、1的電平幅值也與TTL電路不同。因此在UART與9針D形接插件之間,必須
21、有電平轉(zhuǎn)換電路,例如MAX3232芯片,可以用作電平轉(zhuǎn)換電路。 RS-232C標(biāo)準(zhǔn)n電子工業(yè)協(xié)會EIA ( Electronic Industries Association)在1969年公布了一個RS-232C串行通信接口標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)對串行接口電路中所使用的信號名稱和功能、信號電平等作了統(tǒng)一的規(guī)定。標(biāo)準(zhǔn)的提出為串行接口部件的互連提供了統(tǒng)一的規(guī)范。nRS-232C串行通信接口標(biāo)準(zhǔn)規(guī)定如下: 信號電平 RS-232C標(biāo)準(zhǔn)采用負(fù)邏輯,規(guī)定邏輯真(true,即邏輯1)在5V15V之間,邏輯假(false,即邏輯0)在+5V+15V之間。通常PC機(jī)串行口使用12V作為典型的高、低電平,但在嵌入式系統(tǒng)
22、中串行口通常使用5V作為典型的高、低電平。這個電平與計(jì)算機(jī)本身及I/O接口芯片使用的TTL電平不匹配。為此,必須要用專門的電路來進(jìn)行電平轉(zhuǎn)換。 典型的電平轉(zhuǎn)換電路,應(yīng)該能夠把TTL電平轉(zhuǎn)換為EIA電平,并且能夠把EIA電平轉(zhuǎn)換為TTL電平。 信號定義 表4-2給出了RS-232C接口的部分常用信號的定義。 接插件 RS-232C一般使用25個引腳或9個引腳的D形接插件(連接器),9針D形接插件較為常用,其外觀如圖4.6所示。圖4.6 9針D形接插件外觀示意圖4.2.2Linux標(biāo)準(zhǔn)輸入/輸出/錯誤系統(tǒng)調(diào)用編程舉例 系統(tǒng)調(diào)用、庫函數(shù)和設(shè)備驅(qū)動程序nLinux中系統(tǒng)調(diào)用、庫函數(shù)和設(shè)備驅(qū)動程序之間的
23、關(guān)系,如圖4.7所示。圖4.7 系統(tǒng)調(diào)用、庫函數(shù)和設(shè)備驅(qū)動程序之間的關(guān)系n由圖4.7可見,用戶程序可以直接使用系統(tǒng)調(diào)用;也可以通過庫函數(shù)(如標(biāo)準(zhǔn)I/O庫函數(shù)對應(yīng)的頭文件是stdio.h),由庫函數(shù)去調(diào)用系統(tǒng)調(diào)用。由系統(tǒng)調(diào)用去調(diào)用設(shè)備驅(qū)動程序,驅(qū)動硬件設(shè)備工作。n系統(tǒng)調(diào)用也是一些函數(shù),它們由Linux直接提供,是通向操作系統(tǒng)本身的接口。nLinux系統(tǒng)把不同的設(shè)備,抽象成不同的文件;對設(shè)備的操作,抽象成對文件的open、read、write、close和ioctl等操作。 Linux標(biāo)準(zhǔn)輸入/輸出/錯誤系統(tǒng)調(diào)用nLinux標(biāo)準(zhǔn)輸入/輸出/錯誤這一術(shù)語的含義,是指標(biāo)準(zhǔn)輸入設(shè)備/標(biāo)準(zhǔn)輸出設(shè)備/標(biāo)準(zhǔn)錯
24、誤輸出設(shè)備。在一個用戶程序運(yùn)行時,系統(tǒng)已經(jīng)打開了這3個設(shè)備,并且返回了相應(yīng)的文件描述符。nLinux環(huán)境中,每個運(yùn)行的程序被稱為進(jìn)程(process),每個進(jìn)程有一些與之相關(guān)聯(lián)的文件描述符。文件描述符是一些小數(shù)值的整數(shù),通常由用戶打開(open)一個文件或設(shè)備時產(chǎn)生的返回值得到。n當(dāng)一個用戶程序開始運(yùn)行時,它一般可以使用3個已經(jīng)打開設(shè)備返回的文件描述符,這3個描述符不是由用戶程序中打開(open)操作返回的,而是由系統(tǒng)產(chǎn)生的。這3個文件描述符是: 0表示標(biāo)準(zhǔn)輸入,例如read(0,&c,1);表示從標(biāo)準(zhǔn)輸入讀入一個字符保存在c中; 1表示標(biāo)準(zhǔn)輸出,例如write(1,&c,1)
25、;表示輸出c中的一個字符到標(biāo)準(zhǔn)輸出; 2表示標(biāo)準(zhǔn)錯誤,例如write(2,&c,1);表示輸出c中的一個字符到標(biāo)準(zhǔn)錯誤。n當(dāng)一個程序運(yùn)行結(jié)束時,也不用通過這3個文件描述符去關(guān)閉(close)對應(yīng)的文件或設(shè)備。 標(biāo)準(zhǔn)輸入/輸出/錯誤與串行端口及仿真終端n嵌入式開發(fā)系統(tǒng)目標(biāo)板上運(yùn)行的程序,通常把標(biāo)準(zhǔn)輸入/輸出/錯誤對應(yīng)的文件,與目標(biāo)板上第一個串行端口,即/dev/tts/0設(shè)備關(guān)聯(lián)起來。對標(biāo)準(zhǔn)輸入/輸出/錯誤的操作,就是對該串行端口的讀、寫操作。由于目標(biāo)板第一個串行端口通過電纜與主機(jī)串行端口連接,主機(jī)Linux系統(tǒng)啟動minicom仿真終端程序后,目標(biāo)板運(yùn)行的程序中的標(biāo)準(zhǔn)輸入系統(tǒng)調(diào)用,讀入
26、的是主機(jī)鍵盤輸入內(nèi)容,而標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤系統(tǒng)調(diào)用將輸出的信息,通過串口送到主機(jī)仿真終端窗口。n使用標(biāo)準(zhǔn)輸入/輸出/錯誤系統(tǒng)調(diào)用時,不需要對串行端口重新設(shè)置波特率、幀格式、有無調(diào)制解調(diào)器等參數(shù),默認(rèn)使用目標(biāo)板Linux內(nèi)核已經(jīng)設(shè)定的值。 Linux標(biāo)準(zhǔn)輸入/輸出/錯誤系統(tǒng)調(diào)用編程舉例 【例4.2】以下程序是使用標(biāo)準(zhǔn)輸入/輸出/錯誤系統(tǒng)調(diào)用的一個示例。n在目標(biāo)板運(yùn)行這個程序后,用戶在主機(jī)minicom終端輸入一個小寫字母并回車,程序會自動輸出全部小寫字母,然后輸出回車;繼續(xù)輸出全部小寫字母,輸出回車;直到用戶按下Ctrl+c,程序終止;如果用戶最初輸入的不是小寫字母,則程序直接退出。n程序代碼如
27、下:#include /*#include */#define FALSE 0#define TRUE 1/*-*/int main()char c;int STOP=FALSE;write(2,test std err output is ok.n,27);/*標(biāo)準(zhǔn)錯誤系統(tǒng)調(diào)用*/write(1,start std input test.n,22); /*標(biāo)準(zhǔn)輸出系統(tǒng)調(diào)用*/write(1,input 1 char from a-z,out a-z string,and reapet.n,49);write (1,if input first char is other char,end.n
28、,39);while (1) read(0,&c,1); /*標(biāo)準(zhǔn)輸入系統(tǒng)調(diào)用*/ if (c z ) STOP=TRUE; break; write(1,the char is from read() function,std input:n ,44); write(1,&c,1); write(1,n std output,send data to terminal:n,36); c=a; while (STOP=FALSE) write(1,&c,1); c+; usleep(100000); if (c=z+1) c=n;write(1,&c,1);c=
29、a; write(1,exit from program.n,19);exit(0);n目標(biāo)板程序執(zhí)行過程中,在主機(jī)仿真終端輸出如下信息: test std err output is ok. start std input test. input 1 char from a-z out a-z string,and reapet. if input first char is other char,end. a std output,send data to terminal: abcdefghijklmnopqrstuvwxyz abc Makefile文件代碼如下: CC = /usr/
30、local/arm/arm-2007q3/bin/arm-none-linux-gnueabi-gcc all: $(CC) -o term term.c clean: -rm -f *.o term4.2.3Linux串行端口編程舉例 文件、設(shè)備及系統(tǒng)調(diào)用nLinux環(huán)境中,文件具有非常重要的意義,文件為操作系統(tǒng)服務(wù),對設(shè)備的操作提供了一個簡單而一致的接口。n在Linux中,一切都是文件。n用戶程序完全可以像使用文件那樣使用盤文件、目錄、串行端口、打印機(jī)及其他設(shè)備。例4.4中,用戶程序?qū)⒁粋€串行端口映射為一個文件,然后使用系統(tǒng)調(diào)用,對這個文件進(jìn)行操作,內(nèi)核通過調(diào)用對應(yīng)的設(shè)備驅(qū)動程序,對串行端
31、口硬件進(jìn)行操作。n用于訪問設(shè)備驅(qū)動程序的系統(tǒng)調(diào)用有: open:打開文件或設(shè)備 read:對打開的文件或設(shè)備執(zhí)行讀操作 write:對打開的文件或設(shè)備執(zhí)行寫操作 close:關(guān)閉文件或設(shè)備 ioctl:把控制信息傳遞給設(shè)備驅(qū)動程序nopen系統(tǒng)調(diào)用,創(chuàng)建了一條到達(dá)文件或設(shè)備的訪問路徑,如果調(diào)用成功,返回一個系統(tǒng)文件描述符,其他幾個系統(tǒng)調(diào)用,能夠使用這個描述符對指定的文件或設(shè)備進(jìn)行操作。nopen系統(tǒng)調(diào)用中常用參數(shù)的含義如下所示: O_RDONLY,規(guī)定以讀方式打開; O_WRONLY,規(guī)定以寫方式打開; O_RDWR,規(guī)定以讀、寫方式打開。nread系統(tǒng)調(diào)用,從文件描述符相關(guān)聯(lián)的文件里,讀入指
32、定字節(jié)個數(shù)的數(shù)據(jù),存入指定的數(shù)據(jù)區(qū)。調(diào)用成功,返回實(shí)際讀入的字節(jié)個數(shù),允許實(shí)際讀入字節(jié)個數(shù)小于指定字節(jié)個數(shù)。如果返回為0,表示未讀入數(shù)據(jù),已到了文件尾;如果返回-1,表示出錯。從目標(biāo)板串口連接的終端鍵盤讀入數(shù)據(jù)時,輸入數(shù)據(jù)后按下回車鍵,數(shù)據(jù)才能由終端程序送到用戶程序的read函數(shù)。nwrite系統(tǒng)調(diào)用,是把寫緩沖區(qū)的指定字節(jié)個數(shù)的數(shù)據(jù),寫入與文件描述符關(guān)聯(lián)的文件中。它的返回值是實(shí)際寫入的字節(jié)數(shù)。如果返回0,表示未寫入任何數(shù)據(jù);如果返回-1,表示調(diào)用中出現(xiàn)了錯誤。nclose系統(tǒng)調(diào)用,用于終止文件描述符與對應(yīng)文件或設(shè)備之間的關(guān)聯(lián)。close調(diào)用成功時返回0,錯誤時返回-1。 串行端口設(shè)備與文件關(guān)
33、聯(lián)及系統(tǒng)調(diào)用舉例n在例4.3代碼中,前半部分是將串行端口/dev/ttyS0與文件關(guān)聯(lián),使用系統(tǒng)調(diào)用對文件進(jìn)行讀寫操作。這些操作實(shí)際上是通過目標(biāo)板指定的串口,對串口連接的主機(jī)Linux下minicom仿真終端,進(jìn)行讀寫操作。例4.3代碼中后半部分,是Linux標(biāo)準(zhǔn)輸入/輸出/錯誤系統(tǒng)調(diào)用,其讀寫操作同樣是對目標(biāo)板連接的主機(jī)Linux下minicom仿真終端進(jìn)行讀寫操作。n例4.3代碼串行端口參數(shù)沒有重新設(shè)置,仍使用系統(tǒng)默認(rèn)的波特率、幀格式,不使用調(diào)制解調(diào)器。n【例4.3】以下程序中,fp是系統(tǒng)文件描述符;nread是實(shí)際讀寫字節(jié)個數(shù);buffer是讀寫緩沖區(qū)。程序先打開/dev/ttyS0文件
34、(串行端口),然后對其讀、寫,最后關(guān)閉。后半部分程序中函數(shù)的含義同例4.2。n程序代碼如下:#include #include #include #include #include #define COM1 /dev/ttyS2/*-*/int main()char buffer80;int nread;int fp;fp=open(COM1,O_RDWR);if (fp=-1) write(2,/dev/ttyS2 open err,exit.n,26); exit (0); write(1,n plese input char string,from /dev/ttyS2:n,43);nr
35、ead=read(fp,buffer,80);if (nread=-1) write(2,/dev/ttyS2 read err,exit.n,26); exit (0); write(1,n- from /dev/ttyS2 read string, out to /dev/tty2:-n,63);if (write(fp,buffer,nread)!=nread) write(2,/dev/ttyS2 write err,exit.n,27); exit(0); else write(fp,from /dev/ttyS2 read char string,has output.ok.n,4
36、8);close(fp);write(1,n please input char string from std in:n,40);nread=read(0,buffer,80);if (nread=-1) write(2,std in read err,exit.n,22); exit(0); write(1,n- from std in read string, out to std out:-n,56);if (write(1,buffer,nread)!=nread) write(2,std out write err,exitn,23);exit (0); else write(1,
37、from std in read char string,has output.nn,42);exit(0);執(zhí)行程序及輸出結(jié)果舉例如下:rootTechv_OMAP35xx:/var/volatile/tmp/03_tty1# ./term plese input char string,from /dev/ttyS2:abcd- from /dev/ttyS2 read string, out to /dev/tty2:-abcdfrom /dev/ttyS2 read char string,has output.ok. please input char string from std
38、 in:qwer- from std in read string, out to std out:-qwerfrom std in read char string,has output.以上程序在目標(biāo)板的/tmp/03_tty1目錄,可執(zhí)行文件名為term。4.2.4C語言標(biāo)準(zhǔn)輸入/輸出/錯誤函數(shù)編程舉例 標(biāo)準(zhǔn)庫函數(shù)n為了給設(shè)備和磁盤文件提供更高層次的接口,Linux發(fā)行版提供了一系列的標(biāo)準(zhǔn)函數(shù)庫,每個庫對應(yīng)一個頭文件,每個頭文件中含有若干函數(shù)原型。高級語言編程使用這些庫函數(shù)時,應(yīng)該包含對應(yīng)的頭文件。 math.h頭文件,包含acos、asin、atan、cos、log等數(shù)學(xué)函數(shù)。 cty
39、pe.h頭文件,包含isalnum、isalpha、iscntrl、isdigit等字符處理函數(shù)。 string.h頭文件,包含memcmp、memcpy、memmove、memset等字符串處理函數(shù)。 stdio.h頭文件,包含fgetc、fopen、fprintf、fread、printf等緩沖文件系統(tǒng)的輸入/輸出函數(shù)。n此外還有動態(tài)內(nèi)存分配函數(shù)對應(yīng)的頭文件stdlib.h(或mallo.h)。 標(biāo)準(zhǔn)I/O庫及自動打開的3個文件流n標(biāo)準(zhǔn)I/O庫(stdio)對應(yīng)的頭文件是stdio.h。n標(biāo)準(zhǔn)I/O庫提供了許多復(fù)雜的函數(shù),用于格式化輸出和掃描輸入,同時能夠滿足設(shè)備的緩沖I/O需求。 n標(biāo)準(zhǔn)I/O庫中常用的庫函數(shù)有: fopen、frea
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三農(nóng)田水利工程規(guī)劃指南
- 蔬菜干項(xiàng)目可行性研究報(bào)告
- 制造業(yè)工業(yè)40智能制造與自動化升級方案
- 五項(xiàng)管理內(nèi)容
- 圖書館網(wǎng)絡(luò)安全評估手冊
- 三農(nóng)村電商平臺搭建方案
- 綠化工程文明施工方案1
- 航天行業(yè)航天器設(shè)計(jì)與制造方案
- 減水劑項(xiàng)目可行性研究報(bào)告
- 項(xiàng)目辦公室設(shè)施使用統(tǒng)計(jì)表
- 拼音瘋狂背古詩(6個單元120首)
- 實(shí)驗(yàn)室安全專項(xiàng)培訓(xùn)
- 電子產(chǎn)品設(shè)計(jì)案例教程(微課版)-基于嘉立創(chuàng)EDA(專業(yè)版) 課件 第3章 多諧振蕩器的PCB設(shè)計(jì)
- 小學(xué)語文命題有效情境設(shè)置初探
- 管理能力測試題大全
- 11、雜物電梯日常巡查和使用狀況記錄-供參考
- 《有關(guān)竹子的古詩》課件
- 2023年廣安市岳池縣事業(yè)單位考試真題
- 【魯迅小說中女性人物的悲劇性分析7600字】
- 陜西省建筑工程施工質(zhì)量驗(yàn)收技術(shù)資料統(tǒng)一用表
- 面試評分表完整版
評論
0/150
提交評論