软核处理器Nios系统中断实现机制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如果 IE 位为 1 且此中断具有较高优先级(其中断号比 STATUS 寄存器中 IPRI 域的当前值 要小), Nios CPU 处理所指示的中断.非屏蔽中断,其中断优先级为 0,无论 IE 的值是什么,CPU 都要处理此中 断.由 irq_number 输入决定将控制传送给哪个中断号所对应的中断处理程序.
为了能对系统所发生的中断进行处理,系统需先建立中断向量表,中断向量表中包含了所有中断服 务程序 ISR 的首地址,按 ISR 地址的顺序列表,其中断号为表的索引.中断发生前,程序在主程序存储器 中正常执行,当中断发生时,CPU 暂停当前程序的运行,而去响应中断.Nios 系统进行中断处理的序列如 下:
22 浙江万里学院学报
2004 年 4 月
(1) STATUS 寄存器的内容拷贝到 ISTATUS 寄存器中;(2) CWP 减 1,打开一个新的窗口供中断处 理程序使用;(3) IE 置 0,禁止中断;(4) IPRI 用 6 位中断号设置;(5) 将被中断程序中的下一条非执 行指令的地址传送到%O7 中;(6) 中断处理程序的启动地址从中断向量表中取出并写入到 PC 中;(7) 中 断处理完成后,执行一条 TRET 将控制返回给被中断的程序.
通过执行一条 TRAP 指令,软件可直接请求将控制传送到中断处理程序.指令的 IMM6 字段给出中断 号.无论 IE 或 IPRI 位设置成什么,都要处理 TRAP 指令.TRAP 指令其后的指令地址存储在%o7 寄存器 中,执行一条 TRET 指令后控制自动返回 TRAP 后的指令.
3 Nios 系统中断实现流程
明 Nios CPU irq 输入脚为 1.一般系统中,Nios CPU 的 irq 和 irq_number 输入是由互联(总线)逻辑自动产 生的,因此,系统设备一般都有一个 irq 输出.自动产生的总线逻辑将多个 1 位 irq 源转换成一个 irq 输入 给 CPU,相应的有一个 6 位的中断号 irq_number.
计算机系统中中断的实现一般包括中断向量表的设置及中断处理过程.在大多数单片机系统中,中断 向量表的地址通常都由系统确定,用户只需将相应的中断服务程序入口地址填入指定的向量表,即由系 统自动装载中断向量表.而 Nios 系统是用户可配置系统,其存储空间和中断号都可由用户设置,因此其中 断向量表也由用户配置,用户需编程装载相应的中断服务程序入口地址. 3.1 中断向量表
为使 C 语言编程能方便进行中断处理,编制一个子程序 nr_installuserisr(),用来载入一个中断服务程 序 ISR,该子程序需传递三个变量:中断号、ISR 地址和一个上下文变量,上下文变量参数可以是任意值. 其原型为:Void nr_installuserisr(int trapnumber,void *nios_isrhandleproc,int context).主要完成将 ISR 的首地 址存入中断向量表中,在调用 ISR 之前,将 global 寄存器的内容、中断返回地址、ISTATUS 寄存器内容 等压入堆栈中进行保存,ISR 完成后,恢复堆栈中保存的内容,并返回到被中断程序断点处继续执行.
殷伟凤,李国胜
(浙江万里学院,宁波 315101)
摘 要:文章介绍了 Nios 系统的中断实现机制,并给出了实现中断处理的实例.
关 键 词:Nios;可编程单片系统(SoPC);中断;中断服务程序(ISR) 中图分类号:TP303 文献标识码:A 文章编号:1671-2250(2004)02-0020-03 收 稿 日 期:2003-01-09 作 者 简 介:殷伟凤,浙江万里学院计算机与信息学院高级工程师;李国胜,浙江万里学院电子信息学院助教.
asm(“PFX 9”)和 asm(“WRCTL %g0”). 在嵌入式系统中,一般都有键盘操作,通过 PIO(并行输入输出)连接.键盘操作通常采用中断方式实
现.
下面给出一个 Nios 实现键盘中断的实例框架,主程序通过 LCD 显示系统相应信息,当有键盘中断
时,在 LCD 中显示当前时间,其中 LCD 的显示程序从略.
第 17 卷 第 2 期
浙江万里学院学报 Vol.17 No.2
2004 年 4 月 Journal of Zhejiang Wanli University
Dec. 2004
软核处理器 Nios 系统中断实现机制
Nios 的 irq 输入是电平敏感量,irq 和 irq_number 输入在每个时钟的上升沿取样.产生中断的外部源将 输出 irq 信号,以通知软件中断到达,然后由 Nios CPU 进行处理. 2.2 内部中断源
Nios 系统中有两个内部中断源:寄存器窗口上溢和寄存器窗口下溢.每次处理器执行一条 SAVE 或 RESTORE 指令时,都要比较 CWP 和 WVALID 寄存器的值,如果新的 CWP 值大于 HI_LIMIT 或小于 LO_LIMIT ,处理器产生一个内部中断.当使用最低有效寄存器窗口时(CWP=LO_LIMIT)并执行了一条 SAVE 指令,即 CWP<LO_LIMIT,处理器产生中断 1,即寄存器窗口下溢.当使用最高有效寄存器窗口时 (CWP=HI_LIMIT)并执行一条 RESTORE 指令,即 CWP>HI_LIMIT,处理器产生中断 2,即寄存器窗口 上溢.寄存器窗口溢出中断仅由 SAVE 指令或 RESTORE 指令产生,直接写一个小于 LO_LIMIT 或大于 HI_LIMIT 的值到 CWP(通过一条 WRCTL 指令)不会引起寄存器窗口溢出中断 .当 CWP 已经低于 LO_LIMIT 时执行 SAVE 指令或大于 HI_LIMIT 时执行 RESTORE 指令不会引起寄存器窗口溢出中断. 2.3 直接软件中断(TRAP 指令)
STATUS(%ctl0)是状态寄存器,第 4~8 位是 CWP 字段,第 9~14 位是 IPRI 字段,第 15 位是 IE 位. 其中 IE 位是中断使能位,IE=1 时,使能外部和内部中断.IE=0 时,禁止外部和内部中断.软件 TRAP 不受 IE 位影响.当 CPU 复位时,IE 位置 0(中断禁止).可用写 SET_IE(%ctl9)和 CLR_IE(%ctl8)控制寄存器来直 接设置 IE 位而不影响 STATUS 寄存器的其它位.IPRI 字段包含了当前运行的中断优先级,进行中断处理 时,IPRI 设置成中断号,对于外部硬件中断,IPRI 值直接由 6 位硬件中断号设置,对于 TRAP 指令, IPRI 字段直接由指令的 IMM6 字段设置.而对于内部中断,IPRI 字段由预定义的 6 位中断号设置.CPU 复 位时,IPRI 置成 63.CWP 是当前窗口指针,指向通用寄存器文件滑动寄存器窗口的基地址,执行 SAVE 指令,CWP 增 1,寄存器窗口向上移 16 个寄存器,执行 RESTORE 指令,CWP 减 1,寄存器窗口向下移 16 个寄存器.ISTATUS 是 STATUS 寄存器的备份,处理中断时,STATUS 寄存器的值拷贝到 ISTATUS 寄 存器中,当控制返回到被中断程序时,TRET 指令自动将 ISTATUS 寄存器拷回到 STATUS,以恢复中断 前 STATUS 的值.
1 Nios 系统中与中断有关的寄存器
Nios 系统的中断类型及其中断实现机制都涉及到 Nios 处理器的通用寄存器及某些控制寄存器,Nios CPU 体系结构有一个庞大的通用寄存器文件、几个机器控制寄存器、一个程序计数器和用于指令前缀的 K 寄存器.在 32 位 Nios CPU 中通用寄存器的宽度为 32 位,寄存器文件大小可配置成 128、256 或 512 个 通用寄存器,其中 32 个寄存器分成一组,构成一个寄存器窗口,各寄存器命名为%r0~%r31 或称为%g0~ %g7 (global 寄存器,对应%r0~%r7)、%o0~%o7(out 寄存器,对应%r8~%r15)、 %l0~%l7(local 寄存器, 对应%r16~%r23)、 %i0~%i7(in 寄存器,对应%r24~%r32).在整个寄存器文件中,在某个特定时刻只有 其中一个寄存器窗口对软件是可见的,根据 Nios STATUS 寄存器中当前窗口指针(CWP)(%ctl0,可通过 RDCTL 指令读出)来决定.
Nios 是 Altera 公司的软核嵌入式处理器,是一种可配置的通用的 RISC 处理器,它可嵌入到 SoPC(可 编程单片系统)中,与各种各样的外设、定制指令和硬件加速单元相结合,构成一个功能强大的嵌入式系 统.大部分嵌入式系统都具有中断服务程序,以便及时处理外部硬件中断.不同的 CPU 体系结构,其中断 实现机制也有所不同.
while(nr_uart_rxchar(0) != 27)
// 循环 显示程序

…}
return 0;
}
int main(void) {
//头文件说明
nr_pio_lcdinit(na_lcd_pio);
#include <stdio.h>
#include "pio_lcd16207.h" #include "nios.h" //定义 PIO 口相关地址及寄存器 // 中断服务程序原型声明
void MyPIO_ISR(int context); // 主程序
3.3 中断实现实例
在用 SoPC Builder 构建 Nios 系统时,可配置中断向量表的位置,并在加入外部设备时,分配一个中
断号,用户可修改此中断号.相应的信息会在 excalibur.h 头文件中说明.软件实现时,在主程序中首先要
调用 nr_installuserisr()将中断服务程序 ISR 载入中断向量表中,ISR 代码必须清除中断源,清除它所服务 的外设所有中断条件.中断在将控制传送到 ISR 之前自动打开中断,若想禁止中断,可在 ISR 中插入汇编 代码 asm(“PFX 8”)和 asm(“WRCTL %g0”).若禁止中断后想打开中断,在 ISR 中插入汇编代码
中断向量表是 64 个中断处理程序地址的集合,对于 32 位 Nios 处理器,每个入口 是 4 个字节.根据 目标系统的硬件存储映射,中断向量表可驻留在 RAM 或 ROM 中,其中断向量表的基地址(VECBASE)是 可配置的.对系统中的每个 Nios CPU,可在 SoPC Builder 中的 More<CPU name>Settting 项中指定中断向 量表的位置.中断的 IRQ 号决定其优先级及在中断向量表的位置.最高优先级是 0,最低优先级是 63.如中 断 25 是在地址 VECBASE+(25×4)处.该中断的优先级高于中断 26 到 63 的优先级.当 Nios CPU 处理中断 号 n 时,从中断向量表中取出第 n 个入口,将取出的值乘 2,并将结果装入程序计数器(PC)中.中断向量 表中中断 0~15 是为内部中断预留:_start 子程序使用中断 0;中断 1 是寄存器窗口下溢中断;中断 2 是 寄存器窗口上溢中断;GNUpro 调试器使用中断 3~5 ;中断 6~15 为将来使用预留. 3.2 中断实现机制及处理过程
2 Nios 系统的中断类型
在 Nios 系统中有三个中断源:硬件中断、内部中断或软件 TRAP 指令.
第 2 期 殷伟凤、李国胜:软核处理器 Nios 系统中断实现机制
21
2.1 外部硬件中断源 外部源可通过驱动 NIOS CPU 上的一个 6 位编码的中断号 irq_number 输入来请求硬件中断,同时声
相关文档
最新文档