注意:【1】在ISR中通过软件代码将对应的中断标志位清零,否则会导致重复中断。 

【2】进入中断服务子程序后,将关闭总中断,退出中断服务程序前,使能总中断。

1.疑问:在程序里,需要使能全局中断和使能局部中断使能么?

答:不需要手动使能全局中断和局部中断,因为在中毒注册里已经使能相应的中断使能,并且在alt_main()调用alt_irq_init()函数使能总中断使能。

1.  NIOS2处理器是异常处理是基于经典的RISC架构的,所有的异常对应同一个异常入口地址,我们称之为异常地址。

2.  NIOS2处理器支持32个优先级的硬件中断。

3.  alt_irq_register注册函数在:工程名_bsp/HAL/src/alt_irq_register.c中

注意:注册成功后,将使能相应中断控制位

int alt_irq_register (alt_u32 id, 
                      void* context, 
                      alt_isr_func handler)
{
  int  
  alt_irq_context status;
 
  if (id < ALT_NIRQ)
  {
    /* 
     * interrupts are disabled while the handler tables are updated to ensure
     * that an interrupt doesn't occur while the tables are in an inconsistant
     * state.
     */
 
    status = alt_irq_disable_all ();
 
    alt_irq[id].handler = handler;
    alt_irq[id].context = context;
 
    rc = (handler) ? alt_irq_enable (id): alt_irq_disable (id);
 
    alt_irq_enable_all(status);
  }
  return rc; 
}
#endif /* NIOS

 

 

4.  中断服务子程序ISR是专门为硬件中断服务的子程序。ISR由程序员自行定义,而不是HAL系统提供的,它与普通函数的定义没有什么区别,只是对ISR的函数原型有特定的要求:Void ISR_handler(void* context,alt_u32 id);

ISR没有返回值,有两个输入参数:

Context:可能是要传递给ISR的形参,可能是NULL;

Id:中断优先级

5. ISR函数限制

ISR的定义除了应当满足ISR函数原型的要求之外,还有下列诸多的限制,这些限制的根源在于:ISR本身运行于中断背景,因此不能在ISR中调用可能因为等待中断而被挂起的函数。

【1】   大量的HAL API不能在ISR中调用

【2】不能在ISR中调用C标准库的IO函数,因为这些函数将导致系统死锁。需要特别强调的是,不要在ISR中调用printf()函数,除非系统库属性中的stdout映射到工作于非中断模式的设备驱动上或者系统库使能了中断嵌套功能,否则printf()函数可能由于等待永远不可能发生的中断(因为ISR工作于中断背景下,此时的总中断是关闭的,所以在ISR中不可能相应任何中断),而导致系统死锁。可以通过系统库项目添加预处理器ALTERA_AVALON_JTAG_UART_SMALL迫使JTAG_UART工作于查询模式,从而允许在ISR中调用printf()函数。但是通常不建议这么做,因为printf()函数的执行要消耗很多时间,这样会严重影响系统的中断相应性能。

【3】只有通过中断注册的函数才称为ISR

通过alt_irq_register()函数可以实现中断注册,其函数原型如下所示:

Int alt_irq_register(alt_u32 id,

                  Void* context,

                  Void(*handler)(void*,alt_u32));

Id:中断优先级,即表明所注册的ISR是为哪个中断优先级的中断服务的,中断优先级在SOPC BUILDER中分配。

Context:为所注册的ISR传递参数,可以是NULL

Handler:中断服务函数ISR的指针

返回值:返回值是0时,表示中断注册成功,为负数时,表明中断注册失败。

注意:如果第三个参数不是NULL,则该优先级中断在注册成功后自动使能。

【4】   ISR相关API(HAL/inc/priv/alt_legacy_irq.h中)

Alt_irq_disable():禁止指定优先级id的中断,id是函数的输入参数。

Alt_irq_enable():打开指定优先级id的中断,id是函数的输入参数。

Alt_irq_disable_all():关闭总中断

Alt_irq_enable_all():关闭总中断

Alt_irq_enabled():判断总中断控制为的状态

 Alt_irq_interrputible()和alt_irq_non_interruptible()用于现实函数嵌套。