Presentation is loading. Please wait.

Presentation is loading. Please wait.

实验2 中断模拟实验.

Similar presentations


Presentation on theme: "实验2 中断模拟实验."— Presentation transcript:

1 实验2 中断模拟实验

2 试验目的 掌握中断的含义和中断响应过程。 掌握用CCS simulator模拟中断的方法。 掌握中断应用程序的编写方法。

3 摘要 复习C54x中断操作 模拟中断的方法 实验内容及步骤

4 试验原理 中断是一些由硬件或软件产生的信号,能使CPU暂时停止执行正在执行的程序,转而执行由DSP程序开发者编写的中断服务程序(ISR—— Interrupt Service Routine) C54x既支持软件中断也支持硬件中断 软件中断,是由指令 (INTR、TRAP、RESET) 产生的。 硬件中断: 外部中断——通过DSP外部中断引脚接收到的片外设备产生的中断(例如ADC/DAC向DSP发出的中断) 片上外设中断——DSP片上外设 (如定时器、串口、DMA等) 向CPU发出的中断 当同一CPU时钟周期内有多个硬件中断发生时,CPU会按照中断优先级对它们进行响应 ! 软件中断无优先级。

5 可屏蔽和非可屏蔽中断 DSP的中断可分为两大类:
可屏蔽 (Maskable) 中断:可以通过软件被禁止/使能的中断。被禁止掉的中断即使产生,CPU 也不会去响应 !被使能的中断,当它产生时 CPU 就会去响应它 ! 非可屏蔽 (Nonmaskable) 中断:不能被禁止的中断。当这些中断产生时 CPU 会无条件响应 !C54x 的非可屏蔽中断有: 所有的软件中断 ! 外部中断 NMI (DSP外部中断引脚NMI) 复位中断 RS (DSP外部中断引脚RS) CPU在响应 NMI 中断时,将不能被任何其他中断打断 !包括复位中断 !

6 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 6 5 4 3 2 1 DMAC0 BXINT0 BRINT0 TINT0 INT2 INT1 INT0 C5402 DSP 的 IFR 寄存器

7 IMR IMR (Interrupt Mask Register) 中断屏蔽寄存器 (地址0x00)
当 ST1 的 INTM 位为 0 时,IMR 可用于禁止和使能可屏蔽中断,向 IMR 中的某个屏蔽位写 1 就能使能相应的可屏蔽中断 !如果写 0,则相应的中断被禁止 ! 11 INTM 中断模式位,可屏蔽中断的全局开关 ! =0 全局开 =1 全局关 ST1: (0x07) 15-14 13 12 11 10 9 8 7 Reserved DMAC5 DMAC4 BXINT1 /DMAC3 BRINT1 /DMAC2 HPINT INT3 TINT1 /DMAC1 6 5 4 3 2 1 DMAC0 BXINT0 BRINT0 TINT0 INT2 INT1 INT0 C5402 DSP 的 IMR 寄存器

8 C54x 中断响应流程 中断请求产生 Request 中断应答 Acknowledgment 执行用户编写的ISR Y N N Y N Y
可屏蔽中断? INTM=0 ? Y 从ISR返回时,将先前 压入堆栈的 PC 值 弹出放入PC 中 N N Y N IMR屏蔽位=1? 产生应答信号 IACK INTM置1 Y 产生应答信号 IACK 将当前PC值压入堆栈 程序继续从被中断处 运行

9 PC = (IPTR<<7) + 中断号×4
CPU 如何跳转到 ISR 去执行 ? 中断 INT0 得到应答 Acknowledgment PC = (IPTR<<7) + 中断号×4 执行 C 函数 MyInt0isr PMST: (0x1D) 15 - 7 IPTR 中断向量(表)指针 … … 程序空间 中断向量表 中断 中断名称 RS 1 NMI 16 INT0 17 INT1 18 INT2 4-word space 4-word space B _MyInt0isr NOP 4-word space INT0的 中断向量 NOP 4-word space NOP 4-word space

10 摘要 复习C54x中断操作 模拟中断的方法 实验内容及步骤

11 Simulator 下模拟中断 编写引脚文件,指示出中断产生的时间! 将引脚文件和相应的中断引脚进行“连接”!
装载并运行程序后,CCS会根据引脚文件中设置的时间来产生模拟的中断信号!

12 引脚文件(.txt) 文件内容 含义 100 120 300 分别在第 100、120、300 个CPU clock时产生中断
分别在第 100、120、300 个CPU clock时产生中断 同上,分别在第 100、120、300 个CPU clock时产生中断 5 (+10) rpt 3 分别在第 5、15、25、35 个CPU clock时产生中断 5 ( ) rpt 2 分别在第 5、15、35、45、65 个CPU clock时产生中断 100 (+200) rpt EOS 分别在第 100、300、500、700… 个CPU clock时产生中断,无限循环!

13 引脚文件和中断引脚的“连接” Tools → Pin connect

14 实验内容 在C54x Device Simulator模式下,编写引脚文件模拟部中断0 (INT0) 的产生。

15 实验步骤 使用CCS Setup添加“C5402 Device Simulator”配置到系统中;运行CCS,进入Simulator工作模式。 编写引脚文件 intsim.txt 包含: (+10000) rpt EOS 使用 Tools Pin Connect 工具将该引脚文件连接到引脚 INT0。 建立一个CCS项目,包含下列文件 main.c 使能并打开中断 isr.c 中断服务函数 vectors.asm 中断向量表 linker.cmd 链接器命令文件

16 实验环境建立

17 main.c #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) { }

18 isr.c #include <stdio.h> extern int INTtimes;
interrupt void myisr() { printf("%d\n", ++INTtimes); }

19 vectors.asm .sect ".vectors" .ref _myisr .align 0x80
Unused .space 16*4*16 int0: B _myisr NOP int1: RETE int2: RETE .end

20 linker.cmd -lrts.lib -stack 0x400 -heap 0x400 MEMORY {
PAGE 0: VECT: o=0x0080, l=0x0080 SRAM: o=0x4000, l=0x3000 PAGE 1: REVS: o=0x1000, l=0x0400 STACK: o=0x1400, l=0x0400 IDRAM: o=0x1800, l=0x2800 } SECTIONS .vectors: > VECT .text: > SRAM .cinit: > SRAM .stack: > STACK .bss: > IDRAM .const: > IDRAM .cio: > IDRAM .sysmem > IDRAM

21 实验内容和步骤 构建可执行模块。 装载并运行后观察结果。 修改程序,使其响应INT1中断。 重新构建、装载并运行后观察结果。

22 实验报告要求 中断发生时程序是如何转移到ISR的? 如何编程实现对中断的响应 ?
附.c程序和.asm程序(中断向量表),并添加注释,说明一些关键语句的含义。


Download ppt "实验2 中断模拟实验."

Similar presentations


Ads by Google