📄 os_cpu_a.asm
字号:
;********************************************************************************************************
; uC/OS-II
; The Real-Time Kernel
;
; (c) Copyright 1992-1999, Jean J. Labrosse, Weston, FL
; All Rights Reserved
;
; Infineon C16x/C167CR-LM
; Extended Architecture Specific Code
; HLARGE MEMORY MODEL
;
;
; Module Title : uC/OS-II C16x (for C167CR-LM)
; System Platform : ST10R167 of C167CR-LM
; Compile with : KEIL C166/ST10 V4.20 Ansi C Compiler
; Author :
; Date : March, 7 2002
; Revision : 1.10
; File Name : OS_CPU_A.ASM
; Description : This uC/OS-II port is intended for Infineon Technologies and ST10R167
; C16x Extended Architecture Micro Controller Targets (C167CR-LM)
; PART OF : uC/OS-II version 2.00
;********************************************************************************************************
; Revision history:
;
; $Log: /.../UCOS-II/C167/Os_cpu_a.asm $
;
; 9 3/07/02 4:03p Mrodier
; Header corrected for new revision of the port.
; Type error corrected around DPPx. Same functionnality as previous
; version
;********************************************************************************************************
$DEBUG
$SEGMENTED
$CASE
$NOMOD166
$INCLUDE (XC164.inc)
NAME OS_CPU_C16x
ASSUME DPP1:NDATA
ASSUME DPP3:SYSTEM
; Setup Stack Overflow
TOS EQU 0FC00H ; top of system stack
;@"==================================================================
;@" Macro for Saving a Task's Complete Context
;@"==================================================================
%*DEFINE (SaveContext ())
(
PUSH PSW ; Save Interrupting PSW
MOV [-R0],R1 ; Save R1
MOV [-R0],R2 ; Save R2
MOV [-R0],R3 ; Save R3
MOV [-R0],R4 ; Save R4
MOV [-R0],R5 ; Save R5
MOV [-R0],R6 ; Save R6
MOV [-R0],R7 ; Save R7
MOV [-R0],R8 ; Save R8
MOV [-R0],R9 ; Save R9
MOV [-R0],R10 ; Save R10
MOV [-R0],R11 ; Save R11
MOV [-R0],R12 ; Save R12
MOV [-R0],R13 ; Save R13
MOV [-R0],R14 ; Save R14
MOV [-R0],R15 ; Save R15
MOV R4,CP ; Get Context Pointer (CP)
MOV [-R0],R4 ; Put it on the user stack
MOV R4,DPP3 ; Get Data Page Pointer 3 (DPP3)
MOV [-R0],R4 ; Put it on the user stack
MOV R4,DPP2 ; Get Data Page Pointer 2 (DPP2)
MOV [-R0],R4 ; Put it on the user stack
MOV R4,DPP0 ; Get Data Page Pointer 0 (DPP0)
MOV [-R0],R4 ; Put it on the user stack
MOV R4,MDC ; Get Multiply/Divide Control (MDC)
MOV MDC,#0010h ; Clear the MDC refister to restart new multiplication
MOV [-R0],R4 ; Put it on the user stack
MOV R4,MDH ; Get Multiply/Divide High (MDH)
MOV [-R0],R4 ; Put it on the user stack
MOV R4,MDL ; Get Multiply/Divide Low (MDL)
MOV [-R0],R4 ; Put it on the user stack
POP R4 ; Get current PSW of the Interrupting task
MOV [-R0],R4 ; Put PSW on user stack
)
;@"===================================================================
;@" Macro for Restoring a Task's Context
;@"===================================================================
%*DEFINE (RestoreContext ())
LOCAL next(
MOV R1,[R0+] ; Get PSW of the Interrupting task
JNB R1.5,%next ; Verify if the MULIP Flag was set
BSET PSW.5 ; The Mulip Flag was set, set the mulip in current PSW
%next:
MOV R1,[R0+] ; Restore MDL
MOV MDL,R1 ;
MOV R1,[R0+] ; Restore MDH
MOV MDH,R1 ;
MOV R1,[R0+] ; Restore MDC
MOV MDC,R1 ;
MOV R1,[R0+] ; Restore DPP0
MOV DPP0,R1 ;
MOV R1,[R0+] ; Restore DPP2
MOV DPP2,R1 ;
MOV R1,[R0+] ; Restore DPP3
MOV DPP3,R1 ;
MOV R1,[R0+] ; Restore CP
MOV CP,R1 ;
NOP
MOV R15,[R0+] ; Restore R15
MOV R14,[R0+] ; Restore R14
MOV R13,[R0+] ; Restore R13
MOV R12,[R0+] ; Restore R12
MOV R11,[R0+] ; Restore R11
MOV R10,[R0+] ; Restore R10
MOV R9,[R0+] ; Restore R9
MOV R8,[R0+] ; Restore R8
MOV R7,[R0+] ; Restore R7
MOV R6,[R0+] ; Restore R6
MOV R5,[R0+] ; Restore R5
MOV R4,[R0+] ; Restore R4
MOV R3,[R0+] ; Restore R3
MOV R2,[R0+] ; Restore R2
MOV R1,[R0+] ; Restore R1
)
;********************************************************************************************************
; External Code
;********************************************************************************************************
EXTERN OSIntExit:FAR
EXTERN OSTimeTick:FAR
EXTERN OSTaskSwHook:FAR
EXTERN OSIntEnter:FAR
EXTERN Port1_init:FAR
;********************************************************************************************************
; External Data
;********************************************************************************************************
EXTERN OSIntNesting:BYTE
EXTERN OSPrioHighRdy:BYTE
EXTERN OSPrioCur:BYTE
EXTERN OSRunning:BYTE
EXTERN OSTCBCur:WORD
EXTERN OSTCBHighRdy:WORD
;UCOS_C16X SECTION CODE WORD PUBLIC 'CPROGRAM'
PUBLIC OSStartHighRdy
PUBLIC OSCtxSw
PUBLIC OSIntCtxSw
PUBLIC OSTickISR
;UCOS_C16X ENDS
;********************************************************************************************************
; START MULTITASKING
; void OSStartHighRdy (void)
;
; Note : OSStartHighRdy() MUST:
; a) Call OSTaskSwHook() then,
; b) Set OSRunning to TRUE.
;
; The user stack frame of the task to start looks as follows:
;
; TASK STACK AREA (High Memory)
; +14 TASK DATA PARAMETER SEGMENT pointer of task
; +12 TASK DATA PARAMETER OFFSET pointer of task
; +10 SEGMENT of task code address
; +0E OFFSET of task code address
; +0C SP of System stack of task
; +0A USER STACK OFFSET POINTER (R0) of task
; +08 USER STACK PAGE POINTER (DPP1) of task
; +06 PSW of task
; +04 OFFSET of task return address (IP)
; +02 SEGMENT of task return address (CSP)
; OSTCBHighRdy->OSTCBStkPtr --> 0
; -02 R[1 ..15] General Purpose registers of task
; -20 CP Context pointer of task
; -22 DPP3 Data page pointer 3 of task
; -24 DPP2 Data page pointer 2 of task
; -26 DPP0 Data page pointer 0 of task
; -28 MDC Multiply/Divide Control of task
; -2A MDH Multiply/Divide High register of task
; -2C MDL Multiply/Divide Low register of task (Low Memory)
; -2E PSW PSW of the interrupting task when task have been interrupted
;********************************************************************************************************
UCOS_C16X SECTION CODE
OSStartHighRdy PROC FAR
CALLS SEG(OSTaskSwHook),SOF(OSTaskSwHook) ; Call user defined task switch hook
_ADDR00:
MOVB RL1,#01h ; Indicate that multitasking has started
EXTP #PAG OSRunning,#01h
MOVB POF OSRunning,RL1
BCLR IEN ; Disable interrupts
EXTP #PAG OSTCBHighRdy,#02h ; OSTCBCur = OSTCBHighRdy;
MOV R12,POF OSTCBHighRdy
MOV R13,POF (OSTCBHighRdy+2)
EXTP #PAG OSTCBCur,#02h
MOV POF (OSTCBCur),R12
MOV POF (OSTCBCur+2),R13
EXTS R13,#02h ; pStack = OSTCBCur->OSTCBStkPtr;
MOV R14,[R12+] ; Load Offset pointer
MOV R15,[R12] ; Load Page pointer
; Load Task's Context from TCB
EXTS R15,#02h ; Start Of Task USR Stack Offset
MOV R1,[R14+#08H] ; Task DPP1
MOV R0,[R14+#0AH] ; Task R0
EXTS R15,#02h
MOV R2,[R14+#04H] ; Task IP
MOV R3,[R14+#02H] ; Task CSP
MOV SP,#DPP3:TOS ; INITIALIZE STACK POINTER
MOV DPP1,R1 ; Start Of Task USER Stack Page
PUSH R3 ; Load "saved" CSP on System Stack
PUSH R2 ; Load "saved" IP on System Stack
%RestoreContext() ; Restore context.
BSET IEN ; Enable interrupts
RETS ; Execute Task
OSStartHighRdy ENDP
;********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From task level)
; void OSCtxSw(void)
;
; Note(s): 1) Upon entry,
; OSTCBCur points to the OS_TCB of the task to suspend
; OSTCBHighRdy points to the OS_TCB of the task to resume
;
; 2) The system stack frame of the task to suspend looks as follows:
; SYSTEM STACK AREA
; SP -> +00 OFFSET of task to suspend (Low memory)
; +02 SEGMENT of task to suspend
; +04 PSW of task to suspend (High memory)
;
; 3) The user stack frame of the task to resume looks as follows:
;
; TASK STACK AREA (High Memory)
; +14 TASK DATA PARAMETER SEGMENT pointer of task
; +12 TASK DATA PARAMETER OFFSET pointer of task
; +10 SEGMENT of task code address
; +0E OFFSET of task code address
; +0C SP of System stack of task
; +0A USER STACK OFFSET POINTER (R0) of task
; +08 USER STACK PAGE POINTER (DPP1) of task
; +06 PSW of task
; +04 OFFSET of task return address (IP)
; 02 SEGMENT of task return address (CSP)
; OSTCBHighRdy->OSTCBStkPtr --> 0
; -02 R[1 ..15] General Purpose registers of task
; -20 CP Context pointer of task
; -22 DPP3 Data page pointer 3 of task
; -24 DPP2 Data page pointer 2 of task
; -26 DPP0 Data page pointer 0 of task
; -28 MDC Multiply/Divide Control of task
; -2A MDH Multiply/Divide High register of task
; -2C MDL Multiply/Divide Low register of task (Low Memory)
; -2E PSW PSW of the interrupting task when task have been interrupted
;********************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -