uC/OS-II在凌陽單片機(jī)SPCE061A上的移植
3 uC/OS-II BSP代碼的編寫
BSP(板級(jí)支持包)是介于底層硬件和操作系統(tǒng)之間的軟件層,它對(duì)底層硬件進(jìn)行封裝,使得操作系統(tǒng)不再面對(duì)具體的硬件。我們以凌陽SPACE061A單片機(jī)為例介紹BSP代碼的編寫。
3.1 任務(wù)切換
凌陽SPACE061A單片機(jī)有R1~R5 五個(gè)通用寄存器,還有1個(gè)SR(CPU狀態(tài)寄存器),再加上PC,總共有7個(gè)CPU內(nèi)部寄存器在任務(wù)切換時(shí)需要保存。uCOS-II系統(tǒng)調(diào)用OSCtxSw( )來實(shí)現(xiàn)任務(wù)的切換,下面給出其部分代碼:
_OSCtxSw:
PUSHALL // 將所有寄存器壓棧
OSIntCtxSw_in:
// 求出系統(tǒng)堆棧的長度 ,并將其存入R2
R1=SP
R2=OSStkStart
R1+=1
R2=R2-R1
R1=[_OSTCBCuγ]// R1≤OSTCBStkPtr, R1 為任
//務(wù)堆棧的頭指針
R1=[R1] // 首先將系統(tǒng)堆棧長度保存在任
//務(wù)堆棧中
[R1]=R2
R3=OSStkStart // 得到堆棧的起始地址
// 保存系統(tǒng)堆棧到任務(wù)堆棧
save_stack:
R3-=1
R1+=1
R4=[R3]
[R1]=R4
R2-=1
JNZ save_stack
CALL _OSTaskSwHook
R1=[_OSTCBHighRdy]
[_OSTCBCur]=R1
R1=[_OSPrioHighRdy]
[_OSPrioCur]=R1
JMP OSCtxSw_in
3.2 uCOS-II系統(tǒng)時(shí)鐘
以凌陽SPCE061A單片機(jī)的TMB2時(shí)基信號(hào)作為系統(tǒng)時(shí)鐘,每經(jīng)歷一個(gè)時(shí)鐘節(jié)拍的時(shí)間將產(chǎn)生一次中斷,在中斷服務(wù)子程序中會(huì)調(diào)用OSTickISR()函數(shù),匯編代碼如下:
_OSTickISR:
PUSHALL
R1=0x0001
test R1,[P_INT_Ctrl]
JZ OUT
R1=0x0001
[P_INT_Clear]=R1
CALL _OSIntEnter
CALL _OSTimeTick
CALL _OSIntExit
OUT:
R1=0x0001
[P_INT_Clear]=R1
POPALL
RETI
結(jié) 語
RTOS是當(dāng)今嵌入式應(yīng)用的熱點(diǎn)。應(yīng)用RTOS,可以提高產(chǎn)品的可靠性,降低研發(fā)周期。uCOS-II具有很好的實(shí)時(shí)性和很小的代碼量,因此掌握uCOS-II的移植方法是相當(dāng)重要的。
評(píng)論