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

📄 os_cpu_a.lst

📁 这个是我将UCOS移植到LPC系列的基本模版,大家可以下载下来参考下,和ZLG的完全不一样,并不是采用软中断实现任务切换,更加稳定.如果有问题可以rayeryanglei@126.com
💻 LST
📖 第 1 页 / 共 4 页
字号:
  186 00000028 E51F0008        LDR              R0, LAB_OS_TaskSwHook 
                                                            ; OSTaskSwHook();
  187 0000002C E1A0E00F        MOV              LR, PC
  188 00000030 E12FFF10        BX               R0
  189 00000034         
  190 00000034 E51F4008        LDR              R4, LAB_OS_PrioCur ; OSPrioCur 
                                                            = OSPrioHighRdy
  191 00000038 E51F5008        LDR              R5, LAB_OS_PrioHighRdy
  192 0000003C E5D56000        LDRB             R6, [R5]
  193 00000040 E5C46000        STRB             R6, [R4]
  194 00000044         
  195 00000044 E51F4008        LDR              R4, LAB_OS_TCBCur ; OSTCBCur  =
                                                             OSTCBHighRdy;
  196 00000048 E51F6008        LDR              R6, LAB_OS_TCBHighRdy
  197 0000004C E5966000        LDR              R6, [R6]
  198 00000050 E5846000        STR              R6, [R4]
  199 00000054         
  200 00000054 E596D000        LDR              SP, [R6]    ; SP = OSTCBHighRdy
                                                            ->OSTCBStkPtr;
  201 00000058         
  202 00000058         ; RESTORE NEW TASK'S CONTEXT
  203 00000058 E8BD0010        LDMFD            SP!, {R4}   ;    Pop new task's
                                                             CPSR
  204 0000005C E16FF004        MSR              SPSR_cxsf, R4
  205 00000060         
  206 00000060 E8FDDFFF        LDMFD            SP!, {R0-R12,LR,PC}^ ;    Pop n
                                                            ew task's context
  207 00000064         
  208 00000064         
  209 00000064         ;*******************************************************
                       **************************************************
  210 00000064         ;                   PERFORM A CONTEXT SWITCH (From inter
                       rupt level) - OSIntCtxSw()



ARM Macro Assembler    Page 6 


  211 00000064         ;
  212 00000064         ; Note(s) : 1) OSIntCtxSw() is called in SYS mode with B
                       OTH FIQ and IRQ interrupts DISABLED
  213 00000064         ;
  214 00000064         ;           2) The pseudo-code for OSCtxSw() is:
  215 00000064         ;              a) OSTaskSwHook();
  216 00000064         ;              b) OSPrioCur             = OSPrioHighRdy;
                       
  217 00000064         ;              c) OSTCBCur              = OSTCBHighRdy;
  218 00000064         ;              d) SP                    = OSTCBHighRdy->
                       OSTCBStkPtr;
  219 00000064         ;              e) Restore the new task's context from th
                       e new task's stack
  220 00000064         ;              f) Return to new task's code
  221 00000064         ;
  222 00000064         ;           3) Upon entry:
  223 00000064         ;              OSTCBCur      points to the OS_TCB of the
                        task to suspend
  224 00000064         ;              OSTCBHighRdy  points to the OS_TCB of the
                        task to resume
  225 00000064         ;*******************************************************
                       **************************************************
  226 00000064                 AREA             CODE4,CODE,READONLY
  227 00000000                 ARM
  228 00000000         ;        RSEG CODE:CODE:NOROOT(2)
  229 00000000         ;        CODE32
  230 00000000         
  231 00000000         OSIntCtxSw
  232 00000000 E51F0008        LDR              R0, LAB_OS_TaskSwHook 
                                                            ; OSTaskSwHook();
  233 00000004 E1A0E00F        MOV              LR, PC
  234 00000008 E12FFF10        BX               R0
  235 0000000C         
  236 0000000C E51F4008        LDR              R4,LAB_OS_PrioCur ; OSPrioCur =
                                                             OSPrioHighRdy
  237 00000010 E51F5008        LDR              R5,LAB_OS_PrioHighRdy
  238 00000014 E5D56000        LDRB             R6,[R5]
  239 00000018 E5C46000        STRB             R6,[R4]
  240 0000001C         
  241 0000001C E51F4008        LDR              R4,LAB_OS_TCBCur ; OSTCBCur  = 
                                                            OSTCBHighRdy;
  242 00000020 E51F6008        LDR              R6,LAB_OS_TCBHighRdy
  243 00000024 E5966000        LDR              R6,[R6]
  244 00000028 E5846000        STR              R6,[R4]
  245 0000002C         
  246 0000002C E596D000        LDR              SP,[R6]     ; SP = OSTCBHighRdy
                                                            ->OSTCBStkPtr;
  247 00000030         
  248 00000030         ; RESTORE NEW TASK'S CONTEXT
  249 00000030 E8BD0010        LDMFD            SP!, {R4}   ;    Pop new task's
                                                             CPSR
  250 00000034 E16FF004        MSR              SPSR_cxsf, R4
  251 00000038         
  252 00000038 E8FDDFFF        LDMFD            SP!, {R0-R12,LR,PC}^ ;    Pop n
                                                            ew task's context
  253 0000003C         
  254 0000003C         
  255 0000003C         ;*******************************************************
                       **************************************************



ARM Macro Assembler    Page 7 


  256 0000003C         ;                                      IRQ Interrupt Ser
                       vice Routine
  257 0000003C         ;*******************************************************
                       **************************************************
  258 0000003C                 AREA             CODE5,CODE,READONLY
  259 00000000                 ARM
  260 00000000         ;        RSEG CODE:CODE:NOROOT(2)
  261 00000000         ;        CODE32
  262 00000000         
  263 00000000         OS_CPU_IRQ_ISR
  264 00000000         ; Disable FIQ for a moment 
  265 00000000 E321F0D2        MSR              CPSR_c, #(NO_INT | IRQ32_MODE) 
                                                            ; Change to IRQ mod
                                                            e (to use the IRQ s
                                                            tack to handle inte
                                                            rrupt)
  266 00000004 E92D000E        STMFD            SP!, {R1-R3} ; PUSH WORKING REG
                                                            ISTERS ONTO IRQ STA
                                                            CK
  267 00000008 E1A0100D        MOV              R1, SP      ; Save   IRQ stack 
                                                            pointer
  268 0000000C E28DD00C        ADD              SP, SP,#12  ; Adjust IRQ stack 
                                                            pointer
  269 00000010 E24E2004        SUB              R2, LR,#4   ; Adjust PC for ret
                                                            urn address to task
                                                            
  270 00000014 E14F3000        MRS              R3, SPSR    ; Copy SPSR (i.e. i
                                                            nterrupted task's C
                                                            PSR) to R3
  271 00000018 E321F0D3        MSR              CPSR_c, #(NO_INT | SVC32_MODE) 
                                                            ; Change to SVC mod
                                                            e
  272 0000001C         
  273 0000001C         ; SAVE TASK'S CONTEXT ONTO TASK'S STACK
  274 0000001C E92D0004        STMFD            SP!, {R2}   ;    Push task's Re
                                                            turn PC
  275 00000020 E92D4000        STMFD            SP!, {LR}   ;    Push task's LR
                                                            
  276 00000024 E92D1FF0        STMFD            SP!, {R4-R12} ;    Push task's 
                                                            R12-R4
  277 00000028         
  278 00000028 E8B10070        LDMFD            R1!, {R4-R6} ;    Move task's R
                                                            1-R3 from IRQ stack
                                                             to SVC stack
  279 0000002C E92D0070        STMFD            SP!, {R4-R6}
  280 00000030 E92D0001        STMFD            SP!, {R0}   ;    Push task's R0
                                                                onto task's sta
                                                            ck
  281 00000034 E92D0008        STMFD            SP!, {R3}   ;    Push task's CP
                                                            SR (i.e. IRQ's SPSR
                                                            )
  282 00000038         
  283 00000038         ; HANDLE NESTING COUNTER
  284 00000038 E51F0008        LDR              R0, LAB_OS_IntNesting 
                                                            ; OSIntNesting++;
  285 0000003C E5D01000        LDRB             R1, [R0]
  286 00000040 E2811001        ADD              R1, R1,#1
  287 00000044 E5C01000        STRB             R1, [R0]
  288 00000048         



ARM Macro Assembler    Page 8 


  289 00000048 E3510001        CMP              R1, #1      ; if (OSIntNesting 
                                                            == 1) {
  290 0000004C 1A000002        BNE              OS_CPU_IRQ_ISR_1
  291 00000050         
  292 00000050 E51F4008        LDR              R4, LAB_OS_TCBCur ;     OSTCBCu
                                                            r->OSTCBStkPtr = SP
                                                            
  293 00000054 E5945000        LDR              R5, [R4]
  294 00000058 E585D000        STR              SP, [R5]    ; }
  295 0000005C         
  296 0000005C         OS_CPU_IRQ_ISR_1
  297 0000005C E321F092        MSR              CPSR_c, #(NO_IRQ | IRQ32_MODE) 
                                                            ; Re-enable FIQ, Ch
                                                            ange to IRQ mode (t
                                                            o use the IRQ stack
                                                             to handle interrup
                                                            t)
  298 00000060         
  299 00000060 E51F0008        LDR              R0, LAB_OS_CPU_IRQ_ISR_Handler 
                                                            ; OS_CPU_IRQ_ISR_Ha
                                                            ndler();
  300 00000064 E1A0E00F        MOV              LR, PC
  301 00000068 E12FFF10        BX               R0
  302 0000006C         
  303 0000006C E321F0D3        MSR              CPSR_c, #(NO_INT | SVC32_MODE) 
                                                            ; Change to SVC mod
                                                            e
  304 00000070         
  305 00000070 E51F0008        LDR              R0, LAB_OS_IntExit 
                                                            ; OSIntExit();
  306 00000074 E1A0E00F        MOV              LR, PC
  307 00000078 E12FFF10        BX               R0
  308 0000007C         
  309 0000007C         ; RESTORE NEW TASK'S CONTEXT
  310 0000007C E8BD0010        LDMFD            SP!, {R4}   ;    Pop new task's
                                                             CPSR
  311 00000080 E16FF004        MSR              SPSR_cxsf, R4
  312 00000084         
  313 00000084 E8FDDFFF        LDMFD            SP!, {R0-R12,LR,PC}^ ;    Pop n
                                                            ew task's context
  314 00000088         
  315 00000088         
  316 00000088         ;*******************************************************
                       **************************************************
  317 00000088         ;                                      FIQ Interrupt Ser
                       vice Routine
  318 00000088         ;*******************************************************
                       **************************************************
  319 00000088                 AREA             CODE6,CODE,READONLY
  320 00000000                 ARM
  321 00000000         
  322 00000000         
  323 00000000         
  324 00000000         ;       RSEG CODE:CODE:NOROOT(2)
  325 00000000         ;        CODE32
  326 00000000         
  327 00000000         OS_CPU_FIQ_ISR
  328 00000000         
  329 00000000 E92D001E        STMFD            SP!, {R1-R4} ; PUSH WORKING REG



ARM Macro Assembler    Page 9 


                                                            ISTERS ONTO FIQ STA
                                                            CK
  330 00000004 E1A0100D        MOV              R1, SP      ; Save   FIQ stack 
                                                            pointer
  331 00000008 E24E2004        SUB              R2, LR,#4   ; Adjust PC for ret
                                                            urn address to task
                                                            
  332 0000000C E14F3000        MRS              R3, SPSR    ; Copy SPSR (i.e. i
                                                            nterrupted task's C
                                                            PSR) to R3 and R4
  333 00000010 E1A04003        MOV              R4, R3
  334 00000014         
  335 00000014 E204401F        AND              R4, R4, #0x1F 
                                                            ; Isolate Mode bits
                                                            
  336 00000018 E3540012        CMP              R4, #IRQ32_MODE ; See if we int
                                                            errupted an IRQ
  337 0000001C 0A00001C        BEQ              OS_CPU_FIQ_ISR_2 
                                                            ; Branch if yes.
  338 00000020         
  339 00000020         
  340 00000020         ; =============== FIQ interrupted Task ===============
  341 00000020 E321F0D3        MSR              CPSR_c, #(NO_INT | SVC32_MODE) 
                                                            ; Change to SVC mod
                                                            e
  342 00000024         ; SAVE TASK'S CONTEXT ONTO TASK'S STACK
  343 00000024 E92D0004        STMFD            SP!, {R2}   ;    Push task's Re
                                                            turn PC
  344 00000028 E92D4000        STMFD            SP!, {LR}   ;    Push task's LR
                                                            
  345 0000002C E92D1FE0        STMFD            SP!, {R5-R12} ;    Push task's 
                                                            R12-R5
  346 00000030         
  347 00000030 E8B101E0        LDMFD            R1!, {R5-R8} ;    Move task's R
                                                            1-R4 from FIQ stack
                                                             to SVC stack
  348 00000034 E92D01E0        STMFD            SP!, {R5-R8}
  349 00000038 E92D0001        STMFD            SP!, {R0}   ;    Push task's R0
                                                             onto task's stack
  350 0000003C E92D0008        STMFD            SP!, {R3}   ;    Push task's CP
                                                            SR (i.e. FIQ's SPSR
                                                            )
  351 00000040         ; HANDLE NESTING COUNTER
  352 00000040 E59F0098        LDR              R0, LAB_OS_IntNesting 
                                                            ; OSIntNesting++;
  353 00000044 E5D01000        LDRB             R1, [R0]
  354 00000048 E2811001        ADD              R1, R1,#1
  355 0000004C E5C01000        STRB             R1, [R0]
  356 00000050         
  357 00000050 E3510001        CMP              R1, #1      ; if (OSIntNesting 
                                                            == 1){
  358 00000054 1A000002        BNE              OS_CPU_FIQ_ISR_1
  359 00000058 E59F4090        LDR              R4, LAB_OS_TCBCur ;     OSTCBCu
                                                            r->OSTCBStkPtr = SP
                                                            
  360 0000005C E5945000        LDR              R5, [R4]
  361 00000060 E585D000        STR              SP, [R5]    ; }
  362 00000064         

⌨️ 快捷键说明

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