报名编号:CICC1699
称团队名:到底叫啥队
所选杯赛:芯来RISC-V杯
开发板:MCU200T
中断机制即处理器核在执行程序指令流的过程中突然被别的请求打断而中止执行当前程序,转而处理别的事情,处理完重新回到之前程序终端的位置继续执行。处理器收到中断请求,保存当前程序的现场,处理完中断服务程序后,恢复之前的现场,继续执行被打断的程序。打断处理器执行程序指令流的别的请求称为中断请求,别的请求称为中断源,通常来自外围硬件设备,处理器转而处理别的事情称为中断服务程序(ISR)
中断仲裁:多个中断源同时向处理器发出请求,仲裁选择优先处理哪个中断源
中断嵌套:已经在处理某个中断,执行ISR,有一个优先级更高的中断请求到来,处理器终止当前的ISR,响应新的中断,如此形成中断嵌套,可以有很多层(蜂鸟处理器该情况下不响应新的中端,继续执行正在处理的ISR,彻底完成后才响应新的中断请求)
注意:假设新来的中断请求的优先级比正在处理的中断优先级低或者相同,则无论是否能支持中断嵌套,都不应该响应这个新的中断请求
要实现中断嵌套,需要在中断控制器中增加一个新的模块,用于存储当前被占用的IRQ编号,同时需要在处理每个IRQ时检查当前正在处理的IRQ是否比新的IRQ优先级更高,如果是,则不触发新的IRQ,否则触发新的IRQ。
首先存储当前被占用的IRQ编号,再检查当前正在处理的IRQ是否比新的IRQ优先级更高
如果是,则不触发新的IRQ,否则触发新的IRQ
更新当前正在处理的IRQ编号,再触发新的IRQ
为了满足中断嵌套,我们需要对每个中断的优先级进行缓存,以便在中断处理期间可以暂停当前中断并处理更高优先级的中断。同时,我们还需要添加一个寄存器来存储当前正在处理的中断的ID。将id和ip之间的拆分保留在原来的状态下。因此,只有当中断发生并且当前没有已经活动的中断时,才会在irq_id_active_r中缓存当前的中断ID。最后,在任何处理完中断后,添加一个complete信号,表明当前中断已经处理完毕,并且可以恢复之前的中断优先级和嵌套状态: