220 likes | 405 Views
实验 2 中断模拟实验. 试验目的. 掌握中断的含义和中断响应过程。 掌握用 CCS simulator 模拟中断的方法。 掌握中断应用程序的编写方法。. 摘要. 复习 C54x 中断操作 模拟中断的方法 实验内容及步骤. 试验原理. 中断是一些由硬件或软件产生的信号,能使 CPU 暂时停止执行正在执行的程序,转而执行由 DSP 程序开发者编写的中断服务程序 (ISR—— Interrupt Service Routine) C54x 既支持软件中断也支持硬件中断 软件中断,是由指令 (INTR 、 TRAP 、 RESET) 产生的。 硬件中断:
E N D
试验目的 • 掌握中断的含义和中断响应过程。 • 掌握用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指令响应该中断 C5402 DSP 的 IFR 寄存器
IMR • IMR (Interrupt Mask Register) 中断屏蔽寄存器 (地址0x00) • 当 ST1 的 INTM 位为 0 时,IMR 可用于禁止和使能可屏蔽中断,向 IMR 中的某个屏蔽位写 1 就能使能相应的可屏蔽中断 !如果写 0,则相应的中断被禁止 ! ST1: (0x07) C5402 DSP 的 IMR 寄存器
Y 可屏蔽中断? N INTM=0 ? N Y N Y 产生应答信号 IACK INTM置1 C54x 中断响应流程 中断请求产生 Request 中断应答 Acknowledgment 执行用户编写的ISR 从ISR返回时,将先前 压入堆栈的 PC 值 弹出放入PC 中 IMR屏蔽位=1? 产生应答信号 IACK 将当前PC值压入堆栈 程序继续从被中断处 运行
PC = (IPTR<<7) + 中断号×4 … … 程序空间 4-word space CPU 如何跳转到 ISR 去执行 ? 中断 INT0 得到应答 Acknowledgment 执行 C 函数 MyInt0isr PMST: (0x1D) 中断向量(表)指针 中断向量表 4-word space B _MyInt0isr NOP 4-word space INT0的 中断向量 NOP 4-word space NOP 4-word space
摘要 • 复习C54x中断操作 • 模拟中断的方法 • 实验内容及步骤
Simulator 下模拟中断 • 编写引脚文件,指示出中断产生的时间! • 将引脚文件和相应的中断引脚进行“连接”! • 装载并运行程序后,CCS会根据引脚文件中设置的时间来产生模拟的中断信号!
引脚文件和中断引脚的“连接” • Tools → Pin connect
实验内容 • 在C54x Device Simulator模式下,编写引脚文件模拟部中断0 (INT0) 的产生。 • 编写程序响应 INT0 中断。
实验步骤 • 使用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 链接器命令文件
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) { asm(" RSBX INTM"); } }
isr.c #include <stdio.h> extern int INTtimes; interrupt void myisr() { printf("%d\n", ++INTtimes); }
vectors.asm .sect ".vectors" .ref _myisr .align 0x80 Unused .space 16*4*16 int0: B _myisr NOP NOP NOP int1: RETE NOP NOP NOP int2: RETE NOP NOP NOP .end
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 }
实验内容和步骤 • 构建可执行模块。 • 装载并运行后观察结果。 • 修改程序,使其响应INT1中断。 • 重新构建、装载并运行后观察结果。
实验报告要求 • 中断发生时程序是如何转移到ISR的? • 如何编程实现对中断的响应 ? • 附.c程序和.asm程序(中断向量表),并添加注释,说明一些关键语句的含义。