<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>

新聞中心

UCOS移植心得

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò ) 收藏
移植UCOS之前,你首先應該做好三件事:


1.弄懂UCOS,這是誰(shuí)都知道的哦 ^_^

2. 弄懂你想要移植到的硬件平臺

3. 清楚你使用的編譯器是如何處理函數的局部變量和怎么樣處理函數間的參數傳遞

這里多廢話(huà)幾句第三點(diǎn):在UCOS里面,所有函數都要求具有重入性(除了OSSTAR()外,只有這個(gè)函數我覺(jué)得是不需要的,它僅僅使用了一次);重入性是多任務(wù)的基礎,而所謂重入性從函數而言就是它的變量的保存問(wèn)題,在中斷這個(gè)函數的執行時(shí)它使用的變量需要得到保存,以便返回后的執行是正確的,就我使用的編譯器而言,它通過(guò)堆棧傳遞函數參數,

重入性問(wèn)題就很容易解決拉,在中斷任務(wù)時(shí),它的參數已經(jīng)在堆棧里面了,只要你保存好CPU寄存器和堆棧指針SP就好

而如果你使用的是KEIL的話(huà)就比較復雜拉,首先KEIL是51單片機的東西,51只有很少的存儲空間,KEIL的重入性是通過(guò)設立模擬棧實(shí)現的,當任務(wù)中斷執行時(shí),你不僅需要保存CPU寄存器,還要保存模擬棧的內容,特別是51的SP尋址能力不強,只有8位,不能在64K的空間自移動(dòng),而UCOS比較大,KEIL編譯時(shí)只能用大規模方式,這就意味著(zhù)所有的全局變量都會(huì )保存在片外空間,而SP無(wú)法訪(fǎng)問(wèn)到,你需要設立一個(gè)公共的系統棧,保存正在運行的任務(wù)的數據,在任務(wù)切換時(shí)把這個(gè)系統棧的內容拷貝到它的任務(wù)棧里,操作比較繁瑣

注意系統的初始化問(wèn)題,我在第一個(gè)任務(wù)里調用了系統初始化函數,在里面開(kāi)中斷允許.

任務(wù)可以是關(guān)中斷時(shí)被掛起,也可以是開(kāi)中斷時(shí)被掛起,那么在任務(wù)切換回來(lái)后如何保證它的中斷狀況呢?問(wèn)題可以通過(guò)給每個(gè)任務(wù)設置一個(gè)中斷計數器解決,并初始化為 0,記錄每個(gè)任務(wù)的開(kāi)關(guān)中斷次數,關(guān)一次中斷加 1,開(kāi)一次中斷減 1, 在任務(wù)調度的時(shí)候保存當前任務(wù)的中斷計數器,切換到新任務(wù)時(shí)查看新任務(wù)的中斷計數器,如果為 0就開(kāi)中斷返回,不然就直接返回(任務(wù)級切換是在關(guān)中斷下進(jìn)行的);而對于中斷級任務(wù)調度,肯定是發(fā)生在開(kāi)中斷情況下的,就要查看是否需要關(guān)中斷處理

現在開(kāi)始說(shuō)我的移植:我移植到的平臺是凌陽(yáng)公司的SPCE061A 16位單片機,它有2K的RAM,32K的ROM空間,基本上夠用,但不能有太多功能,我在研究了這款片子的資料后,才開(kāi)始自己的移植,主要是學(xué)了一下它的匯編語(yǔ)言和混合編程以及CPU得硬件方面;在堆棧的問(wèn)題上我發(fā)現凌陽(yáng)的SP是16位的,可以尋址64K的空間,不需要設立系統棧. 在OS_CPU_C.C中注意堆棧的初始化,一定要在任務(wù)切換時(shí)嚴格遵守你的初始化時(shí)假定的寄存器順序.

下面開(kāi)始移植最重要的三個(gè)文件:

OS_CPU_C.C:

OSTaskStkInit():

stk=(OS_STK *)ptos;


*stk--=*((INT16U*)task+1);/*任務(wù)首地址 (PC)*/

*stk--=0x0000;/*SR(R6) */

*stk--=0x0000;/*BP(R5) */

*stk--=0x0000;/*R4*/

*stk--=0x0000;/*R3*/

*stk--=0x0000;/*R2*/

*stk--=0x0000;/*R1*/

*stk--=0x0000;/*該任務(wù)的中斷狀況計數器*/

return((void *)stk);

別的就是空函數,比較簡(jiǎn)單,這里略去

這個(gè)文件比較簡(jiǎn)單,唯一要注意的是堆棧初始化函數,像剛剛說(shuō)到的,你假定的堆棧內容必須在任務(wù)切換時(shí)嚴格遵守.還有就是定義幾個(gè)空函數

OS_CPU_A.ASM:

這個(gè)文件呢是移植的關(guān)鍵,需要用匯編語(yǔ)言編寫(xiě),(我有個(gè)同學(xué)很能?chē)?,認為匯編語(yǔ)言純屬沒(méi)用,像這種話(huà)千萬(wàn)不要相信!),在這個(gè)文件里,你需要完成UCOS的核心代碼!

首先是OSStartHighRdy():

該函數在系統開(kāi)始時(shí)使最高優(yōu)先級任務(wù)運行,代碼如下:

_OSStartHighRdy:

CALL_OSTaskSwHook



R1=0x0001

[_OSRunning]=R1



R1=[_OSTCBCur]

SP=[R1]

POP R1 FROM [SP]

[_InterruptC]=R1//彈出任務(wù)中斷狀況計數器

POP R1,R5 FROM [SP]

RETI

接著(zhù)是OSCtxSw():

完成任務(wù)切換,代碼如下:

_OSCtxSw:

PUSH R1,R5 TO [SP]

R1=[_InterruptC]

PUSH R1 TO [SP]//保存任務(wù)中斷狀況



R2=[_OSTCBCur]

[R2]=SP

CALL _OSTaskSwHook



//OSUCBCur=OSTCBHighRdy

R1=_OSTCBCur

R2=[_OSTCBHighRdy]

[R1]=R2



//OSPrioCur=OSPrioHighRdy

R1=[_OSPrioHighRdy]

[_OSPrioCur]=R1



R1=[_OSTCBHighRdy]

SP=[R1]

POP R1 FROM [SP]

[_InterruptC]=R1//彈出任務(wù)中斷狀況

CMP R1,0//查看是否需要開(kāi)中斷

JNE KAI

INT IRQ

KAI: POP R1,R5 FROM [SP]

RETI

上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: UCOS移植心

評論


技術(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>