目录  一、cortex-m4 los_dispatch.S代码分析 坚持就有收获   
 
.syntax unified     
.arch armv7e-m      
.fpu fpv4-sp-d16    
.thumb              
.equ    OS_FPU_CPACR,                0xE000ED88
.equ    OS_FPU_CPACR_ENABLE,         0x00F00000
.equ    OS_NVIC_INT_CTRL,            0xE000ED04
.equ    OS_NVIC_SYSPRI2,             0xE000ED20
.equ    OS_NVIC_PENDSV_PRI,          0xF0F00000
.equ    OS_NVIC_PENDSVSET,           0x10000000
.equ    OS_TASK_STATUS_RUNNING,      0x0010
.equ    OS_CONTROL_FPCA_ENABLE,      0x4
.equ    OS_CONTROL_KERNEL_MODE,      0x2
.equ    OS_CONTROL_USER_MODE,        0x3
.equ    OS_TASK_FLAG_USER_TASK,      0x0200
.section .text      .thumb
.macro SIGNAL_CONTEXT_RESTOREpush    { r12, lr} blx     OsSignalTaskContextRestorepop     { r12, lr} cmp      r0, mov     r1, r0bne     SignalContextRestore
.endm.type HalStartToRun, %function  .global HalStartToRun           
HalStartToRun:                      .fnstart                        .cantunwind                     ldr     r4, = OS_NVIC_SYSPRI2        ldr     r5, = OS_NVIC_PENDSV_PRI     str     r5, [ r4]                     mov     r0, msr     CONTROL, r0     ldr     r1, = g_losTask      ldr     r0, [ r1, ldr     r12, [ r0]            ldr.w   r1, = OS_FPU_CPACRldr     r1, [ r1] and     r1, r1, cmp      r1, bne     __DisabledFPU           add      r12, r12, ldmfd   r12! , { R0-R7} add      r12, r12, msr     psp, r12vpush   { s0} vpop    { s0} mov     lr, r5cpsie   ibx      r6__DisabledFPU:add      r12, r12, ldmfd   r12! , { r0-r7}        msr     psp, r12            mov     lr, r5              cpsie   I                   bx      r6                  .fnend                  .type ArchIntLock, %function.global ArchIntLock
ArchIntLock:.fnstart.cantunwindMRS R0, PRIMASKCPSID IBX LR.fnend.type ArchIntUnLock, %function.global ArchIntUnLock
ArchIntUnLock:.fnstart.cantunwindMRS R0, PRIMASKCPSIE IBX LR.fnend.type ArchIntRestore, %function.global ArchIntRestore
ArchIntRestore:.fnstart.cantunwindMSR PRIMASK, R0BX LR.fnend.type ArchTaskSchedule, %function.global ArchTaskSchedule
ArchTaskSchedule:.fnstart.cantunwindldr     r0, = OS_NVIC_INT_CTRLldr     r1, = OS_NVIC_PENDSVSETstr     r1, [ r0] bx      lrdsbisb.fnend.type HalPendSV, %function.global HalPendSV
HalPendSV:.fnstart.cantunwindmrs     r12, PRIMASKcpsid   IHalTaskSwitch:SIGNAL_CONTEXT_RESTOREpush    { r12, lr} blx     OsSchedTaskSwitchpop     { r12, lr} cmp      r0, mov     r0, lrbne     TaskContextSwitchmsr     PRIMASK, r12bx      lrTaskContextSwitch:mov     lr, r0mrs     r0, pspstmfd   r0! , { r4-r12} ldr.w   r3, = OS_FPU_CPACRldr     r3, [ r3] and     r3, r3, cmp      r3, bne     __DisabledFPU1vstmdb  r0! , { d8-d15} __DisabledFPU1:ldr     r5, = g_losTaskldr     r6, [ r5] str     r0, [ r6] ldr     r0, [ r5, str     r0, [ r5] ldr     r1, [ r0] SignalContextRestore:ldr.w   r3, = OS_FPU_CPACRldr     r3, [ r3] and     r3, r3, cmp      r3, bne     __DisabledFPU2vldmia  r1! , { d8-d15} __DisabledFPU2:
ldrh    r7, [ r0, tst     r7, ite     eqmoveq   r3, movne   r3, msr     CONTROL, r3
ldmfd   r1! , { r4-r12} msr     psp,  r1msr     PRIMASK, r12bx      lr.fnend