📄 ucos_ca.asm
字号:
; TMS320C31 Real Time Operating System
; SMALL MEMORY MODEL
;
; Copyright (c) 1997 by General Electric Company
;
; $Logfile: /InnovCtl/_uCOS/src/UCOSC31A.A30 $
; $Revision: 1 $
;
; $Log: /InnovCtl/_uCOS/src/UCOSC31A.A30 $
;
; 1 2/21/97 3:27p Fowleydg
; ASM source for machine dependent code of uC/OS, the real-time kernel
;
; Last Mod: June 2, 1997 9:19:36AM
.copy ti_dvr.h
.globl _OSTaskSwHook
.globl _OSRunning
.globl _OSPrioCur
.globl _OSPrioHighRdy
.globl _OSStartHighRdy
.globl _OSCtxSw
.globl _OSIntCtxSw
.globl _OSTaskSuspend
.globl _OSTickISR
.globl _OSIntEnter
.globl _OSIntExit
.globl _OSTimeTick
.globl _OSTCBCur
.globl _OSTCBHighRdy
; .globl restored
.ref _os_start_high_ready_mate
.ref _os_text_switch_mate
.ref _os_interrupt_switch_mate
.data
ZERO .word 000000000H
IOSTRB_W0 .word 000000018H ; 0 Wait
IOSTRB_W1 .word 000000038H ; 1 Wait
IOSTRB_W2 .word 000000058H ; 2 Wait
IOSTRB_W3 .word 000000078H ; 3 Wait
IOSTRB_W4 .word 000000098H ; 4 Wait
IOSTRB_W5 .word 0000000B8H ; 5 wait
IOSTRB_W6 .word 0000000D8H ; 6 Wait
IOSTRB_W7 .word 0000000F8H ; 7 Wait
mmrp .word MMR_
;
;.MODEL SMALL
;.CODE
; .version 31
;****************************************************************
; START MULTITASKING
; void OSStartHighRdy(void)
;****************************************************************
.text
_OSStartHighRdy:
; ldi 0ch,dp
; call _OSTaskSwHook ;/*for -ii*/
; ldi @_OSRunning,ar0
; ldi 0,r0
; sti r0,*ar0
; LDI @_OSTCBHighRdy,AR0 ;Get highest prio. task
; STI AR0,@_OSTCBCur ;moved to OSStart()
; LDI *AR0,SP ;Get ptr to top of stack
call _os_start_high_ready_mate
ldi r0,sp
restored:
pop r0;
ldp ZERO,dp
ldi @mmrp,ar0
sti r0,*+ar0(IOSTRB)
POP RC ;Repeat counter
POP RE ;Repeat end address
POP RS ;Repeat start address
;restored:
; Task context should not include IOF, IF and IE
; POP IOF ;I/O flag register
; POP IF ;Interrupt flag register
; POP IE ;Interrupt enable register
POP BK ;Block-size register
POP IR1 ;Index registers
POP IR0
; Small memory model - DP should not change
;large mode change
POP DP ;Data page pointer
POP AR7 ;Auxiliary registers
POP AR6
POP AR5
POP AR4
POP AR3
POP AR2
POP AR1
POP AR0
POPF R7 ;Extended precision registers
POP R7
POPF R6
POP R6
POPF R5
POP R5
POPF R4
POP R4
POPF R3
POP R3
POPF R2
POP R2
POPF R1
POP R1
POPF R0
POP R0
POP ST ;Status register
RETI ;Return to task with interrupts enabled
;****************************************************************
; PERFORM A CONTEXT SWITCH (From task level)
; void OSCtxSw(void)
;****************************************************************
_OSCtxSw:
PUSH ST ;Status register
PUSH R0 ;Extended precision registers
PUSHF R0
PUSH R1
PUSHF R1
PUSH R2
PUSHF R2
PUSH R3
PUSHF R3
PUSH R4
PUSHF R4
PUSH R5
PUSHF R5
PUSH R6
PUSHF R6
PUSH R7
PUSHF R7
PUSH AR0 ;Auxiliary registers
PUSH AR1
PUSH AR2
PUSH AR3
PUSH AR4
PUSH AR5
PUSH AR6
PUSH AR7
; Small memory model - DP should not change
;large changed
PUSH DP ;Data page pointer
PUSH IR0 ;Index registers
PUSH IR1
PUSH BK ;Block-size register
; Task context should not include IOF, IF and IE
; PUSH IE ;Interrupt enable register
; PUSH IF ;Interrupt flag register
; PUSH IOF ;I/O flag register
PUSH RS ;Repeat start address
PUSH RE ;Repeat end address
PUSH RC ;Repeat counter
ldp ZERO,dp
ldi @mmrp,ar0
ldi *+ar0(IOSTRB),r0
push r0
;ldi 0ch,dp
;LDI @_OSTCBCur,AR0 ;Save stack ptr in TCB
;STI SP,*AR0
;call _OSTaskSwHook ;/*for -ii*/
;ldi @_OSPrioCur,ar1 ;/*forii*/
;ldi *ar0,r0 ;for-ii
;LDI @_OSPrioHighRdy,AR0 ;for-ii
;sti r0,*ar1 ;for-ii
;LDI @_OSTCBHighRdy,AR0 ;Point to HI Prio. Task Rdy
;STI AR0,@_OSTCBCur ;This is now current TCB
;LDI *AR0,SP ;Get new task's stack ptr
ldi sp,r0
push r0
call _os_text_switch_mate
pop r1
ldi r0,sp
Br restored
POP RC ;Repeat counter
POP RE ;Repeat end address
POP RS ;Repeat start address
*** B restored
;****************************************************************
; PERFORM A CONTEXT SWITCH (From an ISR)
; void OSIntCtxSw(void)
;****************************************************************
_OSIntCtxSw:
; call _OSTaskSwHook ;/*for -ii*/
; reti
SUBI 4,SP ;Ignore calls to OSIntExit & OSIntCtxSw
; ldi 0ch,dp
; ldi @_OSPrioCur,ar1 ;/*forii*/
; LDI @_OSPrioHighRdy,AR0 ;for ii
; ldi *ar0,r0 ;for-ii
; sti r0,*ar1 ;for-ii
;
; LDI @_OSTCBCur,AR0 ;Save stack ptr in TCB
; STI SP,*AR0
; LDI @_OSTCBHighRdy,AR0 ;Point to HI Prio. Task Rdy
; STI AR0,@_OSTCBCur ;This is now current TCB
; LDI *AR0,SP ;Get new task's stack ptr
ldi sp,r0
push r0
call _os_interrupt_switch_mate
pop r1
ldi r0,sp
Br restored
POP RC ;Repeat counter
POP RE ;Repeat end address
POP RS ;Repeat start address
*** B restored
; .if 0
;****************************************************************
; HANDLE TICK ISR
; void OSTickISR(void)
;****************************************************************
_OSTickISR:
; Enable interrupt nesting (Set GIE)
; PUSH IE
; LDI 0,IE
; NOP
; NOP
OR 2000H,ST
; POP IE
; Save current task's context
PUSH ST ;Status register
PUSH R0 ;Extended precision registers
PUSHF R0
PUSH R1
PUSHF R1
PUSH R2
PUSHF R2
PUSH R3
PUSHF R3
PUSH R4
PUSHF R4
PUSH R5
PUSHF R5
PUSH R6
PUSHF R6
PUSH R7
PUSHF R7
PUSH AR0 ;Auxiliary registers
PUSH AR1
PUSH AR2
PUSH AR3
PUSH AR4
PUSH AR5
PUSH AR6
PUSH AR7
; Small memory model - DP should not change
PUSH DP
PUSH IR0 ;Index registers
PUSH IR1
PUSH BK ;Block-size register
; Task context should not include IOF, IF and IE
; PUSH IE ;Interrupt enable register
; PUSH IF ;Interrupt flag register
; PUSH IOF ;I/O flag register
PUSH RS ;Repeat start address
PUSH RE ;Repeat end address
PUSH RC ;Repeat counter
ldp ZERO,dp
ldi @mmrp,ar0
ldi *+ar0(IOSTRB),r0
push r0
CALL _OSIntEnter
CALL _OSTimeTick
; INT 0F2H ;Run old tick ISR (DEMO only)
CALL _OSIntExit
Br restored
POP RC ;Repeat counter
POP RE ;Repeat end address
POP RS ;Repeat start address
*** B restored
; .endif
.if 0
.globl _OSReti
_OSReti:
RETI
.globl _OSRets
_OSRets:
RETS
.globl _OSSetIE
_OSSetIE:
PUSH AR3
LDI SP,AR3
LDI IE,R0
LDI *-AR3(2),IE ; function argument
LDI *-AR3(1),R1 ; return address
BD R1
LDI *AR3,AR3
NOP
SUBI 2,SP
*** B R1 ;BRANCH OCCURS
.endif
;****************************************************************
; HANDLE TASKS THAT EXIT()
; void OSTickISR(void)
;****************************************************************
.globl _OSTaskSuspendSelf
_OSTaskSuspendSelf:
SUBI 1,SP ; get rid of argument to task
LDI 255,R0 ; OS_PRIO_SELF
PUSH R0
CALL _OSTaskSuspend ; this had better not return
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -