嵌入式技术论坛
直播中

青sky

8年用户 1257经验值
擅长:模拟技术
私信 关注
[问答]

有对rt_thread_switch_interrupt_flag这个变量赋值的处理吗?

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这个变量赋值的处理吧?

回帖(2)

青sky

2023-3-10 11:26:27
下面是自己的理解,不知道对不对,先记录下来:

进入中断(①)⇒调用rt_schedule(②)⇒rt_hw_context_switch_interrupt(③)
⇒中断返回(④)⇒[from→to]的任务切换(⑤)。
③结束后,会走中断返回④和任务切换(⑤)

vector_irq:
    stmfd   sp!, {r0-r12,lr}
    bl      rt_interrupt_enter
    bl      rt_hw_trap_irq
    bl      rt_interrupt_leave
    ldr     r0, =rt_thread_switch_interrupt_flag
    ldr     r1, [r0]
    cmp     r1, #1
    beq     rt_hw_context_switch_interrupt_do
    ldmfd   sp!, {r0-r12,lr}
    subs    pc,  lr, #4
rt_hw_context_switch_interrupt_do:
在中断返回后

    bl      rt_interrupt_leave //此时中断会再度打开
就开始执行⑤(任务切换)

    ldr     r0, =rt_thread_switch_interrupt_flag
    ldr     r1, [r0]
    cmp     r1, #1
    beq     rt_hw_context_switch_interrupt_do
    ldmfd   sp!, {r0-r12,lr}
    subs    pc,  lr, #4
rt_hw_context_switch_interrupt_do:
...
...
再此过程中,由于中断再度打开,在向[to]任务切换的过程中,有可能被同一个中断再度打断。
换句话说:

进入中断(①)⇒调用rt_schedule(②)⇒rt_hw_context_switch_interrupt(③)
⇒中断返回(④)⇒[from→to]的任务切换(⑤)。
在⑤时被中断打断,再次执行同一个ISR并且调用rt_schedule时,进入rt_hw_context_switch_interrupt函数后,rt_interrupt_from_thread变量就不需要在重新被赋值了(因为还是在同一个线程中)
举报

向日葵的花季

2023-3-10 11:26:37
一直对rt_thread_switch_interrupt_flag不理解,它的意思是中断中发生任务切换,rt_thread_switch_interrupt_flag等于1,那不是中断中发生切换,就应该等于0啊,但是看流程图rt_thread_switch_interrupt_flag等于0的时候,都跳过了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分