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

📄 tct.s

📁 MMI层OBJ不能完全编译
💻 S
📖 第 1 页 / 共 5 页
字号:
;*  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 + -