原创 PIC32中断原理之浅析

2010-1-21 10:27 6346 6 6 分类: MCU/ 嵌入式
    中断是基于微控制器或微处理器的系统中,衡量系统性能的一个方面,具体指标有响应时间,中断数量;其中,响应时间是比较重要的一个概念,指系统发生中断(起始)到cpu开始处理中断的时间。因为cpu要保存/恢复上下文环境,保存/恢复时间是处理中断过程中的另外一个参量。在pic32单片机中,mips32内核采用了寄存器shadow与向量中断方式,保证了cpu响应的快速性,在pic32架构中,响应时间非常短,几乎固定为3到4指令周期;在其他32位架构的中断机制中,共同点是缓存、总线不确定仲裁模块会影响到整个的响应时间,因此增加了响应时间的不确定性。
    在pic32单片机中,中断的出现是以最终结果-exception表现出来的,停止cpu执行当前任务的有两种情况:error和exception。
    error往往是由reset、soft reset、NMI reset以及cache error引起的,error产生后,系统会产生复位。cp0协处理器寄存器Status中ERL位置位。
    exception发生的原因则有多种,协处理器cp0寄存器Cause中提供exception的缘由。
代码值  十六进制 记忆码 详细描述
0   16#00   Int  Interrupt(中断)
16#04   AdEL  Address error exception (load or instruction                                     fectch):地址错误,发生在装载或指令预取
16#05   AdES  Address error exception (store):地址错误,
                        发生在数据存储
16#06   IBE  Bus error exception (instruction fetch):总线错                                   误,发生在指令预取
16#07   DBE  Bus error exception (data reference: load or                                     store):总线错误,发生在数据引用时,装载或存储
16#08   Sys  Syscall exception:系统调用
16#09   Bp  Breakpoint exception:断点位置
10  16#0a   RI  Reserved instruction exception:保留指令异常
11  16#0b   CPU  Coprocessor Unusable exception:协处理器不可用
12  16#0c   Ov  Arithmetic Overflow exception:计算溢出异常
13  16#0d   Tr  Trap exception:陷阱异常
14-18  16#0e-  16#12 – Reserved
    发生exception后,cpu根据Cause寄存器中的IV标志判断为是中断还是异常,并自动跳转到exception(0x180)或interrupt(0x200)入口处执行中断处理(Status寄存器BEV位为0)。若cp0中Status寄存器BEV位为1,发生异常(pic32不支持BEV位为1时产生中断)时,cpu执行bootstrap exception处理程序。
   系统复位时,BEV位置0;
   pic32的集成开发环境提供了基本的库函数,如_bootstrap_exception_handler, _general_exception_handler, 其中前者执行引导异常错误的简单处理,后者执行通常异常错误的处理。开发指令才能清除者可以对二者重新定义,以此替换该库函数。处理函数必须调用eret才能清除异常标志或erl标志。
   对于中断函数的声明则与通常的c语言开发相同。具体形式有两种:
第一种  #pragma interrupt foo ipl4 vector vect_num
        void foo (void)
第二种
        void __attribute__ ((interrupt(ipl4)),((at_vector(vect_num)))) foo (void)
    以上中断函数声明了优先级为4,中断向量号为vect_num的中断处理函数
    对于中断的处理,可以设定位单向量入口处理与多向量入口处理两种方式。在硬件实现上,单向量其实是多向量的一种极化形式;通过设定INTCON寄存器中的MVEC位可以实现两种方式的切换。单向量模式下,中断控制器提供给cpu的Vector数永远是0;多向量模式下,Vector值就是中断源的向量。显然,在单向量模式下,程序设计者要考虑区分究竟是那个源产生中断的问题,这个可以通过查询中断标志位进行判断;这将带来软件判断造成的延迟问题。而在多向量模式下,cpu会计算出跳转目标位置,相应的简化了程序设计,提高了程序的可观性。
    多向量模式下,同样存在软件延迟的问题。上下文环境的保存/恢复是客观存在的,大量寄存器的入栈与出栈造成了不可避免的延迟。与arm内核相比,该寄存器值的保护机制较不利于频繁发生中断的应用。为了减少这种开销,mips32内核引入了寄存器shadow的概念,即组优先级别为7(最高级)的中断与一组潜在的寄存器组(寻址同正常寄存器)绑定的方法,这样硬件寄存器的冗余可以减少软件延迟时间。寄存器的入栈和出栈过程有两个术语与其相对应,prologue与endlogue。通常编译器会自动生成prologue与endlogue。

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条