一、什么是中断

  • 一般中断定义为:打断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;
    }

    这段代码主要考察对中断的认识,错误比较多

 

  1. 中断函数不能有返回值
  2. 中断函数不能传递参数
  3. 在许多处理器/编译器中,浮点一般都是不可重入的,有些处理器/编译器需要让额外的存储器入栈,有些处理器/编译器不允许在中断函数中做浮点运算