<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è) > 嵌入式系統 > 設計應用 > μC/OS-II在S3C44BOX處理器上的移植

μC/OS-II在S3C44BOX處理器上的移植

作者: 時(shí)間:2004-12-10 來(lái)源:網(wǎng)絡(luò ) 收藏
摘要:介紹實(shí)時(shí)操作系統μ的特點(diǎn)和內核結構,給出μ在Samsung嵌入式 ARM7微上的的步驟及詳細相關(guān)代碼,同時(shí)闡述μ在應用中應注意的問(wèn)題。

關(guān)鍵詞:μC/OS-II 實(shí)時(shí)操作系統

μC/OS-II功能強大,支持56個(gè)用戶(hù)任務(wù),其內核為占先式,支持信號量、郵箱、消息隊列等多種常用的進(jìn)程間通信機制,現已成功應用到眾多商業(yè)嵌入式系統中,是一個(gè)成熟穩定的實(shí)時(shí)內核。與大多商用RTOS不同的是,μC/OS-II公開(kāi)所有的源代碼,90%的代碼使用標準的ANSI C語(yǔ)言書(shū)寫(xiě),程序可讀性強、性好;同時(shí)它可免費獲得,即使商業(yè)應用也只收取少量的許可費用。因此,對μC/OS-II實(shí)時(shí)操作系統的學(xué)習研究、開(kāi)發(fā)、應用具有重要意義。

Samsung S3C44B0X微是三星公司專(zhuān)為手持設備和其它嵌入式應用提供的高性?xún)r(jià)比的微控制器解決方案。它使用ARM公司的16位/32位RISC結構,內核是ARM7TDMI,工作在66MHz,片上集成了以下部件:8K Cache、外部存儲器控制器、LCD控制器、4個(gè)DMA通道、2個(gè)UART、1個(gè)多主I2C總線(xiàn)控制器、1個(gè)I2C總線(xiàn)控制器,以及5通道PWM定時(shí)器和1個(gè)內部定時(shí)器、8通道12位ADC等,能夠與常用的外圍設備實(shí)現無(wú)縫連接,功能強大。目前,國內應用較為廣泛。

1
μC/OS-II實(shí)時(shí)操作系統結構

圖1說(shuō)明了μC/OS-II的軟硬件體系結構。應用程序處于整個(gè)系統的頂層,每個(gè)任務(wù)都可以認為自已獨占了CPU,因而可以設計成為一個(gè)無(wú)限循環(huán)。μC/OS-II無(wú)關(guān)的代碼提供了μC/OS-II的系統服務(wù),應用程序可以使用這些API函數進(jìn)行內存管理、任務(wù)間通信及創(chuàng )建、刪除任務(wù)等。

大部分的μC/OS-II代碼是使用ANSI C語(yǔ)言書(shū)寫(xiě)的,因此μC/OS-II的可移植性好,然而仍需要使用C和匯編語(yǔ)言寫(xiě)一些處理器相關(guān)代碼。μC/OS-II的移植需要滿(mǎn)足以下要求:

①處理器的C編譯器可以產(chǎn)生可重入代碼;

②可以使用C調用進(jìn)入和退出臨界區代碼;

③處理器必須支持硬件中斷,并且需要一個(gè)定時(shí)中斷源;

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

⑤處理器需要有能夠在CPU寄存器與內核和堆棧交換數據的指令。

S3C44B0X處理器完全滿(mǎn)足上述要求。

2 實(shí)時(shí)內核μC/OS-II在S3C44B0X上的移植

我們使用ARM SDT編譯器,移植μC/OS-II主要包括以下幾個(gè)步驟。

(1)設置OS_CPU.H中與處理器和編譯器相關(guān)的代碼

*************************************************

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

*************************************************

typedef unsigned char BOOLEAN;

typedef unsigned char INT8U; /*8位無(wú)符號整數*/

typedef signed char INT8S; /*8位有符號整數*/

typedef unsigned short INT16U; /*16位有符號整數*/

typedef signed short INT16S; /*16位無(wú)符號整數*/

typedef unsigned long INT32U; /*32位無(wú)符號整數*/

typedef signed long INT32S; /*32位有符號整數*/

typedef float FP32; /*單精度浮點(diǎn)數*/

typedef double FP64; /*雙精度浮點(diǎn)數*/

typedef unsigned int OS_STK;/*堆棧入口寬度為16位*/與ARM處理器相關(guān)的代碼:

#define OS_ENTER_CRITICAL () ARMEnableInt() /*開(kāi)啟中斷*/

#define OS_STK_GROWTH 1 /*堆棧由高地址向低地址增長(cháng)*/

(2)用C語(yǔ)言編寫(xiě)6個(gè)操作系統相關(guān)的函數(OS_CPU_C.C)

void OSTaskStkInit(void(task)(void *pd),void *pdata,void *ptos,INT16U opt)

{ unsigned int *stk;

opt =opt; /*因“opt”變量沒(méi)有用到,防止編譯器產(chǎn)生警告*/

stk =(unsigned int *)ptos; /*裝載堆棧指針*/

/*為新任務(wù)創(chuàng )建上下文*/

*--stk=(unsigned int)task; /*lr*/

*--stk=(unsigned int)task /*pc*/

*--stk=0; /*r12*/

*--stk=0; /*r11*/

*--stk=0; /*r10*/

*--stk=0; /*r9*/

*--stk=0; /*r8*/

*--stk=0; /*r7*/

*--stk=0; /*r6*/

*--stk=0; /*r5*/

*--stk=0; /*r4*/

*--stk=0; /*r3*/

*--stk=0; /*r2*/

*--stk=0; /*r1*/

*--stk=(unsigned int)pdata; /*r0*/

*--stk=(SVC32MODE|0x0|); /*cpsr IRQ,

*--stk=(SVC32MODE|0x0); /*spsr IRQ,關(guān)閉FIQ*/

return((void*)stk);

}

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

void OSTaskCreateHook(OS_TCB *ptcb)

void OSTaksDelHool (OS_TCB *ptcb)

void OSTaskSwHook(void)

void OSTaskStatHook(void)

(3)用匯編語(yǔ)言編寫(xiě)4個(gè)與處理器相關(guān)的函數(OS_CPU.ASM)

OSStartHighRdy() ;運行優(yōu)先級最高的就緒任務(wù)

LDR r4,addr_OSTCBCur ;得到當前任務(wù)的TCB地址

LDR r5,addr_OSTCBHighRdy ;得到高優(yōu)先級任務(wù)的TCB地址

LDR r5,addr_OSTCBHighRdy ;得到高優(yōu)先級任務(wù)的TCB地址

LDR r5,[r5] ;得到堆棧指針

LDR sp,[r5] ;切換到新的堆棧

STR r5,[r4] ;設置新的當前任務(wù)的TCB地址

LDMFD sp!,{r4}

MSR CPSR_cxsf,r4

LDMFD sp!,{r0-r12,lr,pc} ;開(kāi)始新的任務(wù)

END

OSCtxsw() 任務(wù)級的任務(wù)切換函數

STMFD sp!,{lr} ;保存PC指針

STMFD sp!,{lr} ;保存lr指針

STMFD sp!,{r0-r12} ;保存寄存器文件和返回地址

MRS r4,CPSR

STMFD sp!,{r4} ;保存當前PSR

MRS r4,SPSR

STMFD sp!,{r4}

;OSPrioCur=OSPrioHighRdy

LDR r4,addr_OSPrioCur

LDR r5,addr_OSPrioHighRdy

LDRB r6,[r5]

STRB r6,[r4]

;得到當前任務(wù)的TCB地址

LDR r4,addr_OSTCBCur

LDR r5,[r4]

STR sp,[r5] ;保存棧指針在占先任務(wù)的TCB上

;取得高優(yōu)先級任務(wù)的TCB地址

LDR r6,addr_OSTCBHighRdy

LDR r6,[r6]

LDR sp,[r6] ;得到新任務(wù)的堆棧指針

;OSTCBCur=OSTCBHighRdy

STR r6,[r4]

;得到當前新任務(wù)的TCB地址

LDMFD sp!,{r4}

MSR SPSR_cxsf,r4

LDMFD sp!,{r4}

MSR SPSR_cxsf,r4

LDMFD sp!,{r0-r12,lr pc}

OSIntCtxSw() ;中斷級的任務(wù)切換函數

LDMIA sp!,{al-vl,lr}

SUBS pc,lr,#4

SUB lr,lr,#4

MOV r12,lr

MRS lr,SPSR

AND lr,lr,#0XFFFFFE0

ORR lr,lr,#0XD3

MSR CPSR_CXSF,lr

OSTickISR() ;中斷服務(wù)函數

STMDB sp!,{r0-r11,lr}

MRS r0,CPSR

ORR r0,r0,#0x80; ;設置中斷禁止標志

MSR CPSR_cxsf,r0 ;中斷結束

LDR r0,I_ISPC

LDR r1,=BIT_TIMER0

STR r1,{r0}

BL IrqStart

BL osTimeTick

BL IrqFinish

LDR r0,=need_to_swap_context

LDR R2,[R0]

CMP r2,#1

LDREQ pc,=_CON_SW

完成上述工作后,μC/OS-II就可以運行在A(yíng)RM處理器上了。

3 使用μC/OS-II系統應注意的問(wèn)題

μC/OS-II和Linux等分時(shí)操作系統不同,不支持時(shí)間片輪轉法。它是一個(gè)基于優(yōu)先級的實(shí)時(shí)操作系統。每一個(gè)任務(wù)的優(yōu)先級必須不同(分析它的源碼會(huì )發(fā)現,μC/OS-II把任務(wù)的優(yōu)先級當作任務(wù)在標識來(lái)使用,如果優(yōu)先級相同,任務(wù)將無(wú)法區分)。進(jìn)入就緒態(tài)的優(yōu)先級最高的任務(wù)首先得到CPU的使用權,只有等它交出CPU的使用權后,其它任務(wù)才可以被執行。所以,它只能就是多任務(wù),不能就是多進(jìn)程,至少不是我們所熟悉的那種多進(jìn)程。

μC/OS-II對共享資源提供了保護的機制。μC/OS-II是一個(gè)支持多任務(wù)的操作系統。我們可以把一個(gè)完整的程序劃分成幾個(gè)任務(wù),不同的任務(wù)執行不同的功能。對于共享資源(比如串口),μC/OS-II也提供了很好的解決辦法,一般情況下使用的是信號量方法。我們創(chuàng )建一個(gè)信號量并對它進(jìn)行初始化,當一個(gè)任務(wù)需要使用一個(gè)共享資源時(shí),它必須先申請得到這個(gè)信號量。在這個(gè)過(guò)程中即使有優(yōu)先權更高的任務(wù)進(jìn)入了就緒態(tài),因為無(wú)法得到信號量,也不能使用該資源。在μC/OS-II中稱(chēng)為優(yōu)先級反轉。簡(jiǎn)單地說(shuō),就是高優(yōu)先級任務(wù)必須等待低優(yōu)先級任務(wù)的完成。在上述情況下,在兩個(gè)任務(wù)之間發(fā)生優(yōu)先級后轉是無(wú)法避免的。所以不在使用μC/OS-II時(shí),必須對所開(kāi)發(fā)的系統了解清楚才能選擇對于某種共享資源是否使用信號量。

μC/OS-II內存管理不夠完善。在分析許多μC/OS-II的應用實(shí)例中發(fā)現,任務(wù)??臻g和內存分區的創(chuàng )建采用了定義全局數組的方法,這樣實(shí)現起來(lái)固然簡(jiǎn)單,但不夠靈活有效。

編譯器會(huì )將全局數組作為未初始化的全局變量,放到應用程序映像的數據段。數組的大小是固定的,生成映像后不可能在使用中動(dòng)態(tài)地改變。對于任務(wù)??臻g來(lái)說(shuō),數組定義大了會(huì )造成內存浪費;定義小了任務(wù)棧溢出,會(huì )造成系統崩潰。對于內存分區,在不知道系統初始化后給用戶(hù)留下了多少自由內存空間的情況下,很難定義內存分區所使用數組的大小。此外,現在μC/OS-II只支持固定大小的內存分區,容易造成內存浪費。μC/OS-II將來(lái)應該被改進(jìn)以支持可變大小的內存分區。因此,系統初始化后能清楚地掌握自由內存空間的情況是很重要的。所以,應避免使用全局數組分配內存空間,關(guān)鍵是要知道整個(gè)應用程序在編譯、鏈接后代碼段和數據段的大小,在目標板內存中是如何定位,以及目標板內存的大小。

總之,隨著(zhù)各種智能嵌入式系統的復雜化和系統實(shí)時(shí)性需求的提高,伴隨應用軟件朝著(zhù)系統化發(fā)展的加速,功能強大的實(shí)時(shí)操作系統μC/OS-II將會(huì )有更大的發(fā)展。



關(guān)鍵詞: 移植 處理器 S3C44BOX C/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>