掌握用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程序(中断向量表),并添
加注释,说明一些关键语句的含义。