當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]μC/OS2Ⅱ在軍用FM80386EX處理器上的移植應(yīng)用

μC/OS-Ⅱ是實(shí)時(shí)操作系統(tǒng)(RTOS),已經(jīng)通過(guò)了非常嚴(yán)格的測(cè)試,得到了美國(guó)航空管理局(FederalAviationAdministration)的認(rèn)證.μC/OS-Ⅱ功能強(qiáng)大,支持56個(gè)用戶任務(wù),其內(nèi)核為占先式,支持信號(hào)量、郵箱、消息隊(duì)列等多種常用的進(jìn)程通信機(jī)制,現(xiàn)已成功應(yīng)用到眾多商業(yè)嵌入式系統(tǒng)中,是1種成熟穩(wěn)定的實(shí)時(shí)內(nèi)核.與大多商用RTOS不同的是,μC/OS-Ⅱ公開(kāi)所有的源代碼,90%的代碼使用標(biāo)準(zhǔn)的ANSIC語(yǔ)言書寫,程序可讀性強(qiáng),移植性好.同時(shí),它可以免費(fèi)獲得,即使商業(yè)應(yīng)用也只收取少量的許可費(fèi)用.因此,對(duì)μC/OS-Ⅱ?qū)崟r(shí)操作系統(tǒng)的學(xué)習(xí)研究、開(kāi)發(fā)、應(yīng)用具有重要的意義.

  軍用FM80386EX嵌入式處理器是1種高度集成,32位總線結(jié)構(gòu),專為惡劣環(huán)境下的嵌入式控制應(yīng)用優(yōu)化設(shè)計(jì)的全靜態(tài)CPU.它采用16位外部數(shù)據(jù)總線,26位地址總線及Intel系統(tǒng)管理模式(SMM),能在廉價(jià)的16位硬件系統(tǒng)中運(yùn)行32位程序,可將基于Intel386架構(gòu)的大量軟件應(yīng)用于嵌入式系統(tǒng).為了有效地管理多任務(wù),以及滿足系統(tǒng)的實(shí)時(shí)性要求,常常需要使用實(shí)時(shí)嵌入式操作系統(tǒng).

  要移植μC/OS-Ⅱ,處理器必須滿足以下要求:處理器的C編譯器能產(chǎn)生可重入代碼;用C語(yǔ)言可以打開(kāi)和關(guān)閉中斷;處理器支持中斷,并且能產(chǎn)生定時(shí)中斷;處理器能容納一定數(shù)量的硬件堆棧;處理器有將堆棧指針和其他CPU寄存器讀出、存儲(chǔ)到堆?;騼?nèi)存中的指令.FM80386EX滿足以上條件,可以進(jìn)行μC/OS-Ⅱ的移植.

  μC/OS-Ⅱ?qū)崟r(shí)操作系統(tǒng)結(jié)構(gòu)

  應(yīng)用程序處于整個(gè)系統(tǒng)的頂層,每個(gè)任務(wù)都可以認(rèn)為自己獨(dú)占了CPU,因此任務(wù)被設(shè)計(jì)成了1個(gè)無(wú)限循環(huán).而μC/OS-Ⅱ與處理器無(wú)關(guān)的代碼提供了該實(shí)時(shí)系統(tǒng)的系統(tǒng)服務(wù),應(yīng)用程序利用這些API函數(shù)進(jìn)行內(nèi)存管理,任務(wù)間的通信以及創(chuàng)建、刪除任務(wù)等.μC/OS-Ⅱ的代碼大部分是使用ANSIC書寫,與微處理器硬件相關(guān)的部分使用匯編語(yǔ)言編寫,并且匯編語(yǔ)言編寫的部分已經(jīng)壓倒最低限度,因此μC/OS-Ⅱ的可移植性好.而處理器80386具有堆棧指針、CPU內(nèi)部寄存器入棧、出棧指令.所使用的C編譯器BorlandC3.1支持內(nèi)嵌匯編,使得關(guān)中斷和開(kāi)中斷能在C語(yǔ)言程序中實(shí)現(xiàn).

  實(shí)時(shí)內(nèi)核μC/OS-Ⅱ在FM80386EX上的移植

  我們使用BorlandC3.1編譯器移植μC/OS-Ⅱ主要包括以下幾個(gè)步驟:

  編寫OS-CPU.A.ASM

  這里要實(shí)現(xiàn)4個(gè)匯編函數(shù)改寫:多任務(wù)啟動(dòng)函數(shù)中調(diào)用OSOSTartHighRdy(),任務(wù)切換函數(shù)OSCtxSw(),中斷任務(wù)切換函數(shù)OSIntCtrSw(),時(shí)鐘節(jié)拍服務(wù)函數(shù)OSTickISR().

  1) OSStartHighRdy()函數(shù).該函數(shù)被OSStart()函數(shù)調(diào)用,功能是運(yùn)行優(yōu)先級(jí)最高的就緒任務(wù),其主要代碼如下:

2) OSCtxSW()函數(shù).該函數(shù)被OS-Sched()函數(shù)調(diào)用,通常是用匯編語(yǔ)言編寫的,因?yàn)镃編譯器不能從C語(yǔ)言中

直接處理CPU寄存器.OSCtxSW()的功能是在任務(wù)級(jí)實(shí)現(xiàn)任務(wù)切換,任務(wù)切換是模擬軟中斷來(lái)實(shí)現(xiàn)的,其主要代碼如下:

圖1任務(wù)級(jí)任務(wù)切換時(shí)的堆棧結(jié)構(gòu)

  3) OSIntCtxSw( )函數(shù).該函數(shù)只能在中斷子程序里被OSIntExit()函數(shù)調(diào)用.由于中斷的產(chǎn)生可能引起任務(wù)切換,在中斷服務(wù)程序的最后會(huì)調(diào)用OSIntExit()函數(shù)來(lái)檢查任務(wù)就緒狀態(tài),如果滿足任務(wù)切換條件,則OSIntExit()調(diào)用此函數(shù)實(shí)現(xiàn)任務(wù)切換,除了不應(yīng)調(diào)用任務(wù)切換函數(shù)OS-TASK-SW()外,其余代碼與-OSCtxSw相同.

  4) OSTickISR( )函數(shù).發(fā)生中斷時(shí),CPU的中斷向量會(huì)指向該ISR.其主要代碼如下:

一般情況下,產(chǎn)生調(diào)用OSTickISR()函數(shù)時(shí),時(shí)鐘節(jié)拍的設(shè)備應(yīng)設(shè)置成每隔10~100ms產(chǎn)生1次中斷.必須在多任務(wù)系統(tǒng)啟動(dòng)以后,也就是在調(diào)用OSStart()之后,再開(kāi)啟時(shí)鐘節(jié)拍器.

  用C語(yǔ)言編寫6個(gè)操作系統(tǒng)相關(guān)的函數(shù)

后5個(gè)函數(shù)是鉤子函數(shù),可以不加代碼:

設(shè)置OS-CPU.H中與處理器和編譯器相關(guān)的代碼

  80386處理器的堆棧從內(nèi)存高地址向低地址遞減,所以把OS-STK-GROWTH置1.

完成上述工作后,μC/OS-Ⅱ就可以運(yùn)行在80386處理器上了.另外根據(jù)用戶需求按需配置OS-CFG.H,裁減μC/OS-Ⅱ,使之占用盡量少的內(nèi)存.

[!--empirenews.page--] 測(cè)試

  為了驗(yàn)證μC/OS-Ⅱ內(nèi)核運(yùn)行的正確性,編寫了以下測(cè)試程序:系統(tǒng)時(shí)鐘周期設(shè)為20ms,設(shè)置4個(gè)任務(wù),Task1.Task4,任務(wù)的優(yōu)先級(jí)分別為4,5,6,7,每個(gè)任務(wù)都有1個(gè)變量TasknData;任務(wù)1和任務(wù)2延時(shí)50個(gè)系統(tǒng)周期,任務(wù)3和任務(wù)4延時(shí)100個(gè)系統(tǒng)周期,每執(zhí)行1次任務(wù)循環(huán),將該任務(wù)的變量加1,如下:

 每次運(yùn)行10s,觀察OSTime變量與TasknData的值.其中OSTime記錄了系統(tǒng)時(shí)鐘數(shù).初值均為0,10s后,得到如下的值:

結(jié)果分析:10s系統(tǒng)時(shí)鐘應(yīng)該是10×50=500≈510;任務(wù)1和任務(wù)2每個(gè)循環(huán)延時(shí)50個(gè)系統(tǒng)周期,也就是1s,所以10s內(nèi)應(yīng)該運(yùn)行10次;任務(wù)3與任務(wù)4在10s內(nèi)應(yīng)該運(yùn)行5次;上面的結(jié)果可以證明內(nèi)核已經(jīng)正常運(yùn)行,并實(shí)現(xiàn)基本任務(wù)調(diào)度;為了便于分析程序運(yùn)行的先后順序,在每個(gè)任務(wù)中加入myprintf語(yǔ)句,把任務(wù)4改為打印任務(wù),為最低.在任務(wù)1中加入1個(gè)發(fā)送郵箱,任務(wù)2中加入接受郵箱.

運(yùn)行10s后,PC串口接受到如下數(shù)據(jù)(省略“Iamthetask”前綴):2a1a2b2a1b31a2b2a1b2b1b31a2b2a1b1a2b1b3.....從該次試驗(yàn)結(jié)果分析可看出,內(nèi)核的通訊功能運(yùn)行正常.

  移植分析

  1) 在中斷子程序里啟動(dòng)任務(wù)的方法.使用μC/OS-Ⅱ嵌入式操作系統(tǒng)后,為了縮短中斷處理時(shí)間,常常需要將某些比較費(fèi)時(shí)的程序作為任務(wù)從中斷子程序里獨(dú)立出來(lái),同時(shí),這個(gè)任務(wù)又需要由中斷來(lái)激活.我們可以通過(guò)信號(hào)量、郵箱、消息隊(duì)列來(lái)實(shí)現(xiàn)這個(gè)目的.以郵箱為例,在C程序中,需要先創(chuàng)建郵箱MyMbox,在調(diào)用OSMboxPend()函數(shù)等待消息,在中斷子程序里發(fā)送就可以了.

  2) μC/OS-Ⅱ內(nèi)存管理不夠完善.在μC/OS-Ⅱ的應(yīng)用實(shí)例中我們發(fā)現(xiàn),在不知道系統(tǒng)初始化后給用戶留下了多少自由內(nèi)存空間的情況下,很難定義內(nèi)存分區(qū)所使用數(shù)組的大小.定義大了,造成內(nèi)存的浪費(fèi);定義小了,系統(tǒng)會(huì)崩潰.我們通過(guò)把連續(xù)的大塊內(nèi)存按分區(qū)管理來(lái)解決上述問(wèn)題.

  3) 對(duì)代碼臨界區(qū)的改進(jìn).對(duì)于內(nèi)核程序,在較長(zhǎng)的臨界段代碼中插入可重入點(diǎn);對(duì)于可供用戶調(diào)用的函數(shù)用信號(hào)量機(jī)制改寫1遍,主要是改寫有關(guān)信號(hào)量的函數(shù).

  4) 系統(tǒng)時(shí)鐘中斷的改進(jìn).μC/OS-Ⅱ中,系統(tǒng)時(shí)鐘中斷的核心函數(shù)是OSTimeTick,該函數(shù)查找每1個(gè)延時(shí)的任務(wù)是否到期,如果到期則將其放入就緒列表,也就是內(nèi)核只提供延時(shí)OSTimeDly()函數(shù).但在許多情況下需要延時(shí)一定時(shí)間以觸發(fā)某1個(gè)事件的發(fā)生,或者需要1個(gè)定時(shí)器.這里借鑒了Linux內(nèi)核原理,引入了32個(gè)靜態(tài)定時(shí)器.

  運(yùn)行時(shí)需要注意的問(wèn)題

  由于DOS下的C編譯器提供的運(yùn)行庫(kù)沒(méi)有考慮多線程應(yīng)用的問(wèn)題,運(yùn)行庫(kù)中的全局變量和部分函數(shù)只適用于單線程.這些函數(shù)包括errno,-doserrno,strtok,sterror,tmpnam,tmpfile,asctime,gmtime,ecvt,fcvt等.在μC/OS-Ⅱ中使用這些函數(shù)時(shí)應(yīng)注意,要避免2個(gè)任務(wù)同時(shí)調(diào)用這些函數(shù),我們可以使用信號(hào)量同步對(duì)這些函數(shù)進(jìn)行調(diào)用.DOS是不能重入的,在調(diào)用DOS服務(wù)期間,是不能再次調(diào)用DOS的,否則會(huì)引起系統(tǒng)的崩潰.所以在μC/OS-Ⅱ中,可以調(diào)用BIOS或直接操縱硬件,但應(yīng)盡量減少DOS重入.

  結(jié)語(yǔ)

  μC/OS-Ⅱ和其他一些著名的嵌入式操作系統(tǒng)不同,它的啟動(dòng)過(guò)程比較簡(jiǎn)單.μC/OS-Ⅱ的內(nèi)核是和應(yīng)用程序放在一起編譯成1個(gè)文件,使用者只需要把這個(gè)文件轉(zhuǎn)換格式寫入ROM中就可以運(yùn)行了.上電后,它會(huì)和普通程序一樣運(yùn)行.通過(guò)詳細(xì)研究μC/OS-Ⅱ的特點(diǎn)和內(nèi)核結(jié)構(gòu),完成了μC/OS-Ⅱ在軍用FM80386EX上的移植并對(duì)相關(guān)代碼并詳盡的對(duì)內(nèi)核進(jìn)行測(cè)試、分析,對(duì)內(nèi)存管理、代碼臨界區(qū)、信號(hào)量機(jī)制提出改進(jìn)方法,使之更加有效的在處理器上運(yùn)行.移植成功后,μC/OS-Ⅱ可實(shí)時(shí)的完成各個(gè)任務(wù)的調(diào)度,并且通過(guò)嵌入式操作系統(tǒng)μC/OS-Ⅱ在各個(gè)任務(wù)間實(shí)現(xiàn)通信.μC/OS-Ⅱ具有良好的實(shí)時(shí)性和很小的代碼量,隨著各種智能嵌入式系統(tǒng)的復(fù)雜化和系統(tǒng)實(shí)時(shí)性需求的提高,功能強(qiáng)大的實(shí)時(shí)操作系統(tǒng)μC/OS-Ⅱ?qū)?huì)有更大的發(fā)展空間.

本站聲明: 本文章由作者或相關(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工具的開(kāi)發(fā)耗時(shí)1.5...

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

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(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ì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

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

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(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)閉