掌握用CCS simulator模拟中断的方法。
Download
Report
Transcript 掌握用CCS simulator模拟中断的方法。
实验2
中断模拟实验
一.试验目的
1.
2.
3.
掌握中断的含义和中断响应过程。
掌握用CCS simulator模拟中断的方法。
掌握中断应用程序的编写方法。
摘要
复习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
Reserved
DMAC5
DMAC4
BXINT1
/DMAC3
BRINT1
/DMAC2
HPINT
INT3
TINT1
/DMAC1
C5402 DSP 的 IFR 寄存器
6
5
4
3
2
1
0
DMAC0
BXINT0
BRINT0
TINT0
INT2
INT1
INT0
IMR
IMR (Interrupt Mask Register) 中断屏蔽寄存器 (地址0x00)
当 ST1 的 INTM 位为 0 时,IMR 可用于禁止和使能可屏蔽中断,
向 IMR 中的某个屏蔽位写 1 就能使能相应的可屏蔽中断 !如果
写 0,则相应的中断被禁止 !
11
ST1:
INTM
(0x07)
中断模式位,可屏蔽中断的全局开关 !
=0
全局开
=1
全局关
15-14
13
12
11
10
9
8
7
Reserved
DMAC5
DMAC4
BXINT1
/DMAC3
BRINT1
/DMAC2
HPINT
INT3
TINT1
/DMAC1
C5402 DSP 的 IMR 寄存器
6
5
4
3
2
1
0
DMAC0
BXINT0
BRINT0
TINT0
INT2
INT1
INT0
C54x 中断响应流程
中断请求产生
Request
中断应答
Acknowledgment
Y
N
INTM=0 ?
可屏蔽中断?
N
执行用户编写的ISR
从ISR返回时,将先前
压入堆栈的 PC 值
弹出放入PC 中
Y
N
IMR屏蔽位=1?
Y
产生应答信号 IACK
INTM置1
产生应答信号 IACK
将当前PC值压入堆栈
程序继续从被中断处
运行
CPU 如何跳转到 ISR 去执行 ?
中断 INT0 得到应答
Acknowledgment
PMST:
15 - 7
(0x1D)
IPTR
PC = (IPTR<<7) + 中断号×4
执行 C 函数
MyInt0isr
中断向量(表)指针
中断
号
中断
名称
程序空间
0
RS
4-word space
1
NMI
4-word space
…
…
INT0
4-word space
17
INT1
4-word space
18
INT2
4-word space
…
…
…
16
中断向量表
B _MyInt0isr
NOP
NOP
NOP
INT0的
中断向量
…
摘要
复习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.
2.
3.
2.
3.
使用CCS Setup添加“C5402 Device Simulator”配置
到系统中;运行CCS,进入Simulator工作模式。
编写引脚文件 intsim.txt 包含:
10000 (+10000) rpt EOS
使用 Tools Pin Connect 工具将该引脚文件连接到引
脚 INT0。
建立一个CCS项目,包含下列文件
main.c
isr.c
vectors.asm
linker.cmd
使能并打开中断
中断服务函数
中断向量表
链接器命令文件
实验环境建立
#include <stdio.h>
#define
#define
#define
#define
IMR
IFR
ST1
PMST
*(unsigned
*(unsigned
*(unsigned
*(unsigned
main.c
int
int
int
int
*)0x0000
*)0x0001
*)0x0007
*)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");
}
}
#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:
int1:
int2:
B _myisr
NOP
NOP
NOP
RETE
NOP
NOP
NOP
RETE
NOP
NOP
NOP
.end
vectors.asm
-lrts.lib
-stack 0x400
-heap 0x400
MEMORY
{
PAGE 0: VECT:
SRAM:
linker.cmd
o=0x0080,
o=0x4000,
l=0x0080
l=0x3000
PAGE 1: REVS: o=0x1000,
STACK: o=0x1400,
IDRAM: o=0x1800,
l=0x0400
l=0x0400
l=0x2800
}
SECTIONS
{
.vectors:
.text:
.cinit:
.stack:
.bss:
.const:
.cio:
.sysmem
}
>
>
>
>
>
>
>
>
VECT
SRAM
SRAM
STACK
IDRAM
IDRAM
IDRAM
IDRAM
实验内容和步骤
4.
5.
6.
7.
构建可执行模块。
装载并运行后观察结果。
修改程序,使其响应INT1中断。
重新构建、装载并运行后观察结果。
实验报告要求
1.
2.
3.
中断发生时程序是如何转移到ISR的?
如何编程实现对中断的响应 ?
附.c程序和.asm程序(中断向量表),并添
加注释,说明一些关键语句的含义。