Nios II中断简述及中断调试技巧

标签:
杂谈 |
一、Nios II中断简述
-
拷贝一份程序状态字到ctl1; -
清除全局中断允许位PIE,禁止中断; -
将下一条将执行的指令的地址存入R29,以便中断返回之用; -
跳转到中断入口地址,进入系统ISR; -
系统ISR保护现场; -
系统ISR检测ctl1的PIE位,如为0则进入软中断处理程序从11继续,否则由7继续; -
系统ISR检测Ctl4,如果有中断申请,则转到硬中断处理和序,否则进入软中断处理程序; -
硬中断处理程序将检测中断申请号,并检索中断向量表,跳转到用户中断处理程序; -
用户中断处理程序做出具体的处理,最后返回系统ISR; -
系统ISR恢复现场,并返回; -
软中断处理程序进行陷井指令、模拟指令判断,并做相应处理,然后返回系统ISR; -
系统ISR恢复现场并返回;
软中断处理程序是用来处理由软件发起的中断事件的,包括调试指令引起的中断及未定义指令引起的中断。目前未定义指令的处理主要为乘、除法运算指令的处理,不支持用自定义的操作码,除用户自己修改系统程序。如果软中断处理程序遇到了一个不识别的操作码,将返回一个不确定的结果。
与用户编程相关API函数有:
1、 alt_irq_register();
alt_irq_register()是向系统ISR注册用户ISR的API函数。其原形为:
如果注册成功,函数返回0,并允许全局中断及被服务中断;不成功返回非0值。
2、 alt_irq_disable();
Alt_irq_disable()用来禁止某个中断服务。原形为:
3、 alt_irq_enble();
alt_irq_enable()与alt_irq_disable()对应,用来开启某个中断服务。原形为:
4、 alt_irq_disable_all();
alt_irq_disable_all()用于关闭全局中断,原形为:
5、 alt_irq_enable_all();
Alt_irq_enable_all()用于开启全局中断,原形为:
用户定义的用户ISR程序要符合统一的原形定义,即:
函数名没特别的要求,与一般函数一样。入口参数与返回值要严格按标准形式定义,否则系统ISR将不能正确的对其调用。
二、中断调试技巧
http://www.61eda.com/Services/UploadFiles_3695/200802/20080204104254325.JPGII中断简述及中断调试技巧" />
DMA中断优先级设的是2,把alt_irq[2]再展开
http://www.61eda.com/Services/UploadFiles_3695/200802/20080204104254360.JPGII中断简述及中断调试技巧" />
这个信息很重要,http://www.61eda.com/Services/UploadFiles_3695/200802/20080204104254893.JPGII中断简述及中断调试技巧" />
alt_irq就是中断向量表,有32个元素,每个对应一个中断优先级,中断注册成功的话,就会往中断向量表写入ISR和context,<>里的是中断函数,就像下面这个
http://www.61eda.com/Services/UploadFiles_3695/200802/20080204104254178.JPGII中断简述及中断调试技巧" />
这样就代表jtag
uart中断注册成功了。alt_irq_registers注册完后返回0说明注册成功,返回负数失败。把status,ienable,ipending和alt_irq弄清楚,再结合调试技巧,什么中断都可以解决了。