今天实验了一下NIOSII中中断的问题,在按照特权大大的讲解一直出现警告。于是打开 alt_irq.h,发现在NIOSII中新老版本对中断函数的支持不一样。
在早期版本中,alt_isr_register()函数来注册ISR,在新版本中通过alt_ic_isr_register()来注册,这就造成了新老版本的兼容问题,但是可以通过ALT_ENHANCED_INTERRUPT_API_PRESENT来判断是使用早期的或者新版本注册函数。下面的例子是通过DE2板子上的四个按键中断控制绿灯亮灭,没有具体哪个按键。
#include <stdio.h>
#include <system.h>
#include<unistd.h>
#include "SOPC.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"
int key_flag = 0;
volatile int edge_capture;
void ISR_key(void * context,unsigned long id)
{
key_flag = ~key_flag;
// 清边沿捕获寄存器
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0xf);
}
volatile int edge_capture;
// 初始化button_pio
static void init_button_pio()
{
// 改写edge_capture指针以匹配alt_irq_register()函数原型
void* edge_capture_ptr = (void*) &edge_capture;
// 使能所有4个按钮中断
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);
// 清边沿捕获寄存器
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);
// 注册ISR
// Nios II 9.1
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
alt_ic_isr_register(BUTTON_PIO_IRQ_INTERRUPT_CONTROLLER_ID,
BUTTON_PIO_IRQ,
ISR_key,
edge_capture_ptr, 0x0);
// Nios II 9.1之前版本
#else
alt_irq_register(BUTTON_PIO_IRQ,
edge_capture_ptr,
handle_button_interrupts);
#endif
}
int main()
{
//void* edge_capture_ptr = (void*) &edge_capture;
// IOWR_ALTERA_AVALON_PIO_DATA(LEDGREEN,0x00);
// IOWR_ALTERA_AVALON_PIO_DATA(LEDRED,0x0000);
init_button_pio();
while(1)
if(key_flag){
IOWR_ALTERA_AVALON_PIO_DATA(LEDGREEN,0x00);
}
else{
IOWR_ALTERA_AVALON_PIO_DATA(LEDGREEN,0xff);
}
return 0;
}