- 论坛徽章:
- 0
|
也就是说流程为:
1,发生时钟中断
2,中断执行timer_tick: 更新时间片,发现时间片耗尽,设置TI ...
yifei429 发表于 2011-12-09 11:07 ![]()
preempt_schedule_irq在中断上下文调用的证据如下:- 1: bl preempt_schedule_irq @ irq en/disable is done inside
- ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS
- tst r0, #_TIF_NEED_RESCHED
- beq preempt_return @ go again
- b 1b
复制代码 这里会反复检查NEED_RESCHED标志,直到没有该标志为止,eq条件满足,跳到preempt_return执行,这里会恢复进中断之前的preempt_count,和被中断进程的寄存器与CPSR,只有CPSR被恢复,才能保证系统从中断上下文里退出到内核态。(因为你是执行内核态的__set_current_state(TASK_INTERRUPTIBLE)函数时进中断的)
因此preempt_schedule_irq是在还没有退出中断上下文的时候执行的。 |
|