中断是基于微控制器或微处理器的系统中,衡量系统性能的一个方面,具体指标有响应时间,中断数量;其中,响应时间是比较重要的一个概念,指系统发生中断(起始)到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(中断)
4 16#04 AdEL Address error exception (load or instruction fectch):地址错误,发生在装载或指令预取
5 16#05 AdES Address error exception (store):地址错误,
发生在数据存储
6 16#06 IBE Bus error exception (instruction fetch):总线错 误,发生在指令预取
7 16#07 DBE Bus error exception (data reference: load or store):总线错误,发生在数据引用时,装载或存储
8 16#08 Sys Syscall exception:系统调用
9 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条评论)
登录后参与讨论