nios ii中断机制

上传人:第*** 文档编号:32821248 上传时间:2018-02-12 格式:DOCX 页数:10 大小:372.98KB
返回 下载 相关 举报
nios ii中断机制_第1页
第1页 / 共10页
nios ii中断机制_第2页
第2页 / 共10页
nios ii中断机制_第3页
第3页 / 共10页
nios ii中断机制_第4页
第4页 / 共10页
nios ii中断机制_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《nios ii中断机制》由会员分享,可在线阅读,更多相关《nios ii中断机制(10页珍藏版)》请在金锄头文库上搜索。

1、目标:1 需要解析NiosII中断功能的基本特性,中断响应的方式,中断向量(Interrupt Vector)的分配方式。2 如果,我们自行设计一个IP,需要 NiosII能够响应这个IP 所产生的中断请求,那么在IP的rtl设计中有哪些要求,同时NiosII的程序中该如何实现?要求1 必须实现一个样例工程,在SOPC 中集成一个专门用以提中断并让NiosII执行一个响应程序的小IP (该IP的基本结构图所示) ,并完成图右伪码所描述的过程。实现相应的程序,并能够在FPGA上跑通。A v a l o n S l a v e I n t e r f a c eI R Q _ 2 _ n i o

2、sA d d r W / RW d a t a R d a t aC o u n t e rI n t e r r u p t S t a t eR e g i s t e rI n t e r r u p t C l e a rR e g i s t e r/ / I P 进行中断请求I f ( c o u n t e r = = 某 个 时 间 点 )i n t e r r u p t s t a t e = 1 ;/ / N i o s 对中断进行清除I f ( i n t e r r u p t C l e a r = = 1 ) c o u n t e r = 0 ; / / 重新计

3、数i n t e r r u p t s t a t e = 0 ; / / 清中断2 最终必须提交一份文档,详细描述NiosII中断相关功能和工程实现方法,一定要言简意赅,并且尽量做到面面俱到。3 最迟8月1日前完成,越早越好。其他1 SOPC的相关使用方法,以及如何在 SOPC中加入一个自己设计的 IP,请去908室让一位师兄给你们集体培训一下,一个下午足矣。2 NiosII的相关文档请至 altera的网站上寻找,网址如下:http:/ 一些相关的东西,908的郑勇师兄以前了解过,可咨询他。4 FPGA板,用908 里的180,用的时候从 908拿,用完还回去。Nios II 中断处理机

4、制之硬件实现首先介绍下 Nios II CPU 处理中断的 3 个控制寄存器(1).status control Register:它的 bit0 位(PIE)是全局中断允许位,置 1 表示使能;(2).ienable control Register:是中断允许寄存器,其中每一位控制着一个中断源,1 代表允许,0 代表禁止,共 32 位;(3).ipending control Register:每一位对应着一个中断源的中断请求, 1 代表有中断,0 代表没有共 32 位。下图显示了硬件中断的产生一、 中断的产生1 .timer 中断Nios II 自带的 timer 模块,counter

5、从高位计数减到 0,在中断使能的情况下,产生中断请求信号。图 1 timer 寄存器在 SOPC Builder 中例化 32 位 Timer,技术周期 500ms.2.PIO 中断Nios II 自带的 PIO 模块,定义一位 input only port PIO 命名为 KEY。输入为高电平时,在中断使能的情况下,产生中断请求信号。assign irq = (data_in 二、NiosII 的中断处理过程1. 把 status 寄存器内容复制到 estatus 寄存器中,保存当前处理器状态 ; 2. 清除 status 寄存器全局中断允许位 PIE,禁止中断; 3. 将下一条将执行的指

6、令的地址存入 R29,以便中断返回之用; 4. 跳转到中断入口地址,进入系统 ISR; 5. 系统 ISR 保护现场; 6. 系统 ISR 检测 estatus 寄存器的 PIE 位,如为 0 则进入软中断处理程序从11 继续,否则由 7 继续; 7. 系统 ISR 检测 ipending control Register,如果有中断申请,则转到硬中断处理和序,否则进入软中断处理程序; 8. 硬中断处理程序将检测中断申请号,并检索中断向量表,跳转到用户中断处理程序; 9. 用户中断处理程序做出具体的处理,最后返回系统 ISR; 10. 系统 ISR 恢复现场,并返回; 11. 软中断处理程序进

7、行陷井指令、模拟指令判断,并做相应处理,然后返回系统 ISR; 12. 系统 ISR 恢复现场并返回; 注释:中断向量表存储在 Exception memory 下,而中断服务程序存储在 program memory 下。Nios II 中断处理机制之软件部分Nios II 中所有的中断处理都从同一入口进入,然后由软件加以分配。负责分配工作的软件叫系统 ISR,它是由开发系统提供的,自动的连接到可执行程序上。系统 ISR 维护着一个中断向量表,表中的每一项代表着一个专项处理程序的入口。处理程序由用户定义然后注册到中断向量表中的,叫做用户 ISR。系统 ISR 的入口地址是在 SOPC_Buil

8、der 中定义的(Exception Address,可在 sopc builder 中 cpu 配置中修改)。ISR(Interrupt Service Routine)中断服务凼数是为硬件中断服务的子程序。NIOS II 处理器支持 32 个硬件中断,每一个使能了的硬件中断都应该有一个 ISR 与之对应。中断产生时,硬件中断处理器会根据检测到的有效中断级别,调用相应的 ISR 为其进行中断服务。 第一、 注册中断凼数 ISR它的凼数原型如下所示:Int alt_irq_register(alt_u32 id, void* context, void(*handler) (void*,alt

9、_u32); id:中断优先级,即所注册的 ISR 是为哪个中断优先级的中断服务的。中断优先级在 SOPC Builder 中分配的。Context:为所注册癿的 ISR 传递参数,可以是 NULL; Handler,中断服务凼数 ISR 的指针,指向用户 ISR 入口。如果注册成功,函数返回 0,并允许全局中断及被服务中断;不成功返回非 0 值。第二、 编写 ISR 凼数,这个凼数有我们自己来写,而不是 HAL 系统提供的。对 ISR 的凼数原型有特定的要求:void ISR_handler( void* context, alt_u32 id ); context: 传给 ISR 癿形参,

10、可以是 NULL; id: 中断优先级。Nios II 中断处理过程从软件编程上分为 3 个步骤:1.中断的注册;2.中断处理程序;3.中断的执行与清除。下面从实验的 C 程序从软件编程上简要说明 Nios II 中断处理过程。实验一:timer 中断功能:实现开发板上 timer 每隔 500ms 计数到零向 cpu 发中断,执行中断服务程序触发 LED 灯闪烁一次。#include key.h /包含PIO 口结构体指针的头文件,方便对IO口各寄存器赋值#include #include io.h #include system.h /系统配置文件,可以看到各模块以及中断优先级等信息#in

11、clude altera_avalon_pio_regs.h /pio模块寄存器偏移量#include altera_avalon_timer_regs.h /timer模块寄存器偏移量#include alt_types.h#include sys/alt_irq.h /包含中断注册函数等,使用中断功能必须包含此文件 /定时器初始化,包含中断的注册,这样timer发出的中断才能够被系统接收/void init_timer(void)/状态寄存器初始化IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0x00);/控制寄存器初始化IOWR_ALTERA

12、_AVALON_TIMER_CONTROL(TIMER_0_BASE, 0x07);/中断的注册,此函数也可以放在main中/alt_irq_register(中断优先级,中断模块基址指针,中断处理程序名 )alt_irq_register(TIMER_0_IRQ, (void *)TIMER_0_BASE, ISR_timer);/中断处理程序,由alt_irq_register 中中断程序名命名 /int flag = 0;void ISR_timer(void *context,alt_u32 id)/unsigned long-alu_u32flag = flag; /实现标志位fla

13、g每次中断翻转一次IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0);/中断的清除/主程序,实现 LED灯的闪烁/int main()while(1)if(flag)LED-DATA = 1; elseLED-DATA = 0;return 0;实验二:PIO 中断功能:在开发试验版上实现外部拨动开关 sw0=1 时每间隔一段时间向 cpu 请求中断,执行中断服务程序,触发 LED 灯不断闪烁。用户编写的系统头文件 sopc.h 如下:* sopc.h* Created on: 2011-7-28* Author: Huanglu*/#ifndef

14、 SOPC_H_ #define SOPC_H_ /新建头文件时自动生成#include system.h /系统配置文件,可以看到各模块以及中断优先级等信息#define _LED /增强代码的严谨性和可控制性#define _KEYtypedef structunsigned long int DATA;unsigned long int DIRECTION;unsigned long int INTERRUPT_MASK;unsigned long int EDGE_CAPTURE;PIO_STR;#ifdef _LED /定义 PIO 口结构体#define LED (PIO_STR

15、*)PIO_LED_BASE) /定义了一个宏,命名为 LED,它是指向 PIO_LED_BASE 的结构体指针.#endif#ifdef _KEY#define KEY (PIO_STR *)KEY_BASE) /同 LED#endif#endif /* SOPC_H_ */ /新建头文件时自动生成用户程序通过外部拨动开关来产生中断。当拨动开关 sw0 高电平时时,就会触发中断。在中断函数中,我们对 key_flag 迕行取反。而在主函数中,我们不断地进行查询,当key_flag 为 1 时, LED-DATA 置 1,也就是让外部发光二级管亮;当 key_flag 为 0 时, LED-DATA 置 0,这时,发光二级管不亮。Sw0 一直为高电平时,执行中断服务时关中断,处理完开中断,sw0 又触发中断,如此往复,实现发光二级管不断闪烁。用户源程序

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号