原创 MicroBlaze里面的中断管理

2010-8-18 16:56 4035 12 13 分类: FPGA/CPLD

MicroBlaze里面的中断主要有两类:一类是外部中断,另一类是内部中断。

1. 外部中断:

如果只有一个元件产生中断(比如只有一个定时器产生中断)或者只有一个外部中断管脚连接MB(这儿说的外部是相对于CPU说的,可以是FPGA内部的其他模块产生的中断,也可以是FPGA外部的输入中断),那么Intc可以不使用。

这种情况,在EDK里面实现是最简单的。

下面摘录MHS文件:

PORT fifo_full_pin = fifo_full, DIR = I, SIGIS = INTERRUPT, SENSITIVITY = LEVEL_HIGH

BEGIN microblaze

 PARAMETER INSTANCE = microblaze_0

 PARAMETER HW_VER = 4.00.a

 BUS_INTERFACE DLMB = dlmb

 BUS_INTERFACE ILMB = ilmb

 BUS_INTERFACE DOPB = mb_opb

 BUS_INTERFACE IOPB = mb_opb

 PORT CLK = sys_clk_s

 PORT Interrupt = fifo_full

END

PORT后面的几个参数(SIGIS等)参见psf_rm.pdf。从实际操作看,这些不加也可以。建议加上。特别是SENSITIVITY,可以设置中断是上升沿、下降沿、高电平、低电平中断。

Note:By the way, interrupts connected to the microblaze directly needs to be level sensitive, in case of using an edge triggered interrupt you'll need an interrupt controller.

注册中断函数可以在C文件里面调用注册函数,更为简单的办法是在MSS文件里面直接说明。

注:如果既有外部中断,又有内部中断,那么还是要用中断控制器,在mhs文件中加上PORT fifo_full_pin = fifo_full, DIR = I, SIGIS = INTERRUPT, SENSITIVITY = LEVEL_HIGH,之后, fifo_full_pin会自动连接到中断控制器的输入端Intr,点击加入就好了。加好之后的mhs文件如下所示:

BEGIN opb_intc

parameter INSTANCE = myintc 

parameter HW_VER = 1.00.b

parameter C_BASEADDR = 0xFFFF1000 

parameter C_HIGHADDR = 0xFFFF10ff

bus_interface SOPB = opb_bus

port Irq = interrupt

port Intr = uart_int & ext_int & gpio_int & fifo_full

MSS文件摘录:

 

PARAMETER VERSION = 2.2.0

PARAMETER int_handler = gpio_int_handler, int_port = fifo_full_pin

BEGIN OS

 PARAMETER OS_NAME = standalone 

 PARAMETER OS_VER = 1.00.a

 PARAMETER PROC_INSTANCE = microblaze_0

END

特意把OS也摘出来是为了说PARAMETER int_handler = gpio_int_handler, int_port = fifo_full_pin这个是全局设定,不要放在Begin … End里面。此外,需要注意这个int_port,与它连接的应该是Port,而不是Interrupt Signal (注意:这里说的是外部中断,如果是内部中断,比如定时器中断,那么PARAMETER int_handler = gpio_int_handler, int_port = fifo_full_pin得放入Timer的Begin End里面,int_port指Timer的Interrupt Port,参见psf_rm.pdf )。gpio_int_handler,中断服务程序,需要在c中定义。

注:现在新出的EDK版本,XPS9.2,已经将这种在mss文件中添加句柄(handler)的作用去掉了,句柄(handler)最好在软件中添加。

 2.内部中断

内部中断需要使用中断控制器。

如果在EDK的生成CPU向导中,选GPIO时选择了中断,那么中断控制器(以下称 Intc )会自动被加上。

 

这个中断控制器的使用是非常简单的。

 

很多中断都连接到Intc的Intr端口,然后从它的Irq端口连接MB的Interrupt。

 

MHS文件描述如下:

 

BEGIN opb_intc

 

parameter INSTANCE = myintc

 

parameter HW_VER = 1.00.b

 

parameter C_BASEADDR = 0xFFFF1000

 

parameter C_HIGHADDR = 0xFFFF10ff

 

bus_interface SOPB = opb_bus

 

port Irq = interrupt

 

port Intr = uart_int & ext_int & gpio_int

 

END

 

begin microblaze

 

parameter INSTANCE = mblaze

 

parameter HW_VER = 1.00.c

 

bus_interface DOPB = opb_bus

 

bus_interface DLMB = d_lmb

 

bus_interface ILMB = i_lmb

 

port INTERRUPT = interrupt

 

end

 

需要说明一下的是中断优先级的设定。大家看这句:

 

port Intr = uart_int & ext_int & gpio_int

 

在这种情况下,EDK会自动设定OPB_INTC的C_NUM_INTR_INPUTS参数为3,因为有三个中断。其中gpio_int的优先级是最高的,因为它连接到intr[0]上。中断优先级右边最高,左边最低,即uart_int最低。因此,大家可以根据实际需要来设定。

 

在MHS设定完毕后,生成的Lib里面的xparameters.h会定义一些比较重要的宏,包括了所有中断信号的一些属性。它们的命名符合一定的格式。

 

大家可以在头文件里面看到:

 

XPAR_< font="" />的实例名> _<产生中断的元件的实例名>_<中断信号名>_MASK

 

XPAR_<产生中断的元件的实例名>_<中断信号名> _INTR

 

比如说我们上面这段MHS, gpio_int中断的相关宏定义(跟具体设置有关,可能名字有出入):

 

#define XPAR_DIP_SWITCHES_IP2INTC_IRPT_MASK 0X000001

 

#define XPAR_OPB_INTC_0_DIP_SWITCHES_IP2INTC_IRPT_INTR 0

 

INTR中的0拥有最高中断优先级。

 

我们在写OPB_Intc的c程序时,代码是基本相同的,大家只要copy一下,做一些参数的修改即可。

 

代码片断如下:

 

/* 允许MB中断*/

 

    microblaze_enable_interrupts();

 

   /*注册中断子程序,就是告诉MB,发生中断之后,执行哪个中断服务程序 */

 

   XIntc_RegisterHandler(XPAR_OPB_INTC_0_BASEADDR, \   /* Intc的基址 */

 

         XPAR_OPB_INTC_0_DIP_SWITCHES_IP2INTC_IRPT_INTR, \

 

/*这个参数就是上面提到的XPAR_<产生中断的元件的实例名>_<中断信号名> _INTR */

 

           (XInterruptHandler)gpio_int_handler, \  /* 中断服务程序名,因此我们在c文件里还应该写一个void gpio_int_handler(void *bassaddr_p) ,用于处理中断 */

 

              (void *)XPAR_DIP_SWITCHES_BASEADDR);

 

  /* 这个是产生中断的元件基址,如果是外部中断,就用 NULL */

  

 /* start the interrupt controller */

 

    XIntc_mMasterEnable(XPAR_OPB_INTC_0_BASEADDR);

  

    /* enable the gpio interrupt*/

 

    XIntc_mEnableIntr(XPAR_OPB_INTC_0_BASEADDR, XPAR_DIP_SWITCHES_IP2INTC_IRPT_MASK); /*这个就是上面提到的XPAR_< span="" />的实例名> _<产生中断的元件的实例名>_<中断信号名>_MASK */

 

 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户857555 2012-10-16 11:03

mark
相关推荐阅读
用户372435 2010-09-06 16:30
基于CGI的嵌入式web server设计
一、CGI概述  CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程 序)的接口协议标准。Web服务器通过调用CGI程序实现和Web浏览器的 交互,也就是CGI程序接受Web浏览器发...
用户372435 2010-08-29 17:38
arm启动详解
关于ARM启动的一篇文章,本人感觉不错,大家共勉posted on 2004年4月9日 20:09 由 devzhao  下面是我抄来的一篇文章, 写的不错, 应该对大家有所帮助:基于ARM的芯片多数...
用户372435 2010-08-25 20:55
ATPCS概述
为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则.ATPCS就是ARM程序和THUMB程序中子程序调用的基本规则...一.ATPCS概述...     ATP...
用户372435 2010-08-24 21:31
]FFT结果的物理意义
    FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FF...
用户372435 2010-08-24 11:31
一个不错的fft的实现
  #include <iom128.h>#include <intrinsics.h> /******************************************...
用户372435 2010-08-23 21:19
用FPGA实现FFT算法
DFT(Discrete Fourier Transformation)是数字信号分析与处理如图形、语音及图像等领域的重要变换工具,直接计算DFT的计算量与变换区间长度N的平方成正比。当N较大时,因计...
EE直播间
更多
我要评论
1
12
关闭 站长推荐上一条 /3 下一条