请教关于中断的问题!
本帖最后由 梦境缠绕 于 2011-3-24 17:08 编辑请教……请问中断到底是个什么东西?处理中断的流程~关键是中断的作用?
请尽量简洁易懂一些,学习时应该注意的是什么……手里面资料有不少,但是……看不懂啊! LZ学过51么??? 没有学过;但是现在必须直接用DSP……所以现在很头大! 那痛苦了,实话,DSP比51麻烦的多了 本帖最后由 aresc 于 2011-3-25 23:15 编辑
中断是什么? 一种让CPU快速响应特定任务的机制,包括相应的硬件和软件.
首先产生中断信号(比如通过某个CPU引脚的电平由低(0)到高(1)的变化, 从而触发对应的中断)
然后中断控制器负责接收这些中断信号,再按照已经预设好的中断优先级通知CPU中断当前程序的运行(一般是主程序),转而去执行对应的中断服务程序,当中断服务程序执行完后,CPU会回到主程序被中断的那个地方继续运行(复位中断例外,CPU不会返回到进入中断前的状态)
中断优先级: 比如两个中断信号A,B同时产生时,中断控制器会先执行优先级高的那一个,中断优先级低的会暂时挂起,等高优先级的执行完再执行低优先级的.
中断嵌套: 比如在一个低优先级的中断程序运行还没结束时,有一个高优先级的中断产生了,如果CPU支持中断嵌套的话,那低优先级的中断就会被挂起,CPU会去执行高优先级的中断程序,高优先级执行完后再恢复低优先级中断的运行.
中断向量表: 用于CPU跳转到不同中断程序入口的指令集. 一般每个入口占用4个指令字,假设一个CPU只有三个中断,其中断程序起始地址分别为A, B, C. 则中断向量表的指令类似(可能不同CPU有些差别,但肯定都是让PC指针跳转到对应中断程序的起始地址):
JMP A; // 一般第一个都是复位中断程序入口.
nop;
nop;
nop;
JMP B;
nop;
nop;
nop;
JMP C;
nop;
nop;
nop;
中断向量表一般放在一个固定的内存地址处比如0(也可能是其他值), CPU复位中断后就会从0地址开始运行,用上表的例子,那么0地址就是一个JMP A指令, CPU直接跳到复位程序入口A开始执行.
中断服务程序: 如果用汇编写,那么所有中断里使用的寄存器都应该先保护,退出中断前要恢复这些寄存器的值;可能还包括使用的公共变量. 用C的话,好像有interrupt之类的关键字,编译器估计自己搞定. 本帖最后由 aresc 于 2011-3-25 23:49 编辑
可屏蔽中断: CPU可以把某些中断屏蔽掉而不去响应它,一般都有个中断屏蔽寄存器IMR, 里面的每个位对应一个可屏蔽中断,比如CPU给某个位写0,就不会响应改位对应的中断处理;反之写1就可以响应该位对应的中断.
不可屏蔽中断: 一般就是复位中断,CPU必须响应的.
从汇编语言角度看中断的软件处理(C语言最终还是被编译器转成汇编了). 假如如下的一段程序:
地址 指令
............
0x4000 move d1,d2;
0x4001 add d2,d3;
0x4002 mul d1,d2,d0;
0x4003 jmp 0x4000;
0x4004 nop;
0x4005 nop;
0x4006 moved2,d4;
............
假如当CPU的运行到地址0x4001(PC=0x4001),有一个中断来了,那么硬件会自动将下一条指令的地址0x4002压栈, 然后PC跳到中断向量表的该中断对应的地址,然后通过执行中断向量表的那个JMP跳转到对应的中断服务程序里. 中断服务程序运行完退出时会有弹栈的动作将PC重新恢复为0x4002,CPU就恢复从中断的地方接着运行了.
压栈的地方有个特殊的就是有些指令不是单周期的,比如TI-DSP C5x的跳转指令B都是3个周期的且不会被中断的,比如:
.....
1: B #Lable;
2: NOP;
3: NOP;
.....
假如在1:处有中断产生,CPU也必须先执行完这3条指令才能在#Lable处去响应中断. 上面说的是51的,那dsp的也一样吗 我学过51,可是dsp完全不懂啊,好难 我没用过51,所有的处理器的中断都和这个大同小异.
页:
[1]