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

📄 threadx_cpus.s

📁 hreadx实时嵌入式操作系统源代码,ARM移植. threadx是一个很好的多任务实时嵌入式操作系统
💻 S
📖 第 1 页 / 共 2 页
字号:
;/*  OUTPUT                                                                */ 
;/*                                                                        */ 
;/*    None                                                                */ 
;/*                                                                        */ 
;/*  CALLS                                                                 */ 
;/*                                                                        */ 
;/*    __tx_thread_contex_restore                                          */                          */ 
;/*                                                                        */ 
;/*  CALLED BY                                                             */ 
;/*                                                                        */ 
;/*    core                                                                */ 
;/*                                                                        */ 
;/*  RELEASE HISTORY                                                       */ 
;/*                                                                        */ 
;/*    DATE              NAME                      DESCRIPTION             */ 
;/*                                                                        */ 
;/*                                                                        */ 
;/**************************************************************************/ 
__tx_thread_restore    
    MSR     CPSR_cxsf,  #(Mode_SYS | NO_IRQ)
    LDR     SP,     =__ptx_sys_statck
    LDR     SP,     [SP]

    LDR     R0,     =_tx_thread_execute_ptr
    LDR     R0,     [R0]
    LDR     R1,     =_tx_thread_current_ptr
    LDR     R1,     [R1]
    CMP     R0,     R1
    BNE     __tx_thread_shedu
    MSR     CPSR_cxsf,   #(Mode_SYS)
__tx_thread_restore_loop
    B       . 
    
__tx_thread_shedu    
    BL      __tx_thread_contex_restore
    
    LDR     R0,     =_tx_thread_current_ptr
    MOV     R2,     #0
    LDR     R0,     [R0]
    LDR     R1,     [R0,    #8]
    STR     R2,     [R0,    #8]
    LDMFD   R1!,    {R0,    LR}
    ADD     SP,     R1,     #4*14
    
    MSR     CPSR_cxsf,      #(Mode_SVC | NO_IRQ)
    MOV     SP,             R1
    MSR     SPSR_cxsf,      R0
    LDMFD   SP!,    {R0-R12, PC}^

;/**************************************************************************/ 
;/*                                                                        */ 
;/*  FUNCTION                                               RELEASE        */ 
;/*                                                                        */ 
;/*    __tx_thread_swi_system_return                                       */ 
;/*                                                           3.0a         */ 
;/*  AUTHOR                                                                */ 
;/*                                                                        */ 
;/*                                                                        */ 
;/*                                                                        */ 
;/*  DESCRIPTION                                                           */ 
;/*                                                                        */ 
;/*    Save contex and switch to a new Thread,                             */ 
;/*                                                                        */ 
;/*  INPUT                                                                 */ 
;/*                                                                        */ 
;/*    R1   register of cpsr befor break                                   */ 
;/*                                                                        */ 
;/*  OUTPUT                                                                */ 
;/*                                                                        */ 
;/*    None                                                                */ 
;/*                                                                        */ 
;/*  CALLS                                                                 */ 
;/*                                                                        */ 
;/*    None                                                                */ 
;/*                                                                        */ 
;/*  CALLED BY                                                             */ 
;/*                                                                        */ 
;/*    _tx_initialize_kernel_enter                                         */ 
;/*                                                                        */ 
;/*  RELEASE HISTORY                                                       */ 
;/*                                                                        */ 
;/*    DATE              NAME                      DESCRIPTION             */ 
;/*                                                                        */ 
;/*                                                                        */ 
;/**************************************************************************/ 
__tx_thread_swi_schedule
    LDR     PC,     =__tx_thread_restore
        
;/**************************************************************************/ 
;/*                                                                        */ 
;/*  FUNCTION                                               RELEASE        */ 
;/*                                                                        */ 
;/*    __tx_initialize_low_level                                           */ 
;/*                                                           3.0a         */ 
;/*  AUTHOR                                                                */ 
;/*                                                                        */ 
;/*                                                                        */ 
;/*                                                                        */ 
;/*  DESCRIPTION                                                           */ 
;/*                                                                        */ 
;/*    initialize stack for irq fiq svc and undef mode,                    */ 
;/*                                                                        */ 
;/*  INPUT                                                                 */ 
;/*                                                                        */ 
;/*    None                                                                */ 
;/*                                                                        */ 
;/*  OUTPUT                                                                */ 
;/*                                                                        */ 
;/*    None                                                                */ 
;/*                                                                        */ 
;/*  CALLS                                                                 */ 
;/*                                                                        */ 
;/*    None                                                                */ 
;/*                                                                        */ 
;/*  CALLED BY                                                             */ 
;/*                                                                        */ 
;/*    _tx_initialize_kernel_enter                                         */ 
;/*                                                                        */ 
;/*  RELEASE HISTORY                                                       */ 
;/*                                                                        */ 
;/*    DATE              NAME                      DESCRIPTION             */ 
;/*                                                                        */ 
;/*                                                                        */ 
;/**************************************************************************/ 
__tx_initialize_low_level
    MOV             R0,     LR
    MSR             CPSR_c, #(Mode_SVC | NO_FIQ | NO_IRQ)
    ldr             sp,     =__ptx_svc_statck
    ldr             sp,     [sp]
    MSR             CPSR_c, #(Mode_IRQ | NO_FIQ | NO_IRQ)
    ldr             sp,     =__ptx_irq_statck
    ldr             sp,     [sp]
    MSR             CPSR_c, #(Mode_FIQ | NO_FIQ | NO_IRQ)
    ldr             sp,     =__ptx_fiq_statck
    ldr             sp,     [sp]
    MSR             CPSR_c, #(Mode_ABT | NO_FIQ | NO_IRQ)
    ldr             sp,     =__ptx_about_statck
    ldr             sp,     [sp]
    MSR             CPSR_c, #(Mode_UND | NO_FIQ | NO_IRQ)
    ldr             sp,     =__ptx_undef_statck
    ldr             sp,     [sp]
    MSR             CPSR_c, #(Mode_SYS | NO_FIQ | NO_IRQ)
    ldr             sp,     =__ptx_sys_statck
    ldr             sp,     [sp]
    
    MOV             PC,     LR

;/**************************************************************************/ 
;/*                                                                        */ 
;/*  FUNCTION                                               RELEASE        */ 
;/*                                                                        */ 
;/*    __thread_irq_handle                                                 */ 
;/*                                                           3.0a         */ 
;/*  AUTHOR                                                                */ 
;/*                                                                        */ 
;/*                                                                        */ 
;/*                                                                        */ 
;/*  DESCRIPTION                                                           */ 
;/*                                                                        */ 
;/*    irq handle function, Should be ecectud after irq interupt, on other */
;/*    words, it should been put at the vector table                       */ 
;/*                                                                        */ 
;/*  INPUT                                                                 */ 
;/*                                                                        */ 
;/*                                                                        */ 
;/*  OUTPUT                                                                */ 
;/*                                                                        */ 
;/*    None                                                                */ 
;/*                                                                        */ 
;/*  CALLS                                                                 */ 
;/*                                                                        */ 
;/*    None                                                                */ 
;/*                                                                        */ 
;/*  CALLED BY                                                             */ 
;/*                                                                        */ 
;/*    vector                                                              */ 
;/*                                                                        */ 
;/*  RELEASE HISTORY                                                       */ 
;/*                                                                        */ 
;/*    DATE              NAME                      DESCRIPTION             */ 
;/*                                                                        */ 
;/*                                                                        */ 
;/**************************************************************************/ 
__thread_irq_handle
        SUB     LR,     LR,     #4                      ; 计算返回地址
        STMFD   SP!,    {R0-R3, R12, LR}

        ; 
        ; 执行中断服务程序
        ; __irq_handle();
        ;
        BL      __irq_handle
        
        ; int   ret = _tx_thread_check_preep();
        ; switch (ret) {
        ; case 0:   __irq_exit_sample();
        ; case 1:   __irq_thread_swith_save_no();
        ; case 2:   __irq_thread_swich_save_all();
        BL      __tx_thread_preempt_check
        CMP     R0,         #4
        LDRLO   PC,         [PC, R0, LSL #2]

__irq_exit_sample
        LDMFD   SP!,        {R0-R3, R12, PC}^

__irq_thread_exit
        DCD     __irq_exit_sample
        DCD		__irq_thread_swith_save_no
        DCD     __irq_thread_swich_save_all

__irq_thread_swith_save_no                
        ADD     SP,     SP,     #4*6
        MSR     CPSR_cxsf,      #(Mode_SYS | NO_IRQ)        
        B       __irq_thread_swith_exit
        
__irq_thread_swich_save_all
        MRS     R0,     SPSR
        STMFD   SP!,    {R0}
        ADD     SP,     SP,     #4*7
        SUB     R0,     SP,		#4			; SPSR R0 R1 R2 R3 R12 PC
                                            ;                       ^
        									;					   R0
        MSR     CPSR_cxsf,      #(Mode_SYS | NO_IRQ)
        LDMFA   R0!,    {R1}				;                  R0
        STMFD   SP!,    {R1}                ; 
        									;	    		    ^
        LDMFA   R0!,    {R1-R3,  R12}		;      			   R0
        STMFD   SP!,    {R1-R12    }        ;	   ^
        LDMFA   R0!,    {R1-R2}		        ;	  R0
        STMFD   SP!,    {R2}        		;
        
        STMFD   SP!,    {R1,     LR}        ;
        
        
        ldr     r0,     =_tx_thread_current_ptr
        ldr     r0,     [r0]
        STR     sp,     [r0,    #8]
        
__irq_thread_swith_exit
        LDR     PC,     =__tx_thread_restore
        
        END
;/**************************************************************************/
;/*     end of file                                                        */ 
;/**************************************************************************/

⌨️ 快捷键说明

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