下午 做了 Nios PIO的中断实验,在软件部分,build project 后出“implicit declaration of function 'alt_irq_register” 的警告,
阅读文档后发现,较高版本的 Nios II 软件中 需要使用 增强版 中断 API注册 ISR,即是:以前 使用 alt_irq_register 来注册中断
服务函数,增强版使用 alt_ic_isr_register 来注册中断服务函数。
其用法如下:
(1) alt_ic_isr_register 用法alt_ic_isr_register(
alt_u32 ic_id,
alt_u32 irq,
alt_isr_fun isr,
void * isr_context,
void * flags
)
- ic_id为中断控制器标号,定义于system.h之中。在使用菊花链的EIC中,ic_id使用菊花链标识EIC;在IIC中,ic_id则不重要。
- irq为设备的硬件中断号,定义于system.h之中。
- 对于IIC来讲,irq就是IRQ号。中断的优先级与IRQ的编号成相反顺序。故IRQ_0代表最高优先级的中断,IRQ_31则是最低优先级的。
- 对于EIC来讲,irq就是中断端口的ID。
- isr_context指向与设备驱动实例相关的数据结构体。isr_context传递输入参数给中断服务程序的函数。用于传递特定上下文的信息给ISR,也可指向任何特定ISR的信息。该上下文的值对于HAL是不透明的;it is provided entirely for the benefit of the user-defined ISR。
- isr指向相应的IRQ号的irq调用的ISR函数的指针。ISR函数原型如下:
void handle_button_interrupts(void *isr_context); 给该函数提供的输入参数就是isr_context。 注: 给isr注册空指针,将会导致中断失去使能;handle_button_interrupts为isr服务函数名称,不固定。
(2)使能或者去使能中断增强版的中断API提供如下函数:alt_ic_irq_disable(),alt_ic_irq_enable(),alt_ic_irq_enabled(),alt_irq_disable_all(),alt_irq_enable_all()。 - alt_irq_enable()允许编程以使某些部分的代码禁用硬件中断,或此后重新使能它们。
- alt_ic_irq_disable()和alt_ic_irq_enable()允许使能或去使能单独的中断。
- alt_irq_disable_all()去使能所有中断,并返回一上下文值。
- 欲重新使能硬件中断,可调用alt_irq_enable_all(),并传递上下文参数。中断在返回状态的优先级之前调用alt_irq_disable_all()。
- 若可屏蔽的异常被使能,则alt_irq_enabled()返回非零值。
- alt_ic_irq_enabled()则决定那个被指定的中断被使能。
(3)升级至增强版的HAL中断表2 升级HAL中断的API
(4)支持多种HAL中断的API在软件编译工具中选择中断API,使用system.h中的如下符号来定义其中之一,来标识哪种中断API可用: - ALT_ENHANCED_INTERRUPT_PRESENT——定义使用增强版的API实现
- ALT_LEGACY_INERRUPT_API_PRESENT——定义使用先前的API实现
在用户的驱动代码中,使用这些符号来决定哪种API被调用。 使用 增强版的 API的示例,可以参看:(我也是参看这篇文章的博主(小時不識月 Stupid & Hungry)的介绍,在此表示感谢) http://www.cnblogs.com/yuphone/archive/2010/11/25/1887621.html
|