📄 tct.s
字号:
LDR r1,TCT_Int_Level ; Load address of TCD_Interrupt_Level
LDR r0,[r1] ; Pickup current interrupt lockout
ORR r2,r2,r0 ; Build new CPSR with appropriate
; interrupts locked out
; Setup new CPSR lockout bits
MSR CPSR_cxsf,r2
; Return to caller
BX lr
;************************************************************************
;*
;* FUNCTION
;*
;* TCT_Build_Task_Stack
;*
;* DESCRIPTION
;*
;* This function builds an initial stack frame for a task. The
;* initial stack contains information concerning initial values of
;* registers and the task's point of entry. Furthermore, the
;* initial stack frame is in the same form as an interrupt stack
;* frame.
;*
;* CALLED BY
;*
;* TCC_Create_Task
;* TCC_Reset_Task
;*
;* CALLS
;*
;* None
;*
;* INPUTS
;*
;* r0 - Task Control Block pointer
;*
;* OUTPUTS
;*
;* None
;*
;* REGISTERS MODIFIED
;*
;* r1, r2, r3
;*
;* HISTORY
;*
;* NAME DATE REMARKS
;*
;* Driscoll, D 01/24/2003 Released Version 1.14.1
;************************************************************************
;VOID TCT_Build_Task_Stack(TC_TCB *task);
EXPORT TCT_Build_Task_Stack
TCT_Build_Task_Stack
; Pickup the stack starting address from task control block
LDR r2,[r0,#TC_STACK_START]
; Pickup the stack size (in bytes) from task control block
LDR r1,[r0,#TC_STACK_SIZE]
; Calculate the stack ending address
ADD r3,r1,r2 ; Compute the stack end (start + size)
BIC r3,r3,#3 ; Insure 4-byte alignment
SUB r3,r3,#4 ; Reserve a word
; Save the stack ending address in control block
STR r3,[r0,#TC_STACK_END]
; Build an initial stack frame as follows:
;
; (Lower Address) Stack Top -> 1 (Interrupt stack type)
; CPSR Saved CPSR
; r0 Saved r0
; r1 Saved r1
; r2 Saved r2
; r3 Saved r3
; r4 Saved r4
; r5 Saved r5
; r6 Saved r6
; r7 Saved r7
; r8 Saved r8
; r9 Saved r9
; r10 Saved r10
; r11 Saved r11
; r12 Saved r12
; sp Saved sp
; lr Saved lr
; (Higher Address) Stack Bottom-> pc Saved pc
; Get address of task shell
LDR r2,TCT_Task_Shell
BIC r2,r2,#1 ; Clear low bit
STR r2,[r3], #-4 ; Push pc (task shell address)
MOV r2,#0 ; Clear value for initial registers
STR r2,[r3], #-4 ; Push lr
ADD r2,r3,#&8 ; Compute initial sp
STR r2,[r3], #-4 ; Push sp
STR r2,[r3], #-4 ; Push r12
STR r2,[r3], #-4 ; Push r11
LDR r2,[r0,#TC_STACK_START] ; Pickup the stack starting address
STR r2,[r3], #-4 ; Push r10 (stack limit)
MOV r2,#0 ; Clear value for initial registers
STR r9,[r3], #-4 ; Push r9
STR r2,[r3], #-4 ; Push r8
STR r2,[r3], #-4 ; Push r7
STR r2,[r3], #-4 ; Push r6
STR r2,[r3], #-4 ; Push r5
STR r2,[r3], #-4 ; Push r4
STR r2,[r3], #-4 ; Push r3
STR r2,[r3], #-4 ; Push r2
STR r2,[r3], #-4 ; Push r1
STR r2,[r3], #-4 ; Push r0
MSR CPSR_f,r2 ; Clear flags in CPSR
MRS r2,CPSR ; Pickup the CPSR
BIC r2,r2,#LOCK_MSK ; Clear initial interrupt lockout
; Check to see if Task shell is build in thumb state
LDR r1,TCT_Task_Shell ; Get address of task shell
TST r1,#1 ; Check bit 0 (set if THUMB)
ORRNE r2,r2,#THUMB_BIT ; If bit 0 set, add THUMB bit to CPSR
IF NU_SUPERV_USER_MODE ; All tasks should run in User
BIC r2,r2,#MODE_MASK ; Clear mode bits of CPSR
ORR r2,r2,#USR_MODE ; Set USER mode
ENDIF
STR r2,[r3], #-4 ; Push CPSR
MOV r2,#1 ; Build interrupt stack type (1)
STR r2,[r3] ; Push stack type
; Save the new stack pointer into the task's control block.
STR r3,[r0, #TC_STACK_POINTER]
; Pickup the stack size (in bytes) from task control block
LDR r1,[r0,#TC_STACK_SIZE]
; Save the minimum amount of remaining stack memory.
MOV r2,#INT_STACK_SIZE ; Size of interrupt stack frame
SUB r1,r1,r2 ; Compute minimum available bytes
STR r1,[r0, #TC_STACK_MINIMUM] ; Save in minimum stack area
; Return to caller
BX lr
;************************************************************************
;*
;* FUNCTION
;*
;* TCT_Build_HISR_Stack
;*
;* DESCRIPTION
;*
;* This function builds an initial stack frame for a HISR. The
;* initial stack contains information concerning initial values of
;* registers and the HISR's point of entry. Furthermore, the
;* initial stack frame is in the same form as a solicited stack
;* frame.
;*
;* CALLED BY
;*
;* TCC_Create_HISR
;*
;* CALLS
;*
;* None
;*
;* INPUTS
;*
;* r0 - HISR Control Block pointer
;*
;* OUTPUTS
;*
;* None
;*
;* REGISTERS MODIFIED
;*
;* r1, r2, r3
;*
;* HISTORY
;*
;* NAME DATE REMARKS
;*
;* Driscoll, D 01/24/2003 Released Version 1.14.1
;************************************************************************
;VOID TCT_Build_HISR_Stack(TC_HCB *hisr);
EXPORT TCT_Build_HISR_Stack
TCT_Build_HISR_Stack
; Pickup the stack starting address from task control block
LDR r2,[r0,#TC_STACK_START]
; Pickup the stack size (in bytes) from task control block
LDR r1,[r0,#TC_STACK_SIZE]
; Calculate the stack ending address
ADD r3,r1,r2 ; Compute the stack end (start + size)
BIC r3,r3,#3 ; Insure 4-byte alignment
SUB r3,r3,#4 ; Reserve a word
; Save the stack ending address in control block
STR r3,[r0,#TC_STACK_END]
; Build an initial stack.with the following format:
;
; (Lower Address) Stack Top -> 0 (Solicited stack type)
; CPSR Saved CPSR
; r4 Saved r4
; r5 Saved r5
; r6 Saved r6
; r7 Saved r7
; r8 Saved r8
; r9 Saved r9
; r10 Saved r10
; r11 Saved r11
; r12 Saved r12
; (Higher Address) Stack Bottom-> pc Saved pc
; Get address of HISR shell
LDR r2,=TCT_HISR_Shell ; Pickup address of shell entry
STR r2,[r3], #-4 ; Store entry address on stack
ADD r2,r3,#&4 ; Compute initial sp
STR r2,[r3], #-4 ; Push r12
STR r2,[r3], #-4 ; Push r11
LDR r2,[r0,#TC_STACK_START] ; Pickup the stack starting address
STR r2,[r3], #-4 ; Push r10 (stack limit)
MOV r2,#0 ; Clear value for initial registers
STR r9,[r3], #-4 ; Store initial r9
STR r2,[r3], #-4 ; Store initial r8
STR r2,[r3], #-4 ; Store initial r7
STR r2,[r3], #-4 ; Store initial r6
STR r2,[r3], #-4 ; Store initial r5
STR r2,[r3], #-4 ; Store initial r4
MSR CPSR_f,r2 ; Clear flags in CPSR
MRS r1,CPSR ; Pickup the CPSR
BIC r1,r1,#LOCK_MSK ; Clear initial interrupt lockout
STR r1,[r3], #-4 ; Push CPSR
; Store solicited stack type on the top of the stack
STR r2,[r3]
; Save the new stack pointer into the task's control block.
STR r3,[r0, #TC_STACK_POINTER]
; Get size of solicited stack frame
MOV r2,#SOL_STACK_SIZE
; Pickup the stack size (in bytes) from task control block
LDR r1,[r0,#TC_STACK_SIZE]
; Compute minimum available bytes and save in minimum stack area.
SUB r1,r1,r2
STR r1,[r0, #TC_STACK_MINIMUM]
; Return to caller
BX lr
;************************************************************************
;*
;* FUNCTION
;*
;* TCT_Build_Signal_Frame
;*
;* DESCRIPTION
;*
;* This function builds a frame on top of the task's stack to
;* cause the task's signal handler to execute the next time
;* the task is executed. This is built as a solicited stack
;* frame.
;*
;* CALLED BY
;*
;* TCC_Send_Signals
;*
;* CALLS
;*
;* None
;*
;* INPUTS
;*
;* r0 - Task Control Block pointer
;*
;* OUTPUTS
;*
;* None
;*
;* REGISTERS MODIFIED
;*
;* r1, r2, r3
;*
;* HISTORY
;*
;* NAME DATE REMARKS
;*
;* Driscoll, D 01/24/2003 Released Version 1.14.1
;************************************************************************
;VOID TCT_Build_Signal_Frame(TC_TCB *task);
EXPORT TCT_Build_Signal_Frame
TCT_Build_Signal_Frame
; Pickup the stack pointer.
LDR r3,[r0,#TC_STACK_POINTER] ; Pickup the current stack pointer
; Reserve a word on stack top
SUB r3,r3,#4
; Build a signal stack with the following format:
;
; (Lower Address) Stack Top -> 0 (Solicited stack type)
; CPSR Saved CPSR
; r4 Saved r4
; r5 Saved r5
; r6 Saved r6
; r7 Saved r7
; r8 Saved r8
; r9 Saved r9
; r10 Saved r10
; r11 Saved r11
; r12 Saved r12
; (Higher Address) Stack Bottom-> pc Saved pc
; Get address of signal shell
LDR r2,TCT_Signal_Shell ; Pickup address of shell entry
; If in THUMB state, clear low bit.
BIC r2,r2,#1
STR r2,[r3], #-4 ; Push pc (signal shell)
ADD r2,r3,#&4 ; Compute initial sp
STR r2,[r3], #-4 ; Push r12
STR r2,[r3], #-4 ; Push r11
LDR r2,[r0,#TC_STACK_START] ; Pickup the stack starting address
STR r2,[r3], #-4 ; Push r10 (stack limit)
MOV r2,#0 ; Clear value for initial registers
STR r9,[r3], #-4 ; Push r9
STR r2,[r3], #-4 ; Push r8
STR r2,[r3], #-4 ; Push r7
STR r2,[r3], #-4 ; Push r6
STR r2,[r3], #-4 ; Push r5
STR r2,[r3], #-4 ; Push r4
; Build CPSR value to put on stack
MSR CPSR_f,r2 ; Clear flags in CPSR
MRS r1,CPSR ; Pickup the CPSR
BIC r1,r1,#LOCK_MSK ; Clear initial interrupt lockout
; Check to see if Signal shell is build in thumb state
LDR r2,TCT_Signal_Shell ; Get address of signal shell
TST r2,#1 ; Check bit 0 (set if THUMB)
ORRNE r1,r1,#THUMB_BIT ; If bit 0 set, add THUMB bit to CPSR
; Push CPSR on stack
STR r1,[r3], #-4
; Store solicited stack type on the top of the stack (0 = solicited)
MOV r2,#0
STR r2,[r3]
; Save the new stack pointer into the task's control block.
STR r3,[r0, #TC_STACK_POINTER]
; Return to caller
BX lr
;************************************************************************
;*
;* FUNCTION
;*
;* TCT_Check_Stack
;*
;* DESCRIPTION
;*
;* This function checks the current stack for overflow conditions.
;* Additionally, this function keeps track of the minimum amount
;* of stack space for the calling thread and returns the current
;* available stack space.
;*
;* CALLED BY
;*
;* TCC_Send_Signals Send signals to a task
;*
;* CALLS
;*
;* ERC_System_Error System error handler
;*
;* INPUTS
;*
;* None
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -