當(dāng)前位置:首頁 > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]摘要:介紹了一種在嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核(以下簡(jiǎn)稱實(shí)時(shí)內(nèi)核)上實(shí)現(xiàn)RAM盤的方法,配合接受用戶命令的Shell任務(wù),可實(shí)現(xiàn)嵌入式系統(tǒng)的多任務(wù)動(dòng)態(tài)加載和監(jiān)控,擴(kuò)展了實(shí)時(shí)內(nèi)核

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

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

1 嵌入式RTOS

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

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

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

3 在GPFC上運(yùn)行RTOS

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

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

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

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

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

4 RAM盤的擴(kuò)展方法

RAM盤采用了和Linux EXT2系統(tǒng)類似的文件系統(tǒng)。EXT2是一種高效、安全的文件系統(tǒng)。圖2是EXT2的邏輯布局。

它由一個(gè)引導(dǎo)塊和重復(fù)的塊組組成,每個(gè)塊組又由超級(jí)塊、組描述符表、塊位圖、索引節(jié)點(diǎn)位圖、索引節(jié)點(diǎn)表、數(shù)據(jù)區(qū)組成。文件以樹型目錄形式組成。不同點(diǎn)在于磁盤文件系統(tǒng)的操作單元是磁盤塊,而RAM盤所操作的單元是內(nèi)存塊。在筆者為GPFC設(shè)計(jì)的RAM盤中,將內(nèi)存最高端的4MB劃分為RAM盤空間,每一個(gè)邏輯塊為512字節(jié)。限于篇幅所限,關(guān)于EXT2系統(tǒng)的細(xì)節(jié),請(qǐng)感興趣的讀者參考有關(guān)Linux文件系統(tǒng)的資源,本文主要介紹如何在RAM盤中實(shí)現(xiàn)及主要的數(shù)據(jù)結(jié)構(gòu)。

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

struct ram_super_block

{

long s_inodes_count; /*文件系統(tǒng)中節(jié)點(diǎn)總線*/

long s_blocks_count; /*文件系統(tǒng)中的塊總數(shù)*/[!--empirenews.page--]

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

long s_free_blocks_count; /*文件系統(tǒng)中空閑塊總數(shù)*/

long s_free_inodes_coutnt;/*文件系統(tǒng)中空閑節(jié)點(diǎn)總數(shù)*/

long s_first_data_block; /*文件系統(tǒng)中的第一個(gè)數(shù)據(jù)塊*/

long s_log_block_size; /*系統(tǒng)邏輯塊的大小*/

short s_inode_size; /*索引節(jié)點(diǎn)結(jié)構(gòu)的大小*/

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

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

}

在文件系統(tǒng)中每一個(gè)文件(包含目錄)占據(jù)一個(gè)索引節(jié)點(diǎn)表項(xiàng)。索引節(jié)點(diǎn)是一個(gè)記錄文件信息的數(shù)據(jù)結(jié)構(gòu)dinode。訪問文件,其它就是尋找文件對(duì)應(yīng)的索引節(jié)點(diǎn)。索引節(jié)點(diǎn)集中保存在索引節(jié)點(diǎn)表中,索引節(jié)點(diǎn)表的第一頂固定為根目錄對(duì)應(yīng)的索引節(jié)點(diǎn)。用于管理RAM盤文件的dinode定義如下:

struct Dinode{

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

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

short di_uid; /*文件所有者的標(biāo)示*/

short di_gid; /*文件所有者的組標(biāo)示*/

long di_size; /*文件大小*/

char di_addr[ ]; /*文件數(shù)據(jù)所在的邏輯塊編號(hào)*/

time_t di_atime; /*文件最后一次訪問的時(shí)間*/

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

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

}

塊位圖、索引節(jié)點(diǎn)位圖用于查找空閑的RAM盤內(nèi)存塊和索引節(jié)點(diǎn)表現(xiàn)。

與文件訪問過程相關(guān)的一個(gè)主要函數(shù)為i_name(),其輸入?yún)?shù)為希望訪問的文件路徑名,輸出值為文件對(duì)應(yīng)的索引節(jié)點(diǎn)號(hào)。獲得了文件的索引節(jié)點(diǎn)號(hào),就可以在索引節(jié)點(diǎn)表中找到該節(jié)點(diǎn),從節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)中就可以知道文件的種類、存儲(chǔ)位置等信息,進(jìn)一步就可以讀寫操作。

RAM盤屬于Linux標(biāo)準(zhǔn)設(shè)備中的塊設(shè)備。作為標(biāo)準(zhǔn)設(shè)備,Linux提供了通用的接口函數(shù)。用戶可以直接調(diào)用標(biāo)準(zhǔn)接口函數(shù)對(duì)RAM盤進(jìn)行操作:

#include

#include

#include

#include

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

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

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

int write(int fd,void buf,int count);/*從緩沖區(qū)寫數(shù)據(jù)到文件,返回寫入字節(jié)數(shù)*/

5 用戶Shell的擴(kuò)展與實(shí)現(xiàn)

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

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

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

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉