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

📄 os_cpu_a.lst

📁 at91sam7x256的TC已经编译好
💻 LST
📖 第 1 页 / 共 3 页
字号:
                                                   new task's context
  134    00000034              
  135    00000034              
  136    00000034              ;***********************************************
                               ************************************************
                               **********
  137    00000034              ;                         PERFORM A CONTEXT
                                SWITCH (From task level) - OSCtxSw()
  138    00000034              ;
  139    00000034              ; Note(s) : 1) OSCtxSw() is called in SYS mode
                                with BOTH FIQ and IRQ interrupts DISABLED
  140    00000034              ;
  141    00000034              ;           2) The pseudo-code for OSCtxSw()
                                is:
  142    00000034              ;              a) Save the current task's
                                context onto the current task's stack
  143    00000034              ;              b) OSTCBCur->OSTCBStkPtr =
                                SP;
  144    00000034              ;              c) OSTaskSwHook();
  145    00000034              ;              d) OSPrioCur             =
                                OSPrioHighRdy;
  146    00000034              ;              e) OSTCBCur              =
                                OSTCBHighRdy;
  147    00000034              ;              f) SP                    =
                                OSTCBHighRdy->OSTCBStkPtr;
  148    00000034              ;              g) Restore the new task's context
                                from the new task's stack
  149    00000034              ;              h) Return to new task's
                                code
  150    00000034              ;
  151    00000034              ;           3) Upon entry:
  152    00000034              ;              OSTCBCur      points to the
                                OS_TCB of the task to suspend
  153    00000034              ;              OSTCBHighRdy  points to the
                                OS_TCB of the task to resume
  154    00000034              ;***********************************************
                               ************************************************
                               **********
  155    00000034              
  156    00000000                      RSEG CODE:CODE:NOROOT(2)
  157    00000000                      CODE32
  158    00000000              
  159    00000000              OSCtxSw
  160    00000000                                                      ; SAVE
                                CURRENT TASK'S CONTEXT
  161    00000000 00402DE9             STMFD   SP!, {LR}               ;    
                                                   Push return address
  162    00000004 00402DE9             STMFD   SP!, {LR}
  163    00000008 FF1F2DE9             STMFD   SP!, {R0-R12}           ;    
                                                   Push registers
  164    0000000C 00400FE1             MRS     R4,  CPSR               ;    
                                                     Push current CPSR
  165    00000010 01001EE3             TST     LR, #1                  ;    
                                                    See if called from Thumb
                                                    mode
  166    00000014 20408413             ORRNE   R4,  R4, #0x20          ;     If
                                                     yes, Set the T-bit
  167    00000018 10002DE9             STMFD   SP!, {R4}
  168    0000001C              
  169    0000001C ........             LDR     R4, ??OS_TCBCur         ;
                                                    OSTCBCur->OSTCBStkPtr =
                                                    SP;
  170    00000020 005094E5             LDR     R5, [R4]
  171    00000024 00D085E5             STR     SP, [R5]
  172    00000028              
  173    00000028 ........             LDR     R0, ??OS_TaskSwHook     ;
                                                    OSTaskSwHook();
  174    0000002C 0FE0A0E1             MOV     LR, PC
  175    00000030 10FF2FE1             BX      R0
  176    00000034              
  177    00000034 ........             LDR     R4, ??OS_PrioCur        ;
                                                    OSPrioCur = OSPrioHighRdy
  178    00000038 ........             LDR     R5, ??OS_PrioHighRdy
  179    0000003C 0060D5E5             LDRB    R6, [R5]
  180    00000040 0060C4E5             STRB    R6, [R4]
  181    00000044              
  182    00000044 ........             LDR     R4, ??OS_TCBCur         ;
                                                    OSTCBCur  = OSTCBHighRdy;
  183    00000048 ........             LDR     R6, ??OS_TCBHighRdy
  184    0000004C 006096E5             LDR     R6, [R6]
  185    00000050 006084E5             STR     R6, [R4]
  186    00000054              
  187    00000054 00D096E5             LDR     SP, [R6]                ; SP =
                                                    OSTCBHighRdy->OSTCBStkPtr;
  188    00000058              
  189    00000058                                                      ;
                                RESTORE NEW TASK'S CONTEXT
  190    00000058 1000BDE8             LDMFD   SP!, {R4}               ;    Pop
                                                   new task's CPSR
  191    0000005C 04F06FE1             MSR     SPSR_cxsf, R4
  192    00000060              
  193    00000060 FFDFFDE8             LDMFD   SP!, {R0-R12,LR,PC}^    ;    Pop
                                                   new task's context
  194    00000064              
  195    00000064              
  196    00000064              ;***********************************************
                               ************************************************
                               **********
  197    00000064              ;                   PERFORM A CONTEXT SWITCH
                                (From interrupt level) - OSIntCtxSw()
  198    00000064              ;
  199    00000064              ; Note(s) : 1) OSIntCtxSw() is called in SYS
                                mode with BOTH FIQ and IRQ interrupts
                                DISABLED
  200    00000064              ;
  201    00000064              ;           2) The pseudo-code for OSCtxSw()
                                is:
  202    00000064              ;              a) OSTaskSwHook();
  203    00000064              ;              b) OSPrioCur             =
                                OSPrioHighRdy;
  204    00000064              ;              c) OSTCBCur              =
                                OSTCBHighRdy;
  205    00000064              ;              d) SP                    =
                                OSTCBHighRdy->OSTCBStkPtr;
  206    00000064              ;              e) Restore the new task's context
                                from the new task's stack
  207    00000064              ;              f) Return to new task's
                                code
  208    00000064              ;
  209    00000064              ;           3) Upon entry:
  210    00000064              ;              OSTCBCur      points to the
                                OS_TCB of the task to suspend
  211    00000064              ;              OSTCBHighRdy  points to the
                                OS_TCB of the task to resume
  212    00000064              ;***********************************************
                               ************************************************
                               **********
  213    00000064              
  214    00000000                      RSEG CODE:CODE:NOROOT(2)
  215    00000000                      CODE32
  216    00000000              
  217    00000000              OSIntCtxSw
  218    00000000 ........             LDR     R0, ??OS_TaskSwHook     ;
                                                    OSTaskSwHook();
  219    00000004 0FE0A0E1             MOV     LR, PC
  220    00000008 10FF2FE1             BX      R0
  221    0000000C              
  222    0000000C ........             LDR     R4,??OS_PrioCur         ;
                                                   OSPrioCur = OSPrioHighRdy
  223    00000010 ........             LDR     R5,??OS_PrioHighRdy
  224    00000014 0060D5E5             LDRB    R6,[R5]
  225    00000018 0060C4E5             STRB    R6,[R4]
  226    0000001C              
  227    0000001C ........             LDR     R4,??OS_TCBCur          ;
                                                   OSTCBCur  = OSTCBHighRdy;
  228    00000020 ........             LDR     R6,??OS_TCBHighRdy
  229    00000024 006096E5             LDR     R6,[R6]
  230    00000028 006084E5             STR     R6,[R4]
  231    0000002C              
  232    0000002C 00D096E5             LDR     SP,[R6]                 ; SP =
                                                   OSTCBHighRdy->OSTCBStkPtr;
  233    00000030              
  234    00000030                                                      ;
                                RESTORE NEW TASK'S CONTEXT
  235    00000030 1000BDE8             LDMFD   SP!, {R4}               ;    Pop
                                                   new task's CPSR
  236    00000034 04F06FE1             MSR     SPSR_cxsf, R4
  237    00000038              
  238    00000038 FFDFFDE8             LDMFD   SP!, {R0-R12,LR,PC}^    ;    Pop
                                                   new task's context
  239    0000003C              
  240    0000003C              
  241    0000003C              ;***********************************************
                               ************************************************
                               **********
  242    0000003C              ;                                      IRQ
                                Interrupt Service Routine
  243    0000003C              ;***********************************************
                               ************************************************
                               **********
  244    0000003C              
  245    00000000                      RSEG CODE:CODE:NOROOT(2)
  246    00000000                      CODE32
  247    00000000              
  248    00000000              OS_CPU_IRQ_ISR
  249    00000000              
  250    00000000 0E002DE9             STMFD   SP!, {R1-R3}                   ;
                                                   PUSH WORKING REGISTERS ONTO
                                                   IRQ STACK
  251    00000004              
  252    00000004 0D10A0E1             MOV     R1, SP                         ;
                                                    Save   IRQ stack pointer
  253    00000008              
  254    00000008 0CD08DE2             ADD     SP, SP,#12                     ;
                                                    Adjust IRQ stack pointer
  255    0000000C              
  256    0000000C 04204EE2             SUB     R2, LR,#4                      ;
                                                    Adjust PC for return
                                                    address to task
  257    00000010              
  258    00000010 00304FE1             MRS     R3, SPSR                       ;
                                                    Copy SPSR (i.e. interrupted
                                                    task's CPSR) to R3
  259    00000014              
  260    00000014 D3F021E3             MSR     CPSR_c, #(NO_INT | SVC32_MODE) ;
                                                        Change to SVC
                                                        mode
  261    00000018              
  262    00000018                                                             ;
                                SAVE TASK'S CONTEXT ONTO TASK'S STACK
  263    00000018 04002DE9             STMFD   SP!, {R2}                      ;
                                                      Push task's Return
                                                   PC
  264    0000001C 00402DE9             STMFD   SP!, {LR}                      ;
                                                      Push task's LR
  265    00000020 F01F2DE9             STMFD   SP!, {R4-R12}                  ;
                                                      Push task's R12-R4
  266    00000024              
  267    00000024 7000B1E8             LDMFD   R1!, {R4-R6}                   ;
                                                      Move task's R1-R3 from
                                                   IRQ stack to SVC stack
  268    00000028 70002DE9             STMFD   SP!, {R4-R6}
  269    0000002C 01002DE9             STMFD   SP!, {R0}                      ;
                                                      Push task's R0    onto
                                                   task's stack

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -