摘要:目前大多數(shù)嵌入式系統(tǒng)使用基于Flash設(shè)備的文件系統(tǒng),但由于Flash設(shè)備成本較高、速度較慢,并不適合對(duì)數(shù)據(jù)進(jìn)行頻繁的訪問(wèn)和查詢,因此在這種情況下,考慮選用在嵌入式設(shè)備中成本低、容量大、速度快的內(nèi)存上來(lái)建立文件系統(tǒng)。利用Ramdisk技術(shù)在內(nèi)存中模擬磁盤設(shè)備,配置并初始化Ramdisk,在經(jīng)過(guò)分析FAT分區(qū)組織形式的基礎(chǔ)上編寫格式化函數(shù)將Ramdisk格式化為FAT文件系統(tǒng),從而實(shí)現(xiàn)了RTEMS上文件系統(tǒng)的創(chuàng)建。
關(guān)鍵詞:嵌入式文件系統(tǒng);RTEMS;Ramdisk;FAT
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)05-0935-03
Research and Implementation of the Filesystems on RTEMS Based on Ramdisk Technology
LI Shun
(College of Information Engineering, Shenyang Radio and Television University, Shenyang 110003, China)
Abstract: Now most of the embedded systems use the filesystems based on flash media for storing, accessing and managing data, Since flash chips are not suitable for frequent data access and query operations due to high cost and low speed, DRAM is used as a major medium for embedded filesystems. it expatiates on simulating a disk device on DRAM with Ramdisk technology and initializing and configuring this Ramdisk, then programming a function for formatting Ramdisk to implement the filesystem on RTEMS on the basis of understanding FAT partition format.
Key words: embedded filesystem; RTEMS; Ramdisk; FAT
1 概述
RTEMS的全稱是實(shí)時(shí)多處理器系統(tǒng)(Real-Time Executive for Multiprocessor Systems),是前美國(guó)軍方研制的嵌入式系統(tǒng),最早用于美國(guó)國(guó)防系統(tǒng),它的特點(diǎn)是非常的穩(wěn)定,而且速度快,源代碼開(kāi)放。它是面向?qū)ο蟮膶?shí)時(shí)嵌入式系統(tǒng),在RTEMS中,任務(wù)、中斷、內(nèi)存等等都是對(duì)象,RTEMS提供了大量的對(duì)象控制API,能動(dòng)態(tài)管理這些對(duì)象,這些API能大大縮短程序代碼量和開(kāi)發(fā)周期。
在RTEMS上開(kāi)發(fā)Ramdisk,是將Ramdisk設(shè)計(jì)為一個(gè)內(nèi)存中存儲(chǔ)數(shù)據(jù)的塊設(shè)備驅(qū)動(dòng)程序,類似于硬盤,軟盤等其他IDE設(shè)備。它作為一個(gè)塊設(shè)備向系統(tǒng)注冊(cè),有自己的設(shè)備名,這樣應(yīng)用程序就可以通過(guò)設(shè)備名來(lái)訪問(wèn)Ramdisk。RTEMS系統(tǒng)提供了一些統(tǒng)一的標(biāo)準(zhǔn)I/O管理函數(shù),來(lái)屏蔽底層驅(qū)動(dòng)的差異性。使用系統(tǒng)提供的這些管理函數(shù)可以簡(jiǎn)化Ramdisk的設(shè)計(jì),并為應(yīng)用程序提供統(tǒng)一的API接口。
2 Ramdisk技術(shù)
Ramdisk就是從內(nèi)存空間中劃分一部分區(qū)域來(lái)模擬磁盤分區(qū)來(lái)保存數(shù)據(jù),就是把內(nèi)存假設(shè)為一個(gè)磁盤驅(qū)動(dòng)器,并且在它的上面存儲(chǔ)文件。這樣當(dāng)嵌入式系統(tǒng)啟動(dòng)時(shí),將Flash中的數(shù)據(jù)拷貝到Ramdisk中,然后在系統(tǒng)的運(yùn)行過(guò)程中,數(shù)據(jù)操作全部在內(nèi)存中進(jìn)行,大大提高了運(yùn)行的速度。
2.1 Ramdisk技術(shù)的特點(diǎn)
在嵌入式系統(tǒng)中,通常沒(méi)有磁盤設(shè)備,數(shù)據(jù)都存儲(chǔ)在各種不可擦寫或可擦寫的半導(dǎo)體芯片中。當(dāng)需要存儲(chǔ)一些數(shù)據(jù)到Flash上時(shí),可能同時(shí)會(huì)使其它操作變得緩慢,例如當(dāng)調(diào)用一個(gè)寫操作時(shí),就需要等待數(shù)據(jù)完全被寫入,這會(huì)使線程間的通信停頓若干毫秒。在這些情況下,Ramdisk技術(shù)的優(yōu)勢(shì)就顯現(xiàn)出來(lái)。
Ramdisk提高了應(yīng)用程序的速度,像數(shù)據(jù)庫(kù)查詢這些頻繁對(duì)存儲(chǔ)器進(jìn)行讀寫的應(yīng)用將最大程度地發(fā)揮Ramdisk的優(yōu)點(diǎn)。
Ramdisk最大的優(yōu)點(diǎn)是速度快。Ramdisk還具有安全性信息保護(hù)的功能。Ramdisk的另一優(yōu)點(diǎn)是具有高度的耐用性。
Ramdisk是一個(gè)內(nèi)核級(jí)別的驅(qū)動(dòng),它為操作系統(tǒng)提供標(biāo)準(zhǔn)的磁盤驅(qū)動(dòng)。對(duì)Ramdisk進(jìn)行適當(dāng)?shù)呐渲茫蛊湓谙到y(tǒng)啟動(dòng)的時(shí)候自動(dòng)加載存儲(chǔ)器內(nèi)容,在系統(tǒng)關(guān)閉的時(shí)候?qū)?shù)據(jù)保存到存儲(chǔ)器中,也可以選擇性地保存數(shù)據(jù)。
2.2 Ramdisk在系統(tǒng)中的層次結(jié)構(gòu)
Ramdisk驅(qū)動(dòng)層在RTEMS系統(tǒng)中的層次結(jié)構(gòu)如圖1所示,最底層是Ramdisk驅(qū)動(dòng)層,它包含最基本的Ramdisk設(shè)備初始化和對(duì)設(shè)備的打開(kāi)、關(guān)閉、讀、寫、控制驅(qū)動(dòng)函數(shù);驅(qū)動(dòng)層之上是文件系統(tǒng)層,通過(guò)調(diào)用本實(shí)驗(yàn)編寫的格式化函數(shù)對(duì)文件系統(tǒng)進(jìn)行格式化;最上層是應(yīng)用程序?qū)?,是位于文件系統(tǒng)之上的具體的應(yīng)程序。
圖1 Ramdisk在RTEMS中的層次結(jié)構(gòu)
3 Ramdisk驅(qū)動(dòng)
塊設(shè)備驅(qū)動(dòng)要為該塊設(shè)備提供通用的系統(tǒng)調(diào)用,一般是打開(kāi)設(shè)備、關(guān)閉設(shè)備、讀設(shè)備、寫設(shè)備和對(duì)設(shè)備的控制。
3.1 Ramdisk驅(qū)動(dòng)基本操作
Ramdisk作為一種塊操作設(shè)備包含了四個(gè)基本函數(shù):ramdisk_read(),ramdisk_write(),ramdisk_ioctl()和ramdisk_initialize()。
ramdisk_read()函數(shù)為Ramdisk設(shè)備的讀請(qǐng)求處理函數(shù),這個(gè)函數(shù)從Ramdisk中拷貝數(shù)據(jù)到指定的緩沖區(qū),然后調(diào)用callout函數(shù)通知上層服務(wù)數(shù)據(jù)讀取完成。
ramdisk_write()函數(shù)為Ramdisk設(shè)備的寫請(qǐng)求處理函數(shù),該函數(shù)從指定的緩沖區(qū)拷貝數(shù)據(jù)到Ramdisk,然后調(diào)用callout函數(shù)通知上層服務(wù)寫數(shù)據(jù)完成。
ramdisk_ioctl()函數(shù)為特殊的I/O處理函數(shù),用戶可以定義一些系統(tǒng)標(biāo)準(zhǔn)定義接口之外的一些對(duì)設(shè)備的I/O操作,Ramdisk驅(qū)動(dòng)中的ioctl函數(shù)定義了ramdisk_read()和ramdisk_write()兩個(gè)操作,它通過(guò)參數(shù)提供的請(qǐng)求信息來(lái)決定是對(duì)Ramdisk進(jìn)行讀還是寫。
ramdisk_initialize()函數(shù)為Ramdisk設(shè)備初始化函數(shù),它根據(jù)事先配置好的Ramdisk屬性(包括Ramdisk的塊大小,塊數(shù)目,塊在內(nèi)存中的地址等)來(lái)配置適當(dāng)?shù)腞amdisk。只有Ramdisk初始化之后,用戶才能來(lái)操作它。
3.2 Ramdisk驅(qū)動(dòng)數(shù)據(jù)結(jié)構(gòu)
1)內(nèi)部Ramdisk描述符
它定義了Ramdisk的基本屬性,包括塊的大小、個(gè)數(shù)和地址。Ramdisk驅(qū)動(dòng)拷貝數(shù)據(jù)的基本單位是塊,結(jié)構(gòu)體中的每個(gè)變量的具體值在執(zhí)行ramdisk_initialize()的時(shí)候被設(shè)定。
struct ramdisk
{int block_size; /* Ramdisk設(shè)備塊的大小 */
int block_num; /* Ramdisk設(shè)備塊的數(shù)目 */
void *area; /* Ramdisk 塊在內(nèi)存中的地址 */
rtems_boolean initialized; /* Ramdisk初始化標(biāo)志,如果Ramdisk被初始化,該值賦1,否則該值為0 */
rtems_boolean malloced; /* 如果Ramdisk是系統(tǒng)動(dòng)態(tài)分配的內(nèi)存,該值為1,否則該值為0 */
};
2) 塊設(shè)備請(qǐng)求結(jié)構(gòu)
blkdev_request是用來(lái)從塊設(shè)備中讀取或者向塊設(shè)備中寫入一定數(shù)量塊的數(shù)據(jù),該結(jié)構(gòu)體是RTEMS為塊設(shè)備定義的統(tǒng)一標(biāo)準(zhǔn)變量。
typedef struct blkdev_request
{blkdev_request_op req; /* 塊設(shè)備操作請(qǐng)求,讀操作或?qū)懖僮?*/
blkdev_request_cb req_done; /* 返回函數(shù) */
void *done_arg; /* 傳給返回函數(shù)的變量表的地址 */
rtems_status_code status; /* 最后一次I/O操作完成狀態(tài) */
int error; /* 如果status!= RTEMS_SUCCESSFUL,這個(gè)值包含錯(cuò)誤碼,即錯(cuò)誤的類型 */
blkdev_bnum start; /* 開(kāi)始?jí)K號(hào),即I/O操作從第幾塊開(kāi)始 */
rtems_unsigned32 count; /* 進(jìn)行數(shù)據(jù)交換的塊的個(gè)數(shù) */
rtems_unsigned32 bufnum; /* 緩沖池的個(gè)數(shù) */
blkdev_sg_buffer bufs[0]; /* 分散型/聚集型緩沖列表 */
} blkdev_request;
3) Ramdisk主/從設(shè)備號(hào)
主/從設(shè)備號(hào)用來(lái)表示一個(gè)具體的設(shè)備:major是設(shè)備在設(shè)備驅(qū)動(dòng)表中的索引值,通過(guò)該值可以找到該設(shè)備驅(qū)動(dòng)在設(shè)備驅(qū)動(dòng)表中的位置;minor表示同種設(shè)備中的某一具體設(shè)備,例如ramdisk0。
rtems_device_major_number major;
rtems_device_minor_number minor;
4 Ramdisk驅(qū)動(dòng)函數(shù)流程
4.1 ramdisk_read()函數(shù)
函數(shù)原型:static int ramdisk_read(struct ramdisk *rd, blkdev_request *req);
struct ramdisk *rd:指向Ramdisk類型結(jié)構(gòu)的指針
blkdev_request *req:指向READ塊設(shè)備請(qǐng)求結(jié)構(gòu)的指針。返回值為:ioctl返回值
該函數(shù)將數(shù)據(jù)從內(nèi)存拷貝到提供的緩沖區(qū)并調(diào)用函數(shù)通知上層讀操作已完成。如圖2所示。
圖2 ramdisk_read()流程圖
4.2 ramdisk_write()函數(shù)
函數(shù)原型:
static int ramdisk_write(struct ramdisk *rd, blkdev_request *req);
struct ramdisk *rd:指向Ramdisk類型的指針
(下轉(zhuǎn)第954頁(yè))
(上接第937頁(yè))
blkdev_request *req:指向WRITE塊設(shè)備請(qǐng)求結(jié)構(gòu)的指針。返回值為:ioctl。
該函數(shù)從提供的緩沖區(qū)中將數(shù)據(jù)拷貝出來(lái)并調(diào)用函數(shù)通知上層寫操作已完成。如圖3所示。
5 分析與結(jié)論
隨著嵌入式系統(tǒng)硬件設(shè)備的普及和價(jià)格的不斷降低,以及嵌入式系統(tǒng)應(yīng)用領(lǐng)域的不斷擴(kuò)大,應(yīng)用中出現(xiàn)越來(lái)越復(fù)雜的數(shù)據(jù)資源需要管理,因此使用文件系統(tǒng)成為嵌入式系統(tǒng)應(yīng)用的一個(gè)必然趨勢(shì)。
采用Ramdisk技術(shù)在RTEMS系統(tǒng)中建立一個(gè)FAT格式的文件系統(tǒng),解決嵌入式設(shè)備中成本低、容量大、速度快的內(nèi)存上來(lái)建立文件系統(tǒng)的需求。
參考文獻(xiàn):
[1] 宋廷強(qiáng),高樹(shù)靜.控制嵌入式微控制器與處理器設(shè)計(jì)[M]. 北京:社機(jī)械工業(yè)出版社出版,2011.
[2] 王威.嵌入式微控制器So8AW原理與實(shí)踐[M].北京:北京航空航天大學(xué)出版社出版,2009.
[3] Todd D.Morton. 嵌入式微控制器(英文影印版)[M].北京:科學(xué)出版社出版,2002.
[4] 陳忠平.51單片機(jī)C語(yǔ)言程序設(shè)計(jì)經(jīng)典實(shí)例[M].北京:電子工業(yè)出版社出版,2012.
[5] 劉建輝.單片機(jī)智能控制技術(shù)[M].北京:國(guó)防工業(yè)出版社出版,2007.