下午好🌅🌅🌅
本答案参考ChatGPT-3.5
问题2: 为什么4级中断处理完成之后会经过用户程序之后再回到1中断处理程序处理呢?
原因是因为在5级中断处理过程中,1、2、3级中断请求被屏蔽了,因此在5级中断处理完成后需要重新判断是否有其他中断请求,这时候1级中断的请求被重新启用并进入中断队列,因此需要经过一段用户程序的执行后再回到1级中断处理程序处理。
解决方案如下:
- 中断请求队列按照优先级由高到低排列,因此先处理优先级高的中断请求,同时需要将该中断请求之下的所有中断屏蔽。
- 在5级中断处理完成后,需要重新启用可能存在的其他中断请求,并将它们加入到中断请求队列中,然后检查队列中是否有比当前正在处理的中断请求更高优先级的中断请求,如果有,则需要先处理更高优先级的中断请求。
- 因为中断请求可能在用户程序执行过程中被触发,因此在用户程序执行完毕后,需要重新判断是否存在中断请求,并按照优先级处理。
修改后的代码如下:
// 处理当前中断请求 void handle_interrupt() { // 获取当前中断请求的优先级 int priority = get_interrupt_priority();
// 将该优先级之下的所有中断屏蔽 mask_interrupts(priority);
// 处理当前中断请求 handle_current_interrupt();
// 重新启用可能存在的其他中断请求 unmask_interrupts(priority);
// 检查是否存在比当前正在处理的中断请求更高优先级的中断请求 int higher_priority = get_highest_priority(); if (higher_priority > priority) { // 处理更高优先级的中断请求 mask_interrupts(higher_priority); handle_interrupt(); } }
// 在用户程序执行完毕后,重新判断是否存在中断请求,并按照优先级处理 void handle_user_program() { // 检查是否存在中断请求 int priority = get_highest_priority(); if (priority > 0) { // 处理中断请求 mask_interrupts(priority); handle_interrupt(); } }