实验 2 中断模拟实验
description
Transcript of 实验 2 中断模拟实验
实验 2中断模拟实验
一.试验目的1. 掌握中断的含义和中断响应过程。2. 掌握用 CCS simulator 模拟中断的方法。3. 掌握中断应用程序的编写方法。
摘要 复习 C54x 中断操作 模拟中断的方法 实验内容及步骤
二.试验原理 中断是一些由硬件或软件产生的信号,能使 CPU 暂时停止执行正在执行的程序,转而执行由 DSP 程序开发者编写的中断服务程序 (ISR—— Interrupt Service Routine) C54x 既支持软件中断也支持硬件中断
软件中断,是由指令 (INTR 、 TRAP 、 RESET) 产生的。 硬件中断:
外部中断——通过 DSP 外部中断引脚接收到的片外设备产生的中断( 例如 ADC/DAC 向 DSP 发出的中断 )
片上外设中断—— DSP 片上外设 ( 如定时器、串口、 DMA 等 ) 向CPU 发出的中断
当同一 CPU 时钟周期内有多个硬件中断发生时, CPU 会按照中断优先级对它们进行响应 ! 软件中断无优先级。
可屏蔽和非可屏蔽中断 DSP 的中断可分为两大类:
可屏蔽 (Maskable) 中断:可以通过软件被禁止 / 使能的中断。被禁止掉的中断即使产生, CPU 也不会去响应 !被使能的中断,当它产生时 CPU 就会去响应它 ! 非可屏蔽 (Nonmaskable) 中断:不能被禁止的中断。当这些中断产生时 CPU 会无条件响应 ! C54x 的非可屏蔽中断有:
所有的软件中断 ! 外部中断 NMI (DSP 外部中断引脚 NMI) 复位中断 RS (DSP 外部中断引脚 RS)
CPU 在响应 NMI 中断时,将不能被任何其他中断打断 !包括复位中断 !
IFR
IFR (Interrupt Flag Register) 中断标志寄存器 ( 地址 0x01) 当一个可屏蔽中断产生时, IFR 中相应的中断标志位会被置 1 ,当
CPU 响应该中断后,该标志位才被清除 ! 清除中断标志还可通过:
软件或硬件复位; 向标志位写 1 ; 使用 INTR #K 指令响应该中断15-14 13 12 11 10 9 8 7
ReserveReservedd
DMACDMAC55 DMAC4DMAC4 BXINT1BXINT1
/DMAC3/DMAC3BRINT1BRINT1/DMAC2/DMAC2 HPINTHPINT INT3INT3 TINT1TINT1
/DMAC1/DMAC1
C5402 DSP 的 IFR 寄存器 6 5 4 3 2 1 0
DMAC0DMAC0 BXINT0BXINT0 BRINT0BRINT0 TINT0TINT0 INT2INT2 INT1INT1 INT0INT0
IMR IMR (Interrupt Mask Register) 中断屏蔽寄存器 ( 地址 0x00)
当 ST1 的 INTM 位为 0 时, IMR 可用于禁止和使能可屏蔽中断,向 IMR 中的某个屏蔽位写 1 就能使能相应的可屏蔽中断 !如果写 0 ,则相应的中断被禁止 !
15-14 13 12 11 10 9 8 7
ReserveReservedd
DMACDMAC55 DMAC4DMAC4 BXINT1BXINT1
/DMAC3/DMAC3BRINT1BRINT1/DMAC2/DMAC2 HPINTHPINT INT3INT3 TINT1TINT1
/DMAC1/DMAC1
C5402 DSP 的 IMR 寄存器 6 5 4 3 2 1 0
DMAC0DMAC0 BXINT0BXINT0 BRINT0BRINT0 TINT0TINT0 INT2INT2 INT1INT1 INT0INT0
11
INTM中断模式位,可屏蔽中断的全局开关 !=0 全局开=1 全局关
ST1 :(0x07)
C54x 中断响应流程中断请求产生Request 中断应答Acknowledgment 执行用户编写的 ISR
IMR 屏蔽位 =1 ?
将当前 PC 值压入堆栈
产生应答信号 IACK
可屏蔽中断? 从 ISR 返回时,将先前压入堆栈的 PC 值弹出放入 PC 中
程序继续从被中断处运行
INTM=0 ?Y
N
Y
产生应答信号 IACKINTM 置 1Y
N
N
CPU 如何跳转到 ISR 去执行 ?
中断号
中断名称0 RS1 NMI
… ……
16 INT017 INT118 INT2
… ……
15 - 7
IPTR
中断 INT0 得到应答Acknowledgment PC = (IPTR<<7) + 中断号 ×4 PMST :(0x1D)
… …
程序空间
NOP B _MyInt0isr
NOP NOP
执行 C 函数 MyInt0isr
INT0 的中断向量
中断向量表
中断向量 ( 表 ) 指针
4-word space
4-word space
4-word space
4-word space
4-word space
摘要 复习 C54x 中断操作 模拟中断的方法 实验内容及步骤
Simulator 下模拟中断 编写引脚文件,指示出中断产生的时间! 将引脚文件和相应的中断引脚进行“连接”! 装载并运行程序后, CCS 会根据引脚文件中设置的时间来产生模拟的中断信号!
引脚文件 (.txt) 文件内容 含义100 120 300 分别在第 100 、 120 、 300 个 CPU clock时产生中断100 +20 300 同上,分别在第 100 、 120 、 300 个 CPU clock 时产生中断5 (+10) rpt 3 分别在第 5 、 15 、 25 、 35 个 CPU clock 时产生中断5 (+10 +20) rpt 2 分别在第 5 、 15 、 35 、 45 、 65 个 CPU clock 时产生中断100 (+200) rpt EOS
分别在第 100 、 300 、 500 、 700… 个 CPU clock 时产生中断,无限循环!
引脚文件和中断引脚的“连接” Tools → Pin connect
三.实验内容 在 C54x Device Simulator 模式下,编写引脚文件模拟部中断 0 (INT0) 的产生。 编写程序响应 INT0 中断。
四.实验步骤1. 使用 CCS Setup 添加“ C5402 Device Simulator” 配置到系统中;运行 CCS ,进入 Simulator 工作模式。2. 编写引脚文件 intsim.txt 包含:3. 10000 (+10000) rpt EOS2. 使用 Tools Pin Connect 工具将该引脚文件连接到引脚 INT0 。3. 建立一个 CCS 项目,包含下列文件
main.c 使能并打开中断 isr.c 中断服务函数 vectors.asm 中断向量表 linker.cmd 链接器命令文件
实验环境建立
#include <stdio.h>
#define IMR *(unsigned int *)0x0000#define IFR *(unsigned int *)0x0001#define ST1 *(unsigned int *)0x0007#define PMST *(unsigned int *)0x001D
int INTtimes;void main(){
asm(" SSBX INTM");PMST = 0x00A0;IFR = 0xFFFF;IMR = 0x0001;asm(" RSBX INTM");puts("interrupt enabled !");
INTtimes = 0;while(1) {
asm(" RSBX INTM");}
}
main.c
#include <stdio.h>
extern int INTtimes;
interrupt void myisr(){
printf("%d\n", ++INTtimes);}
isr.c
.sect ".vectors"
.ref _myisr .align 0x80
Unused .space 16*4*16
int0: B _myisr NOP NOP NOPint1: RETE NOP NOP NOPint2: RETE NOP NOP NOP
.end
vectors.asm
-lrts.lib-stack 0x400-heap 0x400MEMORY{
PAGE 0: VECT: o=0x0080, l=0x0080SRAM: o=0x4000, l=0x3000
PAGE 1: REVS: o=0x1000, l=0x0400STACK: o=0x1400, l=0x0400IDRAM: o=0x1800, l=0x2800
}SECTIONS{
.vectors: > VECT
.text: > SRAM
.cinit: > SRAM
.stack: > STACK
.bss: > IDRAM
.const: > IDRAM
.cio: > IDRAM
.sysmem > IDRAM}
linker.cmd
实验内容和步骤4. 构建可执行模块。5. 装载并运行后观察结果。6. 修改程序,使其响应 INT1 中断。7. 重新构建、装载并运行后观察结果。
实验报告要求1. 中断发生时程序是如何转移到 ISR 的 ?2. 如何编程实现对中断的响应 ?3. 附 .c 程序和 .asm 程序 ( 中断向量表 ) ,并添加注释,说明一些关键语句的含义。