《VxWorks7編程指南》筆記(八)——I/O系統:標準I/O

目錄

1.VxWorks配置標準I/O

2.關於標準I/O和緩衝


VxWorks提供了一個完全支持ANSI C的標準I/O包(stdio.h),因此與Unix和Windows的標準I/O包兼容。

1.VxWorks配置標準I/O

對於VxWorks內核,主要的傳統標準I/O函數由一個VxWorks組件提供,少數的函數由其他組件提供。這種模塊化的方法使系統僅包含常用的函數功能組件,從而降低對系統內存的佔用。

如下組件提供了標準的I/O函數:

  • INCLUDE_ANSI_STDIO:提供ANSI標準I/O函數。
  • INCLUDE_FORMATTED_IO:提供fioLib庫(非緩衝的),包括了非ANSI標準的I/O函數,如oprintf()和fdprintf()。

fioLib中的函數不適用由標準I/O庫ansiStdio所提供的緩衝I/O機制。所以就算VxWorks中沒有包括ansiStdio庫,也可以使用fioLib中的函數。

 

2.關於標準I/O和緩衝

當應用程序執行很多小數據量的讀寫操作時,使用由標準I/O提供的帶緩衝的I/O函數將比基礎的不具備緩衝的I/O函數有更好的性能。

儘管VxWorks I/O系統是高效的,但是對於每個低層次調用(基礎I/O)還是存在一些問題。首先,I/O系統從設備獨立的用戶調用(read()、write())需要轉換到與該調用對應的設備相關函數上。其次,當一個設備驅動同時被多個用戶調用時,驅動需要執行互斥或隊列操作。

因爲VxWorks原語執行非常快,所以這些問題影響較小。然而,如果應用程序每次只從文件中讀取一個字符,那麼還是會放大這些問題所帶來的影響。例如按照如下方式調用read:

n=read(fd,&char,1);

爲了使這種類型的I/O更加高效、靈活,標準I/O機制實現了一個緩衝方案,允許數據按照大塊進行讀寫,並按照私有的方式進行緩衝。這種緩衝對應用而言是透明度;該過程由標準I/O函數和宏自動處理。

當使用標準I/O函數創建和打開一個文件時,通常會與該文件流相關聯。可以使用fopen()打開一個文件,語法如下:

fp=fopen("/path/file","r");

fopen()函數返回一個FILE對象的指針(由FILE*聲明),即一個文件指針。FILE對象中包含了供標準I/O庫管理文件流所使用的各種信息,包括I/O真正使用的文件描述符,供文件流使用的緩衝區信息,等等。

注意:RTP最多僅允許使用fopen()打開20個文件描述符。

已經打開的文件描述符可以通過調用fdopen()與一個FILE緩衝區相關聯。語法如下:

fp=fdopen(fd,"r");

當時用fopen()打開文件後,可以使用fread()函數進行讀取,或使用getc()函數一次讀一個字符。同樣可以調用fwrite()和putc()。FILE緩衝區將在調用fclose()之後釋放。

用於從文件讀取或寫入數據的函數和宏是非常高效的。他們直接使用指針的方式對數據的讀寫進行操作。僅當讀緩衝區爲空或寫緩衝區爲滿的時候纔會調用底層的讀或寫函數。

注意:對於一個特定的任務,標準I/O緩衝區和指針都是私有的。它們不會使用信號量或任何其他互斥機制進行互鎖,因爲這樣將降低私有緩衝器方案的效率。所以,多個任務不應該在同一時間操作同一個stdio FILE指針。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章