⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucos_ca.asm

📁 工作中正在用的, uCOS 的移植,本来有8个文件
💻 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 + -