一、什么是中断
- 一般中断定义为:打断CPU指令执行顺序的事件,现代CPU框架为了能够及时响应外部或内部一些紧急事件,都有中断机制,并提供一些响应中断、处理中断等的一些中断机制。
- 中断 ==> 打断CPU执行的事件
二、ARM Cortex M4 中断机制
- 当中断控制器通知cpu,产生xx中断啦,这个时候,cpu会停止正在做的事件, 转到中断处理上来。而且,M4给不同的事件(中断),一个唯一的中断编号(为了区分不同的中断事件)。 当不同的中断事件产生时,cpu作不同的处理
- 中断向量表:一个数组。保存不同的中断事件处理函数的地址的数组
“函数指针数组”
中断函数指针类型:typedef void (*pFunc_t)(void);
pFunc_t vectors[N];
vectors[0] = xxx_isr_0;
vectors[1] = xxx_isr_1;
....
vectors[x] = xxx_isr_x;
当中断x产生时,cpu取vectors(中断向量表)的第x个元素去执行:
pFunc_t isr = vectors[x];
(*isr)(); //调用中断x的中断处理函数
约定把:数组vectors放在一个固定的位置(如:地址为0x0000 0000)
这样就可以做到:产生中断后,cpu到指定的地址取中断处理函数的
函数指针,然后去执行。 - 中断处理函数类型:
void xxx_isr(void)
{
}
中断处理函数,一般来说,无参数,无返回值
三、中断函数和普通函数的区别
- 普通函数:用户主动调用的
也可以准备好参数
也可以解析这个返回值 - 中断函数:CPU被动调用,不是用户主动调用,它可以在用户指令的任何时刻去调用(因为中断在任何时刻都可能产生)
传不了参数,也解析不了这个返回值
中断函数无参数,无返回值
eg:评论一下以下代码:__interrupt double compute_area(double redius) { double area = PI * radius *radius; printf("\nArea = %f",area); return area; }
这段代码主要考察对中断的认识,错误比较多
- 中断函数不能有返回值
- 中断函数不能传递参数
- 在许多处理器/编译器中,浮点一般都是不可重入的,有些处理器/编译器需要让额外的存储器入栈,有些处理器/编译器不允许在中断函数中做浮点运算