首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

跪问nios的中断问题,各位大虾救命啊

建议你从一下疑点着手:
   1、你的硬件配置是否能保证按钮和要中断的PIO引脚是同一个引脚?
   2、你的中断服务程序和主程序做的是一样的工作,不知你还要他有什么用?
主程序没有延时,中断程序用nr_delay(1000)引入延时1s。主程序与中断程序区别是这么想的:没有按下按钮时主程序运行,数码管由于视觉效应会一直亮,按下按钮后则通过延时造成眨灯的效果。而实际上看到的效果是数码管一直亮,不对我的按钮事件做出相应。
我反复检查过引脚,按钮和pio引脚是同一个。
现在我对中断服务程序这一提法都有疑惑了。
我想你可以考虑以下几点:
1、clr irq应该清status register,而不是edgecapture;
2、测试过程不应该凭视觉来判断是否产生中断,我想有更好的方法,如测试仪器或从串口输出信息;
3、系统中断是否已经开启,不能仅打开IO interrupt;起码在上面的代码中我没看到你打开系统中断!
4、关于硬件配置是否正确,还应检查下,特别是SOPC中的相关配置。
对待真正的朋友,就是给他最大的自由!
我看过nios提供的pdf文档,还有例程lcd_deml.c里面,系统中断只需通过
nr_installuserisr()
就可开启,io中断和系统中断的开启应该不是问题。我按照高手的意见在主程序中加入串口信息
nr_uart_txchar('l',na_uart_0)做为主程序运行的标志,用
nr_uart_txchar('k',na_uart_0)做为中断程序运行的标志,发现主程序运行而中断程序根本不会因我的按键而跳转。
现在就想问sopc中的硬件配置应该如何检查,难道需要进行哪里配置的改动吗,望能告知
我早上也做了个试验,发现程序是在中断服务程序void _nr_isr_handler(void)中死机的,而且是执行到irq_handler(irq_context, i, interruptee_pc);
目前我也没想到会是什么原因,但肯定是这个调用失败的!
对待真正的朋友,就是给他最大的自由!
经过一天的测试,你这样改下就应该可以的:
把源文件nios_isr_handler.c中定义的
static int irq_context[NIOS2_NIRQ];
static nios_isrhandlerproc2 irq_handler [NIOS2_NIRQ];
初始化下,改为
//static
int irq_context[NIOS2_NIRQ]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//static
nios_isrhandlerproc2 irq_handler [NIOS2_NIRQ]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
试试看吧,祝你好运!
对待真正的朋友,就是给他最大的自由!
在测试过程中,我在中断中监控数组irq_handler[],发现其值发生变化,故做此修改!    你试试看有没有别的办法,尽量不要修改SDK文件!    一起探讨!
对待真正的朋友,就是给他最大的自由!
多谢高手了
看来这个nios的中断不令人满意,开发nios的人没有搞好。
所以我决定改用查询的方式来做原本打算中断做的事情。
真是扫兴啊!!

跪问nios的中断问题,各位大虾救命啊

这几天想搞中断,用c语言,按照nios的pdf文件说的,从pio口引入中断,进行中断服务程序建立,源程序如下 #include "excalibur.h" void PIO_ISR(int context); int main(void) { int k,context=0; np_pio *pio = na_pio_0; nr_installuserisr(na_pio_0_irq,PIO_ISR, context); // install UART ISR pio->np_pioedgecapture = 0; // clear any existing IRQ condition pio->np_piointerruptmask = 0xf; // they all generate irq's! while(1) { for(k=0;k<10;k++) { na_pwm->np_piodata = k; } } return 0; } /************************************************************************/ void PIO_ISR(int context) { int i; np_pio *pio =(np_pio *)context; na_pio_0->np_pioedgecapture = 0;// clear the irq condition for(i=0;i<10;i++) { na_pwm->np_piodata = i; nr_delay(1000); } }// end of ISR 可以说已经原始的不能再原始的程序了,准备用按钮引入一个中断事件,让程序响应后跳转到PIO_ISR处去驱动与pio相连的数码管,但是下到板子后发现根本无法引入中断,不知各位高手能否赐教。
其实中断响应并不快,如果要及时处理的还是用查询好!
对待真正的朋友,就是给他最大的自由!
返回列表