<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式實(shí)時(shí)操作系統的RAM盤(pán)擴展

嵌入式實(shí)時(shí)操作系統的RAM盤(pán)擴展

作者: 時(shí)間:2006-05-07 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:介紹了一種在實(shí)時(shí)操作系統內核(以下簡(jiǎn)稱(chēng)實(shí)時(shí)內核)上實(shí)現RAM盤(pán)的方法,配合接受用戶(hù)命令的Shell任務(wù),可實(shí)現系統的多任務(wù)動(dòng)態(tài)加載和監控,擴展了實(shí)時(shí)內核的應用領(lǐng)域。實(shí)時(shí)內核采用目前十分流行的免費內核μC/OS-Ⅱ,硬件不臺為通用現場(chǎng)總線(xiàn)控制器系統。

本文引用地址:http://dyxdggzs.com/article/241613.htm

關(guān)鍵詞:μC/OS-Ⅱ內核 系統 通用現場(chǎng)總線(xiàn)控制器(GPFC) ColdFire

1 嵌入式RTOS

目前,嵌入式RTOS的應用領(lǐng)域越來(lái)越廣泛。已經(jīng)有80多個(gè)RTOS廠(chǎng)商生產(chǎn)面向8位、16位、32位、甚至64位微處理器的RTOS產(chǎn)品。商業(yè)的實(shí)時(shí)操作系統如VxWorks,pSOS,VRTX,WindowsCE等功能完善,提供了完備的開(kāi)發(fā)環(huán)境,但大多價(jià)格昂貴,不提供源代碼(即所謂的黑箱)。用戶(hù)不了解其工作機制,更不能進(jìn)行修改和擴展。某些商業(yè)系統還要求用戶(hù)在產(chǎn)品投產(chǎn)后繼續支付軟件費用。這對于國內的用戶(hù)開(kāi)發(fā)中小應用系統來(lái)說(shuō),是一項沉重的負擔。而采用開(kāi)放源代碼的實(shí)時(shí)內核不失為一種選擇。開(kāi)放源代碼的另一個(gè)好處是用戶(hù)可以根據具體需要刪改和擴展功能。本文將以μC/OS-Ⅱ在通用網(wǎng)絡(luò )控制器上的應用為例,說(shuō)明開(kāi)放源代碼的實(shí)時(shí)內核在可擴展性方面的優(yōu)點(diǎn),以及筆者在使用中的一些心得體會(huì )。

2 通用現場(chǎng)總線(xiàn)控制器

GPFC(General Purpose Field bus Controller)——通用現場(chǎng)總線(xiàn)控制器是用于加速器數據采集系統中的網(wǎng)絡(luò )控制器,由德國國家同步輻射實(shí)驗室(DESY)Dr.Clausen Matthias領(lǐng)導的研究小組開(kāi)發(fā)。用于不同種類(lèi)的現場(chǎng)總線(xiàn)、以太網(wǎng)之間的通訊控制,功能相當于不同類(lèi)型子網(wǎng)之間的網(wǎng)關(guān)(關(guān)于GPFC的技術(shù)細節,感興趣的讀者可以查詢(xún)DESY的主頁(yè)http://www.desy.de)。系統微控制器采用Motorola公司68K家庭的32位MCU ColdFire 5206E。在33MHz總線(xiàn)頻率下能達到17MIPS的處理能力。由于ColdFire將片選邏輯電路、總線(xiàn)控制器、DRAM控制模塊等全部集成在MCU內部,使得外轉帳電路室得十分簡(jiǎn)單。系統配有32MB DRAM和1MB Flash RAM,并有兩個(gè)網(wǎng)絡(luò )接口A(yíng)和B。該系統的硬件設計非常靈活,網(wǎng)絡(luò )接口配以不同的驅動(dòng)電路,可支持以太網(wǎng)、CAN、Profibus、MIL1553等多種現場(chǎng)總線(xiàn),實(shí)現網(wǎng)絡(luò )間的連接和控制。只要采用不同的網(wǎng)絡(luò )協(xié)議,就可以連接不同的子網(wǎng),實(shí)現不同的控制。GPFC配以不同的網(wǎng)絡(luò )模塊可以替代目前廣泛使用的VME工控系統,由于舍棄了VME昂貴的機箱、總線(xiàn)板,大幅度減低了主機成本。GPFC系統結構示意如圖1所示。

3 在GPFC上運行RTOS

GPFC的系統軟件基于嵌入式實(shí)時(shí)操作系統,國外是在VxWorks上開(kāi)發(fā)的,主要是兩個(gè)獨立的任務(wù)分別處理兩個(gè)網(wǎng)絡(luò )接口的通訊協(xié)議。為了擴展GPFC的應用范圍,系統軟件包中包含了各種可能用的網(wǎng)絡(luò )協(xié)議,都以獨立的任務(wù)形式存在。用不上的任務(wù)處于休眠狀態(tài),如果需要連接某種類(lèi)型的網(wǎng)絡(luò ),只要運行針對某種網(wǎng)絡(luò )協(xié)議的任務(wù)就行了。

VxWorks價(jià)格昂貴,在國內買(mǎi)一套要幾十萬(wàn)元人民幣。為了滿(mǎn)足國內應用要求,筆者希望尋找一種廉價(jià)的實(shí)時(shí)內核,一方面可降低軟件方面的成本,同時(shí)可根據自己折需要定制軟件。經(jīng)過(guò)調研,決定采用當前十分流行的μC/OS-Ⅱ作為實(shí)時(shí)內核。

μC/OS-Ⅱ是基于優(yōu)先級的搶占式實(shí)時(shí)多任務(wù)內核,其絕大部分代碼是由C寫(xiě)成的。目前已經(jīng)應用于包括Motorola 68000系列,以及Intel 80x86等各種處理器上,在世界控制領(lǐng)域取得了一席之地。μC/OS-Ⅱ的可應用領(lǐng)域非常廣闊,涵蓋了幾乎所有的實(shí)時(shí)應用。μC/OS-Ⅱ是完全免費的,全部源代碼都可以從Internet上獲得。

μC/OS-Ⅱ是面向中小型的。如果包含全部的功能模塊(信號量、消息郵箱、消息隊列及相關(guān)函數),編譯后的μC/OS-Ⅱ內核大約有6KB;如果只保留最核心的代碼,則可壓縮到3KB,這使得μC/OS-Ⅱ可以用于更小模塊的應用系統。同時(shí),由于系統的可擴展性,稍加修改可以用于更大模塊的系統上。RAM的占用與系統中的任務(wù)數有關(guān),任務(wù)的堆棧要占用大量的RAM空間,堆棧的大小取決于任務(wù)的局部變量、緩沖區大小及可能的中斷嵌套的層數。對于一般的中小系統,任務(wù)堆??梢匀装僮止澋綆浊ё止?。對于頻率中斷和高吞吐率的系統,要為任務(wù)預留足夠的堆??臻g。本系統中為每個(gè)任務(wù)分配了512KB的堆棧文憑間,并有堆棧越界檢查。

采用μC/OS-Ⅱ所遇到的主要問(wèn)題是μC/OS-Ⅱ本身不帶文件系統,缺乏調試工具和手段。為了方便調試和日后的管理操作,基于μC/OS-Ⅱ的開(kāi)放源代碼和可擴展性,筆者將Linux的RAM盤(pán)、文件系統和用戶(hù)Shell移植到合并μC/OS-Ⅱ上并編寫(xiě)了內存管理模塊,實(shí)現內存的動(dòng)態(tài)分配和釋放。系統中運行的任務(wù)可以對RAM盤(pán)進(jìn)行文件操作,文件系統可以為任務(wù)保存數據并提供了統一的接口。通過(guò)Shell任務(wù),用戶(hù)可以登錄到系統中,運行或者掛起任務(wù),以處理不同的通訊協(xié)議,實(shí)現任務(wù)的動(dòng)態(tài)管理。在調試過(guò)程中,可以通過(guò)命令查看各個(gè)任務(wù)的運行狀態(tài)。而任務(wù)以文件的形式保存在RAM盤(pán)中,不同種類(lèi)的任務(wù)保存在不同的目錄中,方便了管理和維護。

4 RAM盤(pán)的擴展方法

RAM盤(pán)采用了和Linux EXT2系統類(lèi)似的文件系統。EXT2是一種高效、安全的文件系統。圖2是EXT2的邏輯布局。它由一個(gè)引導塊和重復的塊組組成,每個(gè)塊組又由超級塊、組描述符表、塊位圖、索引節點(diǎn)位圖、索引節點(diǎn)表、數據區組成。文件以樹(shù)型目錄形式組成。不同點(diǎn)在于磁盤(pán)文件系統的操作單元是磁盤(pán)塊,而RAM盤(pán)所操作的單元是內存塊。在筆者為GPFC設計的RAM盤(pán)中,將內存最高端的4MB劃分為RAM盤(pán)空間,每一個(gè)邏輯塊為512字節。限于篇幅所限,關(guān)于EXT2系統的細節,請感興趣的讀者參考有關(guān)Linux文件系統的資源,本文主要介紹如何在RAM盤(pán)中實(shí)現及主要的數據結構。

其中引導塊存系統的引導代碼,由于RAM盤(pán)不用來(lái)引導系統,所以可不必設定引導塊。超級塊用來(lái)存放EXT2文件系統整體信息的數據結構,是EXT2的核心所在。超級塊記錄文件系統當前狀態(tài),盤(pán)有多大,能存放多少文件,何處可以找找到空閑和用于文件系統管理的信息。用于管理磁盤(pán)的超級塊非常復雜,用于RAM盤(pán)則可對其進(jìn)行簡(jiǎn)化,簡(jiǎn)化后的ram_super_block結構如下:

struct ram_super_block

{

long s_inodes_count; /*文件系統中節點(diǎn)總線(xiàn)*/

long s_blocks_count; /*文件系統中的塊總數*/

long s_r_blocks_cout; /*為超級用戶(hù)保留的塊數*/

long s_free_blocks_count; /*文件系統中空閑塊總數*/

long s_free_inodes_coutnt;/*文件系統中空閑節點(diǎn)總數*/

long s_first_data_block; /*文件系統中的第一個(gè)數據塊*/

long s_log_block_size; /*系統邏輯塊的大小*/

short s_inode_size; /*索引節點(diǎn)結構的大小*/

short s_state;/*文件系統的狀態(tài)*/

time_t s_wtime;/*超級塊最后一次修改的時(shí)間*/

}

在文件系統中每一個(gè)文件(包含目錄)占據一個(gè)索引節點(diǎn)表項。索引節點(diǎn)是一個(gè)記錄文件信息的數據結構dinode。訪(fǎng)問(wèn)文件,其它就是尋找文件對應的索引節點(diǎn)。索引節點(diǎn)集中保存在索引節點(diǎn)表中,索引節點(diǎn)表的第一頂固定為根目錄對應的索引節點(diǎn)。用于管理RAM盤(pán)文件的dinode定義如下:

struct Dinode{

short di_node; /*文件模式:是文件還是目錄,是可讀、可寫(xiě)還是可執行*/

short di_nlink; /*和文件相關(guān)的鏈接數*/

short di_uid; /*文件所有者的標示*/

short di_gid; /*文件所有者的組標示*/

long di_size; /*文件大小*/

char di_addr[ ]; /*文件數據所在的邏輯塊編號*/

time_t di_atime; /*文件最后一次訪(fǎng)問(wèn)的時(shí)間*/

time_t di_mtime; /*文件最后一次修改的時(shí)間*/

time_t di_ctime; /*文件建立的時(shí)間*/

}

塊位圖、索引節點(diǎn)位圖用于查找空閑的RAM盤(pán)內存塊和索引節點(diǎn)表現。

與文件訪(fǎng)問(wèn)過(guò)程相關(guān)的一個(gè)主要函數為i_name(),其輸入參數為希望訪(fǎng)問(wèn)的文件路徑名,輸出值為文件對應的索引節點(diǎn)號。獲得了文件的索引節點(diǎn)號,就可以在索引節點(diǎn)表中找到該節點(diǎn),從節點(diǎn)的數據結構中就可以知道文件的種類(lèi)、存儲位置等信息,進(jìn)一步就可以讀寫(xiě)操作。

RAM盤(pán)屬于Linux標準設備中的塊設備。作為標準設備,Linux提供了通用的接口函數。用戶(hù)可以直接調用標準接口函數對RAM盤(pán)進(jìn)行操作:

#includesys/types.h>

#includesys/stat.h>

#includefcntl.h>

#includeunistd.h>

int open(const char pathname,int flag); /*打開(kāi)文件,返回文件描述符*/

int close(int fd); /*關(guān)閉文件*/

int read(int fd,void buf,int count); /*從文件中讀出數據到緩沖區,返回讀出的字節數*/

int write(int fd,void buf,int count);/*從緩沖區寫(xiě)數據到文件,返回寫(xiě)入字節數*/

5 用戶(hù)Shell的擴展與實(shí)現

用戶(hù)Shell是一個(gè)在μC/OS-Ⅱ下獨立運行的任務(wù)。Shell啟動(dòng)后,完成一些必要的初始化操作,進(jìn)入掛起狀態(tài),等待用戶(hù)登錄和輸入。用戶(hù)從終端上輸入命令后將喚醒Shell,在筆者設計的Shell程序中可接受的命令包括:cd(改變RAM盤(pán)當前目錄),pwd(顯示RAM盤(pán)當前目錄),mkdir、rmdir(在RAM盤(pán)創(chuàng )立或刪除目錄),ps(顯示當前系統中任務(wù)狀態(tài)),kill(終止一一個(gè)任務(wù)的運行)。處理不同通訊協(xié)議的任務(wù)分別以可執行文件形式保存在RAM盤(pán)上不同的目錄中。如果在Shell中鍵入任務(wù)的名稱(chēng),Shell會(huì )在當前目錄下查找是否有匹配的可執行文件。如果有,則調用μC/OS-Ⅱ中的系統函數OSTaskCreate創(chuàng )立一個(gè)新的任務(wù),否則返回錯誤信息。也可以使用kill命令,調用系統函數OSTaskDel終止一個(gè)任務(wù)的運行。在程序的調試期間,可以使用ps命令查看任務(wù)運行狀態(tài)。

由于μC/OS-Ⅱ的內存管理功能有限,OSTaskCreate函數不能動(dòng)態(tài)分配堆??臻g,OSTaskDel也不能釋放任務(wù)的堆??臻g。為此,筆者重新編寫(xiě)了內存管理模塊,采用頁(yè)方式和首次擬合算法實(shí)現內存的動(dòng)態(tài)管理。每一內存頁(yè)為2KB,系統的內存資源由一個(gè)雙向鏈表進(jìn)行管理。任務(wù)函數可調用OSMemAlloc()t OSMemFree()分配釋放自己所占的內存空間。OSMemAlloc()在空閑內存鏈表中查詢(xún)每一個(gè)符合要求的內存塊,并分配給任務(wù)。而OSMemFree()則是將釋放后的內存塊重新添加進(jìn)空閑內存鏈表中。

在開(kāi)發(fā)過(guò)程中,筆者感覺(jué)到采用開(kāi)放源代碼的實(shí)時(shí)內核的最大優(yōu)點(diǎn)是可擴展性和可裁剪性,可以根據需要定制出最精練的內核結構。μC/OS-Ⅱ的本意是為中小型嵌入式系統設計的,對于不需要的部分,可以刪改;當內核缺乏某些功能,設計得很容易自行設計和添加,從而可以應用在更大型的系統上。其性能可以同昂跺的商業(yè)實(shí)時(shí)操作系統的相媲美,而這種改動(dòng)和擴展并不難。這正是開(kāi)放源代碼軟件的生命力所在。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>