运行在中断中的代码不能进行睡眠,或者阻塞!因为代码是运行在中断上下文中,并非进程上下文中,如果将中断进行睡眠的话,调度器无从得知下一个应该调度的进程,系统无法继续进行!
关于调度器在中断过程中无法调度其他进程的问题,是由于系统设计的原因!当然你也可以将你的系统设计成在中断过程中,可以进行睡眠或阻塞!但这样会增加你系统设计的复杂程度!因为在设计过程中,你需要考虑好多,复杂的情况!所以,如果你将系统设计成可在中断中睡眠的话,除了给你的设计增加难度外,应该没有其他任何的帮助!所以说从系统设计的角度来讲,声明在中断中无法进行睡眠是有必要的!
如果你在中断中睡眠的话,你将不得不考虑到许多复杂的情况,以下场景是你经常会遇到的!
死锁问题:
1) 进程1进入kernel code
2) 进程1获得Lock A
3) 中断发生
4) ISR 执行,但ISR借用进程1的stack
5) ISR 试图获得Lock A
6) ISR 由于无法获得 Lock A, 而进入睡眠!
此时,就会造成系统死锁,而导致进程1 和ISR无法运行!因为进程1 在等待ISR释放stack而阻塞,而ISR在等待进程1释放Lock A而阻塞,但进程1由于被阻塞,所以无法释放Lock A而导致两者死锁!