?? os_cpu_a.a51
字號(hào):
;/*
;*********************************************************************************************************
;* uC/OS-II
;* 實(shí)時(shí)內(nèi)核
;*
;* (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
;* 版權(quán)所有
;*
;* MCU-51 專用代碼
;* KEIL C51小模式編譯
;*
;* 文件名 : OS_CPU_A.ASM
;* 作者 : Jean J. Labrosse
;* 改編 : 楊屹 gdtyy@ri.gdt.com.cn 巨龍公司系統(tǒng)集成開(kāi)發(fā)部 2002.09.27
;*********************************************************************************************************
;*/
$NOMOD51
EA BIT 0A8H.7
SP DATA 081H
B DATA 0F0H
ACC DATA 0E0H
DPH DATA 083H
DPL DATA 082H
PSW DATA 0D0H
TR0 BIT 088H.4
TF0 BIT 088H.5
TH0 DATA 08CH
TL0 DATA 08AH
NAME OS_CPU_A ;模塊名
;定義重定位段
?PR?OSStartHighRdy?OS_CPU_A SEGMENT CODE
?PR?OSCtxSw?OS_CPU_A SEGMENT CODE
?PR?OSIntCtxSw?OS_CPU_A SEGMENT CODE
?PR?OSTickISR?OS_CPU_A SEGMENT CODE
;聲明引用全局變量和外部子程序
EXTRN DATA (?C_XBP) ;仿真堆棧指針用于重入局部變量保存
EXTRN IDATA (STACK)
EXTRN DATA (OSTCBCur)
EXTRN DATA (OSTCBHighRdy)
EXTRN DATA (OSRunning)
EXTRN DATA (OSPrioCur)
EXTRN DATA (OSPrioHighRdy)
EXTRN CODE (_?OSTaskSwHook)
EXTRN CODE (_?OSIntEnter)
EXTRN CODE (_?OSIntExit)
EXTRN CODE (_?OSTimeTick)
;對(duì)外聲明4個(gè)不可重入函數(shù)
PUBLIC OSStartHighRdy
PUBLIC OSCtxSw
PUBLIC OSIntCtxSw
PUBLIC OSTickISR
;PUBLIC SerialISR
;定義壓棧出棧宏
;-------------------------------------------------------------------------
PUSHALL MACRO
IRP REG, <PSW, ACC, B, DPL, DPH, 0, 1, 2, 3, 4, 5, 6, 7>
PUSH REG
ENDM
ENDM
POPALL MACRO
IRP REG, <7, 6, 5, 4, 3, 2, 1, 0, DPH, DPL, B, ACC, PSW>
POP REG
ENDM
ENDM
;子程序
;-------------------------------------------------------------------------
RSEG ?PR?OSStartHighRdy?OS_CPU_A
OSStartHighRdy:
;上電后51自動(dòng)關(guān)中斷,此處不必用CLR EA指令,因?yàn)榈酱颂庍€未開(kāi)中斷,本程序退出后,開(kāi)中斷。
LCALL _?OSTaskSwHook
OSCtxSw_in:
;OSTCBCur ===> DPTR 獲得當(dāng)前TCB指針,詳見(jiàn)C51.PDF第178頁(yè)
MOV DPH,(OSTCBCur+1)
MOV DPL,(OSTCBCur+2)
MOVX A,@DPTR ;.OSTCBStkPtr是xadta指針
MOV B,A
INC DPTR
MOVX A,@DPTR
MOV DPL,A
MOV DPH,B ;此時(shí)PDTR指向用戶堆棧
;*UserStkPtr ===> R5 用戶堆棧起始地址內(nèi)容(即用戶堆棧長(zhǎng)度放在此處) 詳見(jiàn)文檔說(shuō)明 指針用法詳見(jiàn)C51.PDF第178頁(yè)
MOVX A,@DPTR ;用戶堆棧中是unsigned char類型數(shù)據(jù)
MOV R5,A ;R5=用戶堆棧長(zhǎng)度
;恢復(fù)現(xiàn)場(chǎng)堆棧內(nèi)容
MOV R0,#STACK-1
L00: INC DPTR
INC R0
MOVX A,@DPTR
MOV @R0,A
DJNZ R5,L00
;恢復(fù)堆棧指針SP
MOV SP,R0
;恢復(fù)仿真堆棧指針?C_XBP
INC DPTR
MOVX A,@DPTR
MOV ?C_XBP,A
INC DPTR
MOVX A,@DPTR
MOV ?C_XBP+1,A
;OSRunning=TRUE
MOV A,#1
MOV OSRunning,A
POPALL
SETB EA ;開(kāi)中斷
RETI
;-------------------------------------------------------------------------
RSEG ?PR?OSCtxSw?OS_CPU_A
OSCtxSw:
PUSHALL
OSIntCtxSw_in:
;OSTCBCur ===> DPTR 獲得當(dāng)前TCB指針,詳見(jiàn)C51.PDF第178頁(yè)
MOV DPH,OSTCBCur+1
MOV DPL,(OSTCBCur+2)
;OSTCBCur->OSTCBStkPtr ===> DPTR 獲得用戶堆棧指針
MOVX A,@DPTR ;.OSTCBStkPtr是void指針
MOV B,A
INC DPTR
MOVX A,@DPTR
MOV DPL,A
MOV DPH,B
;獲得堆棧長(zhǎng)
MOV A,SP
CLR C
SUBB A,#STACK-1
MOV R5,A
;保存堆棧長(zhǎng)度
MOVX @DPTR,A
;獲得堆棧起址
MOV R0,#STACK-1
L12:
INC DPTR
INC R0
MOV A,@R0
MOVX @DPTR,A
DJNZ R5,L12
;保存C_XBP 到堆棧中
INC DPTR
MOV A,?C_XBP
MOVX @DPTR,A
MOV A,?C_XBP+1
INC DPTR
MOVX @DPTR,A
;調(diào)用用戶程序
LCALL _?OSTaskSwHook
;OSTCBCur = OSTCBHighRdy
MOV A,OSTCBHighRdy
MOV OSTCBCur,A
MOV A,OSTCBHighRdy+1
MOV OSTCBCur+1,A
MOV A,OSTCBHighRdy+2
MOV OSTCBCur+2,A
;OSPrioCur = OSPrioHighRdy 使用這兩個(gè)變量主要目的是為了使指針比較變?yōu)樽止?jié)比較,以便節(jié)省時(shí)間。
MOV A,OSPrioHighRdy
MOV OSPrioCur,A
LJMP OSCtxSw_in
;-------------------------------------------------------------------------
RSEG ?PR?OSIntCtxSw?OS_CPU_A
OSIntCtxSw:
;調(diào)整SP指針去掉在調(diào)用OSIntExit(),OSIntCtxSw()過(guò)程中壓入堆棧的多余內(nèi)容
;SP=SP-4
MOV A,SP
CLR C
SUBB A,#4
MOV SP,A
LJMP OSIntCtxSw_in
;-------------------------------------------------------------------------
CSEG AT 000BH ;OSTickISR
LJMP OSTickISR ;使用定時(shí)器0
RSEG ?PR?OSTickISR?OS_CPU_A
OSTickISR:
USING 0
PUSHALL
MOV A,#063H
MOV TH0,A
MOV A,#0C0H
MOV TL0,A
CLR TF0
LCALL _?OSIntEnter
LCALL _?OSTimeTick
LCALL _?OSIntExit
POPALL
RETI
;-------------------------------------------------------------------------
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -