📄 tct.s
字号:
ADD r2,r3,#&4 ; Compute initial sp
STR r2,[r3], #-4 ; Store initial ip
STR r2,[r3], #-4 ; Store initial fp
LDR r2,[r0,#TC_STACK_START] ; Pickup the stack starting address
STR r2,[r3], #-4 ; Store initial r10
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
[ THUMB
STR r2,[r3], #-4 ; Store initial state mask
]
STR r2,[r3, #0] ; Store solicited stack type on the
; top of the stack
;
; /* Save the minimum amount of remaining stack memory. */
; hisr -> tc_stack_minimum = REG_Stack_Size - (ARM)44 or (THUMB)48;
;
[ THUMB
MOV r2,#48 ; Size of solicited stack frame
|
MOV r2,#44 ; Size of solicited stack frame
]
SUB r1,r1,r2 ; Compute minimum available bytes
STR r1,[r0, #TC_STACK_MINIMUM] ; Save in minimum stack area
;
; /* Save the new stack pointer into the task's control block. */
; hisr -> tc_stack_pointer = (VOID *) Stack_Top;
;
STR r3,[r0, #TC_STACK_POINTER] ; Save stack pointer
BX lr ; Return to caller
;}
;
;
;
;/*************************************************************************/
;/* */
;/* 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. */
;/* */
;/* CALLED BY */
;/* */
;/* TCC_Send_Signals Send signals to a task */
;/* */
;/* CALLS */
;/* */
;/* None */
;/* */
;/* INPUTS */
;/* */
;/* task Task control block pointer */
;/* */
;/* OUTPUTS */
;/* */
;/* None */
;/* */
;/* HISTORY */
;/* */
;/* NAME DATE REMARKS */
;/* */
;/* W. Lamie 02-15-1994 Created initial version 1.0 */
;/* D. Lamie 02-15-1994 Verified version 1.0 */
;/* */
;/*************************************************************************/
;VOID TCT_Build_Signal_Frame(TC_TCB *task)
;{
EXPORT TCT_Build_Signal_Frame
TCT_Build_Signal_Frame
;
; /* Pickup the stack pointer. */
; REG_Stack_Ptr = (BYTE_PTR) task -> tc_stack_pointer;
;
LDR r3,[r0,#TC_STACK_POINTER] ; Pickup the current stack pointer
;
; /* Reference the Signal shell. */
; REG_Function_Ptr = (VOID *) TCC_Signal_Shell;
;
; /* Build a signal stack. This signal stack frame facilitates an
; solicited return to the TCC_Signal_Shell function, which in turn
; invokes the appropriate signal handler. The initial HISR stack frame
; has the following format:
;
; (Lower Address) Stack Top -> 0 (Solicited stack type)
; !!FOR THUMB ONLY!! 0/0x20 Saved state mask
; 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
; */
;
LDR r2,Signal_Shell ; Pickup address of shell entry
[ THUMB
BIC r2,r2,#1 ; Clear low bit
]
SUB r3,r3,#4 ; Reserve a word
STR r2,[r3], #-4 ; Store entry address on stack
ADD r2,r3,#&4 ; Compute initial sp
STR r2,[r3], #-4 ; Store initial ip
STR r2,[r3], #-4 ; Store initial fp
LDR r2,[r0,#TC_STACK_START] ; Pickup the stack starting address
STR r2,[r3], #-4 ; Store initial r10
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
[ THUMB
MOV r1,#&20 ; Get initial state mask
STR r1,[r3], #-4 ; Store initial state mask
]
STR r2,[r3, #0] ; Store solicited stack type on the
; top of the stack
;
; /* Save the new stack pointer into the task's control block. */
; task -> tc_stack_pointer = (VOID *) (REG_Stack_Ptr - REG_Stack_Size);
;
STR r3,[r0, #TC_STACK_POINTER] ; Save stack pointer
BX lr ; Return to caller
;}
;
;
;
;/*************************************************************************/
;/* */
;/* 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 */
;/* */
;/* available bytes in stack */
;/* */
;/* HISTORY */
;/* */
;/* NAME DATE REMARKS */
;/* */
;/* W. Lamie 02-15-1994 Created initial version 1.0 */
;/* D. Lamie 02-15-1994 Verified version 1.0 */
;/* */
;/*************************************************************************/
;UNSIGNED TCT_Check_Stack(void)
;{
EXPORT TCT_Check_Stack
TCT_Check_Stack
;
;TC_TCB *thread;
;UNSIGNED remaining;
;
; /* Pickup the current task/HISR pointer. */
; thread = (TC_TCB *) TCD_Current_Thread;
;
LDR r0,Current_Thread ; Pickup address of thread pointer
LDR r0,[r0,#0] ; Pickup thread pointer
;
; /* Determine if there is a current thread. */
; if (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 pointers are out of range. */
; if ((thread -> tc_stack_pointer < thread -> tc_stack_start) ||
; (thread -> tc_stack_pointer > thread -> tc_stack_end))
;
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
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
;
; /* Stack overflow condition exits. */
; ERC_System_Error(NU_STACK_OVERFLOW);
;
TCT_Stack_Range_Error
;
STR lr,[sp, #4]! ; Store lr on the stack
MOV r0,#3 ; Build NU_STACK_OVERFLOW code
LDR r3,=ERC_System_Error ; Call system error handler. Note:
BX r3 ; control is not returned!
; ; Examine stack to find return
; ; address of this routine.
TCT_Stack_Range_Okay
;
; /* Calculate the amount of available space on the stack. */
; remaining = (BYTE_PTR) thread -> tc_stack_pointer -
; (BYTE_PTR) thread -> tc_stack_start;
;
SUB r3,sp,r2 ; Calculate remaining stack size
;
; /* Determine if there is enough memory on the stack to save all of the
; registers. */
; if (remaining < 80)
;
CMP r3,#80 ; Is there enough room for an
; interrupt frame?
BCS TCT_No_Stack_Error ; If so, no stack overflow yet
;
; /* Stack overflow condition is about to happen. */
; ERC_System_Error(NU_STACK_OVERFLOW);
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -