Board logo

标题: 跪问nios的中断问题,各位大虾救命啊 [打印本页]

作者: liyicheng    时间: 2005-2-17 08:57

建议你从一下疑点着手:
   1、你的硬件配置是否能保证按钮和要中断的PIO引脚是同一个引脚?
   2、你的中断服务程序和主程序做的是一样的工作,不知你还要他有什么用?
作者: yancharles    时间: 2005-2-17 16:40

主程序没有延时,中断程序用nr_delay(1000)引入延时1s。主程序与中断程序区别是这么想的:没有按下按钮时主程序运行,数码管由于视觉效应会一直亮,按下按钮后则通过延时造成眨灯的效果。而实际上看到的效果是数码管一直亮,不对我的按钮事件做出相应。
我反复检查过引脚,按钮和pio引脚是同一个。
现在我对中断服务程序这一提法都有疑惑了。
作者: Simon.Embed    时间: 2005-2-18 10:34

我想你可以考虑以下几点:
1、clr irq应该清status register,而不是edgecapture;
2、测试过程不应该凭视觉来判断是否产生中断,我想有更好的方法,如测试仪器或从串口输出信息;
3、系统中断是否已经开启,不能仅打开IO interrupt;起码在上面的代码中我没看到你打开系统中断!
4、关于硬件配置是否正确,还应检查下,特别是SOPC中的相关配置。
作者: yancharles    时间: 2005-2-19 17:15

我看过nios提供的pdf文档,还有例程lcd_deml.c里面,系统中断只需通过
nr_installuserisr()
就可开启,io中断和系统中断的开启应该不是问题。我按照高手的意见在主程序中加入串口信息
nr_uart_txchar('l',na_uart_0)做为主程序运行的标志,用
nr_uart_txchar('k',na_uart_0)做为中断程序运行的标志,发现主程序运行而中断程序根本不会因我的按键而跳转。
现在就想问sopc中的硬件配置应该如何检查,难道需要进行哪里配置的改动吗,望能告知
作者: Simon.Embed    时间: 2005-2-21 11:55

我早上也做了个试验,发现程序是在中断服务程序void _nr_isr_handler(void)中死机的,而且是执行到irq_handler(irq_context, i, interruptee_pc);
目前我也没想到会是什么原因,但肯定是这个调用失败的!
作者: Simon.Embed    时间: 2005-2-21 15:04

经过一天的测试,你这样改下就应该可以的:
把源文件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};
试试看吧,祝你好运!
作者: Simon.Embed    时间: 2005-2-21 15:07

在测试过程中,我在中断中监控数组irq_handler[],发现其值发生变化,故做此修改!    你试试看有没有别的办法,尽量不要修改SDK文件!    一起探讨!
作者: yancharles    时间: 2005-2-24 17:02

多谢高手了
看来这个nios的中断不令人满意,开发nios的人没有搞好。
所以我决定改用查询的方式来做原本打算中断做的事情。
真是扫兴啊!!
作者: yancharles    时间: 2005-2-24 17:09     标题: 跪问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相连的数码管,但是下到板子后发现根本无法引入中断,不知各位高手能否赐教。
作者: Simon.Embed    时间: 2005-2-24 17:09

其实中断响应并不快,如果要及时处理的还是用查询好!




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0