📄 threadx_cpus.s
字号:
;/* 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 + -