arm cotex-a9 rt_hw_context_switch_interrupt函数的逻辑想咨询一下。
.globl rt_thread_switch_interrupt_flag
.globl rt_interrupt_from_thread
.globl rt_interrupt_to_thread
.globl rt_hw_context_switch_interrupt
rt_hw_context_switch_interrupt:
ldr r2, =rt_thread_switch_interrupt_flag
ldr r3, [r2]
cmp r3, #1
beq _reswitch
ldr ip, =rt_interrupt_from_thread
mov r3, #1
str r0, [ip]
str r3, [r2]
_reswitch:
ldr r2, =rt_interrupt_to_thread
str r1, [r2]
bx lr
在中断的ISR函数中如果调用rt_schedule函数的话,会走到此函数,
我所理解的流程:
进入中断(①)⇒调用rt_schedule(②)⇒rt_hw_context_switch_interrupt(③)
⇒中断返回(④)⇒[from→to]的任务切换。
关于【rt_thread_switch_interrupt_flag 】的赋值不太理解。
我的理解是在 ③部分将 rt_thread_switch_interrupt_flag 赋值为1,之后再④部分将判断 rt_thread_switch_interrupt_flag如果为1,则调度切换。
但是rt_hw_context_switch_interrupt(③)函数一开始就判断了rt_thread_switch_interrupt_flag是否为1,如果为1,则代码直接跳到 _reswitch 处(这里的判断逻辑的意图不太理解)。
rt_hw_context_switch_interrupt:
ldr r2, =rt_thread_switch_interrupt_flag
ldr r3, [r2]
cmp r3, #1 //I
beq _reswitch
想问下为什么刚开始要判断这个呢?,进入这个函数(③)之前,应该没有对rt_thread_switch_interrupt_flag这个变量赋值的处理吧?
更多回帖