<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è) > 嵌入式系統 > 設計應用 > uC/OS-II在A(yíng)DSP―BF531上的移植

uC/OS-II在A(yíng)DSP―BF531上的移植

作者: 時(shí)間:2006-03-02 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要:介紹源代碼公開(kāi)的實(shí)時(shí)操作系統μC/OS-II的特點(diǎn)、內核結構及―BF53l的硬件特征,同時(shí)給出將μC/0S-II-型數字信號處理器上的詳細步驟和關(guān)鍵代碼。

關(guān)鍵詞:RTOS;μC/OS-II;-BF53l;

引言

隨著(zhù)計算機技術(shù)的發(fā)展,嵌入式系統的應用愈來(lái)愈廣泛,對人們的生活產(chǎn)生了巨大的影響。通常,嵌入式系統的軟件部分都應用了實(shí)時(shí)操作系統(簡(jiǎn)稱(chēng)RTOS),在特定的RTOS之上開(kāi)發(fā)應用軟件,可以讓程序開(kāi)發(fā)人員屏蔽掉許多底層硬件細節,提高軟件功能設計效率,簡(jiǎn)化開(kāi)發(fā)難度,同時(shí)使得程序調試方便,簡(jiǎn)單,易維護,大大縮短開(kāi)發(fā)周期,RTOS也因此越來(lái)越受到嵌入式系統開(kāi)發(fā)人員的青睞。目前實(shí)時(shí)操作系統很多,如VxWorks、Windows CE、pSOS等,但這些軟件的價(jià)格和使用成本(版權費、維護費等)都十分昂貴,因此商業(yè)級RTOS軟件在使用上受到諸多的限制。而μC/OS-II則不同,它的源代碼是全部公開(kāi)的,并且完全免費,是一個(gè)自由操作系統,程序開(kāi)發(fā)人員可以改寫(xiě)其中的源代碼使之符合自己的要求。由于其極強的可移植性和可裁減性,用戶(hù)可以根據自己的需要,裁剪掉不需要的部分,使操作系統變得小巧靈活,同時(shí)又能夠滿(mǎn)足用戶(hù)特定操作系統的需要。μC/OS-II的可靠性完全可以與商業(yè)級RTOS軟件相媲美,因此筆者在移植過(guò)程中選用了這一實(shí)時(shí)操作系統。

1 ADSP―的硬件特征

Blackfin系列中的ADSP―型數字信號處理器是由ADl和Intel公司合作,針對音頻和視頻信號的編解碼、手持設備和移動(dòng)通信設備而研發(fā)的16位定點(diǎn)處理器,是建立在微信號架構基礎之上,集高性能數字信號處理器與微控制器于一身。ADSP-BF53l的內核工作頻率最高可達400MHz,處理器內核中包含2個(gè)16位MAC、2個(gè)40位ALU及4個(gè)8位ALU。專(zhuān)門(mén)用于視頻信號的處理;還集成了許多片上外設,包括硬件UART、SPI接口、PPI接口、同步串口、看門(mén)狗電路、16個(gè)GPIO接口等。為了達到降低功耗的目的,該處理器具有多種工作模式,同時(shí)通過(guò)編程還可以動(dòng)態(tài)改變處理器內核的工作頻率和電壓.這些特性都為手持設備提供了絕佳的選擇。用戶(hù)可以利用ADI公司提供的VisualDSP++3.0(或更高版本)集成開(kāi)發(fā)環(huán)境對處理器進(jìn)行編程、調試和開(kāi)發(fā)。

2 實(shí)時(shí)操作系統介紹

μC/OS-II是一種專(zhuān)門(mén)為微處理器設計的占先式實(shí)時(shí)多任務(wù)操作系統,具有源代碼公開(kāi)、可移植性和可裁減性強、代碼可固化、穩定性和可靠性高等特點(diǎn)。其內核主要提供任務(wù)管理、內存管理、時(shí)間管理等服務(wù),系統最多可以支持64個(gè)任務(wù)(8個(gè)留于系統),每個(gè)任務(wù)均有自己獨立的優(yōu)先級。由于內核為占先式的,因此總是運行優(yōu)先級最高的任務(wù)。系統提供了豐富的函數可供調用,實(shí)現任務(wù)間的通信和切換。μ/OS-II的大部分代碼都是使用標準的A-NIS C編寫(xiě)的.只有與處理器相關(guān)的一部分代碼使用匯編語(yǔ)言.因此具有極強的移植性,在大多數8位、16位和32位處理器上都能穩定的運行。

圖1示出μC/OS-II的軟硬件體系結構。從圖中可以看出,要實(shí)現μC/OS-II的移植,必須為其編寫(xiě)OS_CPU.H、0S_CPU_C.C和OS_CPU_A.ASM 3個(gè)文件,這3個(gè)文件都與處理器的硬件特性相關(guān),提供任務(wù)切換和系統時(shí)鐘功能。其余源文件的代碼都是公開(kāi)的,可以直接從μC/OS-II的官方網(wǎng)站下載。

3對編譯器的要求

雖然μC/OS-II具有很強的移植性,但在移植時(shí),對處理器的編譯器有如下幾點(diǎn)要求:

處理器的C編譯器能夠產(chǎn)生可重人代碼;

用C語(yǔ)言可以打開(kāi)和關(guān)閉中斷;

處理器支持中斷,并且能夠產(chǎn)生定時(shí)中斷;

處理器能夠容納一定量數據的硬件堆棧;

處理器有將堆棧指針和其他CPU寄存器讀出和存儲到堆??臻g或內存中的指令。

ADSP-BF531型處理器的集成開(kāi)發(fā)環(huán)境Visu-al++3.0通過(guò)關(guān)鍵字asm能在C代碼中嵌入匯編語(yǔ)言,同時(shí)內核定時(shí)器可以為系統提供定時(shí)中斷,總數量達20kbyte的片上數據RAM和SP、FP、USP 3個(gè)堆棧指針寄存器為操作系統各任務(wù)提供了豐富的硬件堆??臻g及對堆棧的方便操作。筆者正是在這些基礎上利用Visual++3.0編譯環(huán)境成功地完成了對ADSP-BF531處理器的μC/OS-II移植。

4 移植μJLC/OS-II

4.1重定義OS_CPIJ.H文件

4.1.1與編譯器相關(guān)的數據類(lèi)型

不同的處理器有不同的字長(cháng),μC/OS-II不使用C的short、int、long等與編譯器相關(guān)的數據類(lèi)型,而是重新定義了一系列類(lèi)型以確保系統的可移植性,在系統移植時(shí)必須在OS_CPU.H頭文件中對這些數據類(lèi)型重新定義,具體內容如下:

typedef unsigned char BOOLEAN

typedef unsigned char INT8U

typedef signed char INT8S

typedef unsigned short INTl6U

typedef signed short INTl6S

typedef unsigned int INT32U

typedef signed int INT32S

μC/OS-II中的指針根據處理器堆棧數據入口寬度定義為OS_STK類(lèi)型:

typedef unsigned int OS_STK

4.1.2臨界代碼

RTOS在進(jìn)入系統臨界區之前都必須先關(guān)中斷,退出后再開(kāi)中斷,μC/OS-II定義了2個(gè)宏指令來(lái)關(guān)閉/打開(kāi)中斷:

#define OS_ENTER_CRITICAL0

asm(“cli%O:”:”=d”(InterrupLach))

#define OS_EXIT_CRITICAL()

asm(“sti%0:”::”=d”(InterrupLaeh))

其中InterrupLaeh為一全局變量,用于開(kāi)關(guān)中斷時(shí)

IMASK寄存器內容的恢復和保存。

4.1.3堆棧增長(cháng)方向設定

在OS CPU.H頭文件中還必須根據處理器堆棧的增長(cháng)方向對OS_STK_GROWTH進(jìn)行宏定義,由于A(yíng)DSP-BF531是按照由高地址到低地址的結構組織處理器堆棧,因此宏定義如下:

#define OS_STK_GROWTH 1

4.1.4 OS_TASK_SW0宏定義

OS_TASK_SW0在μC/OS-II從低優(yōu)先級任務(wù)切換到高優(yōu)先級任務(wù)時(shí)被調用,定義如下:

#define OS_TASK_sw() asm(“raise 13;”)

4.2編寫(xiě)OS_CPU_C.C文件

μC/OS-lI的移植要求用戶(hù)在OS_CPU_C.C文件中編寫(xiě)6個(gè)簡(jiǎn)單的C函數,其中主要是完成OS-TaskStkInit (),其余5個(gè)函數可以不作處理。OS-TaskStkInit()負責任務(wù)堆棧的初始化,使得任務(wù)堆??雌饋?lái)就像剛發(fā)生過(guò)中斷并將所有的寄存器保存到堆棧中的情形一樣。不同的編譯器在函數調用時(shí)有不同的入棧方法,因此在具體實(shí)現時(shí)必須根據處理器的編譯環(huán)境進(jìn)行調整。VisualDSP++3.0在函數調用時(shí)的堆棧結構如圖2所示。

OSTaskStkInit()調用時(shí)需要傳遞任務(wù)代碼起始地址(task)、用戶(hù)參數指針(pdata)、任務(wù)堆棧頂端的地址(堆棧棧頂指針ptos)、返回參數為新任務(wù)堆棧棧頂指針,函數原型如下:

void OSTaskStkInit()

{OS_STK*stk;

stk=(void *)ptos;

opt=opt;

*stk--=fINT32U)pdata;//用戶(hù)數據區

*stk--=fINT32U)(task);//RETI寄存器

*stk--=fINT32U)ptos;//FP寄存器

(由于需要入棧的寄存器數量比較多,限于篇幅,在此省略其中多數)

*stk--=fINT32U)0; //SEQSq、AT寄存器

*stk--=fINT32U)0;//ASTAT寄存器

retum((void*)stk);}

任務(wù)建立時(shí)調用該函數對新建任務(wù)的堆棧進(jìn)行初始化,初始化后的堆棧結構如圖3所示。

4.3編寫(xiě)OS_CPU_A.ASM文件

μC/OS-II移植的最后還需要用戶(hù)編寫(xiě)4個(gè)重要的匯編函數,包括OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()及OSTickISR()。分別介紹如下:

4.3.1 OSStartltighRdy()函數

該函數由OSStart()調用,用以運行優(yōu)先級最高的就緒任務(wù),其運行過(guò)程:調用用戶(hù)定義的OS-TaskSwHook()數→獲取任務(wù)堆棧指針→置位全局

變量0SRunning 出棧CPU寄存器 中斷返回。在A(yíng)DSP-BF531中的實(shí)現如下:

_OSStartHighRdy:

call_OSTaskSwHook;

p0.1=_OSTCBHighRdy;

p0.h=_0STCBHighRdy;

pl=[p0];

ssync;

sp=[p1];

p0.1=_OSRunning;

p0.h=_OSRunning;

r0=TRUE;

[p0]=r0;

ASTAT=[sp++];

SEQSTAT=[sp++];

FP =[sp++];

RETI=[sp++;

rti;

4.3.2 OSCtxSw()函數

實(shí)時(shí)操作系統內任務(wù)級的切換是通過(guò)處理器的軟中斷實(shí)現的,并且軟中斷服務(wù)例程的向量地址必須指向OSCtxSw()函數,因此該函數的匯編程序代碼如下:

_OSCtxSw:

[--sp]=RETI;

[--sp]=FP;

[--sp]=SEQTAT;

[--sp]=ASTAT;

p0.1=_OSTCBCur;

p0.h=_OSTCBCur;

pl=[p0];

ssync;

[pl]=sp;

call_OSTaskSwHook;

p0.1 =_OSPrioHighRdy;

p0.h=_OSPrioHighRdy;

r0=[p0];

p0.1=_0SPrioCur;

p0.h=_OSPrioCur;

[p0]=r0;

p0.1=_OSTCBHighRdy;

p0.h=_OSTCBHighRdy;

pl=[p0];

rO=[p0];

ssync;

sp=[p1];

p0.1=_OSTCBCur;

p0.h=_OSTCBCur;

[p0]:r0; 、

ASTAT=[sp++];

SEQSTAT=[sp++];

FP:[SP++];

RETI=[sp++];

rti;

4.3.3 OSIntCtxSw()函數

OSIntCtxSw()用于實(shí)現中斷級任務(wù)切換,由于該函數在中斷服務(wù)程序中調用,因此在函數代碼中不需要寄存器入棧,但堆棧結構中還包含了一些用戶(hù)不需要的函數調用返回地址,因此該函數必須在最初清理堆棧(調整堆棧指針的位置),其匯編程序代碼如下:

_OSIntCtxSw:

p0=20;

sp=sp+p0;

p0.1=_OSTCBCur;

p0.h=_OSTCBCur;

pl=[p0];

ssync;

[p1]=sp;

call_OSTaskSwHook;

p0.1=_OSPrioHighRdy;

p0.h=_OSPrioHighRdy;

r0=[p0];

p0.1=_OSPrioCur;

p0.h=_OSPfioCur;

[po]=10;

p0.1=_OSTCBHighRdy;

p0.h=_OSTCBHighRdy;

pl=[p0];

r0=[p0];

ssync;

sp=[p1];

p0.1=_OSTCBCur;

p0.h=_0STCBCur;

[po】=r0;

ASTAT=[sp++];

SEQSTAT=[sp++];

FP =[sp++];

RETI=[sp++];

rti;

4.3.4 OSTicklSR()函數

μ,C/OS-II要求用戶(hù)提供一個(gè)時(shí)鐘資源來(lái)實(shí)現時(shí)間的延時(shí)和期滿(mǎn)功能。筆者在移植過(guò)程中使用內核定時(shí)器產(chǎn)生時(shí)鐘節拍,并通過(guò)定時(shí)器中斷服務(wù)例程O(píng)STickISR0實(shí)現任務(wù)切換等功能,該函數的匯編程序代碼如下:

_OSTicklSR:

[--sp】=RETI;

[--sp]=FP;

[--sp]=SEQTAT;

[--sp]=ASTAT;

call_OSIntEnter;

call_OSTimeTick;

call_OSIntExit;

ASTAT=[sp++];

SEQSTAT=[sp++];

FP =[sp++];

RETI=[sp++];

rti;

4.4程序下載及調試

完成以上文件的修改和編寫(xiě)之后。就可在Vi-sualDSP++3.0環(huán)境中對所有的源文件進(jìn)行編譯和連接,生成處理器可執行的.dxe文件,通過(guò)JTAG直接下載到處理器內核的程序區運行。由于VisualD-SP++3.0提供了強大的調試功能,用戶(hù)能夠很清楚地了解μC/OS--II在處理器內的運行情況,這無(wú)疑也對μC/OS-Ⅱ向ADSP―BF531移植提供了強大的支持。

5 結束語(yǔ)

詳細介紹了向ADSP―BF531型處理器移植μC/OS-II實(shí)時(shí)操作系統的步驟和與處理器相關(guān)函數的代碼編寫(xiě),并成功地進(jìn)行移植。通過(guò)測試,實(shí)時(shí)操作系統各任務(wù)之間的調用、中斷處理、任務(wù)之間的通信等都能夠穩定的運行。μC/OS-II實(shí)時(shí)操作系統的使用。將程序員從冗繁的流程圖中解放出來(lái),使得應用程序的設計過(guò)程大大簡(jiǎn)化,并且程序的可讀性、擴展性、可靠性也得到了很大的改善。

------------

關(guān)于μC/OS-II系列軟件版權的說(shuō)明

Micrium 公司產(chǎn)品包括μC/OS-II,μC/GUI,uC/FS,μC/TCP-IP,μC/USB等。Micrium 公司提供嵌入式系統應用方面的產(chǎn)品,并對其軟件擁有知識產(chǎn)權。Micrium花費了大量的時(shí)間和財力為嵌入式領(lǐng)域提供高質(zhì)量的軟件產(chǎn)品。所有上述產(chǎn)品都以源代碼的形式提供給客戶(hù),具有極大的適用性。產(chǎn)品不是免費軟件,也不是開(kāi)放源碼的軟件,因此,不能免費使用,需要清楚的闡明μC/OS-II和系列的軟件不是開(kāi)放源碼的免費軟件,這是和Linux完全不一樣的。

開(kāi)發(fā)和研究者可以通過(guò)購買(mǎi)Micrium公司的Jean先生的μC/OS-II的書(shū)籍,而得到μC/OS-II源代碼,但是僅可以作為個(gè)人和學(xué)校學(xué)習使用,所有和μC/OS-II直接和間接相關(guān)的商業(yè)目的行為,必須購買(mǎi)使用μC/OS-II及系列產(chǎn)品的商業(yè)授權,包括芯片/單板/系統廠(chǎng)家的任何參考設計,教學(xué)設備和最終的產(chǎn)品,如果沒(méi)有得到Micrium公司Jean先生簽字的合法授權都是不合法的使用, 這在μC/OS-II的書(shū)籍Micrium公司(www.micrium.com)和中國代理商-北京麥克泰軟件公司網(wǎng)站(www.bmrtech.com)上面中有明確規定。

Micrium公司其它軟件如μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等的銷(xiāo)售模式與μC/OS-II不同,如果沒(méi)有購買(mǎi)使用授權,完全不可以擁有該源代碼,也不能將源代碼用于產(chǎn)品的設計,培訓,教學(xué)和生產(chǎn)。

μC/OS-II, μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等授權方式有:?jiǎn)蝹€(gè)產(chǎn)品、產(chǎn)品線(xiàn)(系列)、按照CPU 劃分的產(chǎn)品三種形式,μC/OS-KA,μC/OS-VIEW 等工具是按照使用人的數目收取費用的,相對起傳統的RTOS 動(dòng)輒2-3萬(wàn)美圓的開(kāi)發(fā)費用和每塊單板的使用費(根據數量從數百到幾個(gè)美圓),μC/OS-II及系列產(chǎn)品是采用一次性的收費方式,應該只是大約相當于傳統RTOS 的10-20% 的總體費用。

如果您正在將μC/OS-II系列軟件用于您的產(chǎn)品,您需要購買(mǎi)并獲得正式使用授權。

北京麥克泰軟件技術(shù)有限公司



關(guān)鍵詞: 移植 BF531 ADSP uC/OS-II

評論


相關(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>