📄 tct.s
字号:
;* CALLS
;*
;* None
;*
;* INPUTS
;*
;* r0 - Task Control Block pointer
;*
;* OUTPUTS
;*
;* None
;*
;* REGISTERS MODIFIED
;*
;* r1, r2, r3
;*
;* HISTORY
;*
;* NAME DATE REMARKS
;*
;* S. Nguyen 03/28/2005 Released version 1.15.1
;*
;************************************************************************
;VOID TCT_Build_Task_Stack(TC_TCB *task);
.def _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,#0x8 ; 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
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
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
;*
;* S. Nguyen 03/28/2005 Released version 1.15.1
;*
;************************************************************************
;VOID TCT_Build_HISR_Stack(TC_HCB *hisr);
.def _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_Shell1 ; Pickup address of shell entry
STR r2,[r3], #-4 ; Store entry address on stack
ADD r2,r3,#0x4 ; 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
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
;*
;* S. Nguyen 03/28/2005 Released version 1.15.1
;*
;************************************************************************
;VOID TCT_Build_Signal_Frame(TC_TCB *task);
.def _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,#0x4 ; 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
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
;*
;* OUTPUTS
;*
;* r0 - Available bytes on stack
;*
;* REGISTERS MODIFIED
;*
;* r0, r1, r2, r3
;*
;* HISTORY
;*
;* NAME DATE REMARKS
;*
;* S. Nguyen 03/28/2005 Released version 1.15.1
;*
;************************************************************************
;INT TCT_Check_Stack(VOID);
.def _TCT_Check_Stack
_TCT_Check_Stack
; Pickup the current thread pointer.
LDR r0,TCT_Current_Thread1
LDR r0,[r0]
; Determine if there is a current thread.
CMP r0,#0 ; Determine if a thread is active
MOV r3,#0 ; Default remaining value
BEQ TCT_Skip_Stack_Check ; If NU_NULL, skip stack checking
; Determine if the stack pointer has overflowed
LDR r2,[r0,#TC_STACK_START] ; Pickup start of stack area
CMP sp,r2 ; Compare with current stack ptr
BLT TCT_Stack_Range_Error ; If less, stack is out of range
; Determine if the stack pointer has underflowed
LDR r1,[r0,#TC_STACK_END] ; Pickup end of stack area
CMP sp,r1 ; Compare with current stack ptr
BLE TCT_Stack_Range_Okay ; If less, stack range is okay
TCT_Stack_Range_Error
MOV r0,#3 ; Build NU_STACK_OVERFLOW code
BL _ERC_System_Error ; Call system error handler
TCT_Stack_Range_Okay
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -