Nios II 中断简述及中断调试技巧
Nios II 中断处理方式带有典型的 RISC 处理器的特征,所有的中断处理都从同一入口进入,然后由软件加以分配。负责分配工作的软件叫系统 ISR,它是由开发系统提供的,自动的连接到可执行程序上。
Nios II 中断处理过程:
1. 拷贝一份程序状态字到 CTL1;
2. 清除全局中断允许位 PIE,禁止中断;
3. 将下一条将执行的指令的地址存入 R29,以便中断返回之用;
4. 跳转到中断入口地址,进入系统 ISR;
5. 系统 ISR 保护现场;
6. 系统 ISR 检测 CTL1 的 PIE 位,如为 0 则进入软中断处理程序,从 11 继续,否则由 7 继续;
7. 系统 ISR 检测 CTL4,如果有中断申请,则转到硬中断处理和序,否则进入软中断处理程序;
8. 硬中断处理程序将检测中断申请号,并检索中断向量表,跳转到用户中断处理程序;
9. 用户中断处理程序做出具体的处理,最后返回系统 ISR;
10. 系统 ISR 恢复现场,并返回;
11. 软中断处理程序进行陷井指令、模拟指令判断,并做相应处理,然后返回系统 ISR;
12. 系统 ISR 恢复现场并返回。
中断相关寄存器:
* CTL0:程序状态字,它的 bit0 位是全局中断允许位,1 代表允许,0 代表禁止。
* CTL1:程序状字的堆栈,当发生中断时,由它保留一个程序状态字的备份。
* CTL3:中断允许寄存器,其中每一位控制着一个中断源,1 代表允许,0 代表禁止,共计 32 位。
* CTL4:中断申请寄存器,每一位对应着一个中断源的中断请求,1 代表有中断,0 代表没有,共计 32 位。
中断调试技巧:
* 使用 status、ienable、ipending 三个寄存器控制中断,status 寄存器的最低位为 PIE,表示中断使能位,PIE 位为 0 时,禁止外部中断;PIE 位为 1 时,允许外部中断,但中断是否有效还取决与 ienable 寄存器的值。
* ienable 寄存器为 32 位,它的每一个位对应一个外部中断源的使能位。若第 n 位为 1,表示相应输入信号 irqn 可以发起中断请求,若为 0,则表示外部中断被禁止。
* ipending 寄存器表示处理器正在处理的中断,若第 n 位为 1,则表示相应输入的 irqn 有效。
与用户编程相关 API 函数:
* alt_irq_register():向系统 ISR 注册用户 ISR 的 API 函数。
* alt_irq_disable():禁止某个中断服务。
* alt_irq_enable():开启某个中断服务。
* alt_irq_disable_all():关闭全局中断。
* alt_irq_enable_all():开启全局中断。
用户定义的用户 ISR 程序要符合统一的原形定义,即:void isr(void *context, alt_u32 id) 函数名没特别的要求,与一般函数一样。入口参数与返回值要严格按标准形式定义,否则系统 ISR 将不能正确的对其调用。